- 博客(63)
- 资源 (11)
- 问答 (1)
- 收藏
- 关注
原创 Effective-Java读书笔记09 Always override hashCode when you override equals 重写equals方法时一定要重写hashCode方法
重写equals方法时一定要重写hashCode方法
2022-12-21 10:26:20
253
原创 Effective-Java读书笔记08 Obey the general contract when overriding equals 重写equals方式时需要遵守通用规则
Obey the general contract when overriding equals 重写equals方式时需要遵守通用规则
2022-09-09 10:03:31
276
原创 Effective-Java读书笔记07 Avoid finalizers 避免使用finalizers
07 Avoid finalizers 避免使用finalizers这里说的finalizers指的是Object类提供的finalize()方法, 该方法默认是一个空方法, 作者不建议我们重写使用该方法.protected void finalize() throws Throwable { }对于C++程序员来说, 可能会把finalize()方法当作析构函数来释放资源. 但是在Java语言中通常是垃圾回收器来释放资源, 不需要程序员关心相关的操作.总而言之, finalizers不会保证一定
2022-05-22 11:28:00
208
原创 Effective-Java读书笔记06 Eliminate obsolete object references 删除无用的对象引用
Effective Java 06 Eliminate obsolete object references 删除无用的对象引用
2022-05-10 11:08:52
255
原创 Effective Java读书笔记01-05
01 Consider static factory methods instead of constructors使用静态工厂方法代替参数很多并且参数类型一样的构造方法, 这样用户会比较清晰的构造对象.02 Consider a builder when faced with many constructor parameters使用构造器模式代替参数很多的构造器方法, 这样用户可以根据自己的用途构造对象, 不用每次都加上自己用不到的参数就构造对象.03 Enforce the singleton
2022-05-10 11:07:48
146
原创 Shell脚本学习
学习的初衷在服务器上搞些事情, 我意思是查日志~执行hello world程序<!-- 创建文件 -->vim hi.sh<!-- hollw world -->#!/bin/bashecho "hollw world"<!-- 添加执行权限 -->chmod +x hi.sh<!-- 执行 -->./hi.sh变量常用数据类型字符串数组如何声明变量# 注意不能有空格param=strparam='str'#
2022-01-17 08:21:45
673
原创 Java NIO之Channel
channelChannel是仅次于Buffer的重要模块, Channel是IO设备传输的媒介.通常来说, 操作系统的每个文件标识符都会有相应的channel对应. Channel类不仅提供了平台无关性的抽象, 并且同样支持现代操作系统的本地io能力.Channel提供了使用操作系统的本地io的服务, 并且只消耗很小. Buffer就是传输过程数据的容器.Java NIO ChannelChannel接口提供了两个方法如下public interface Channel extends Clo
2021-03-01 09:25:53
234
原创 Java NIO之Buffer
bufferbuffer类是nio的基础Java buffer classbuffer对象可以成为一个固定大小的容器.buffer和channel关系紧密, channel是io传输的入口, buffer是数据传输的源头或者是目标.对于向外传输,数据(我们想要发送的)被放置在缓冲区中。缓冲区被传递到一个输出通道。对于向内传输,通道将数据存储在我们提供的缓冲区中。然后数据从缓冲区复制到通道内。像上面说的这种数据转换是nio api执行高效的关键buffer类结构如下, 顶部是通用的Buff
2021-02-24 13:58:41
533
原创 小心! Java三目运算符
Double a = null;double b = 0;Scanner in = new Scanner(System.in);boolean t = in.next().equals("y");System.out.println(t ? a : b);执行上述代码, 如果t为true则会抛出NPE, 执行javap查看反编译结果如图https://tva1.sinaimg.cn/large/008eGmZEly1gnftk6kwjwj31ui0g2778.jpg可以看到54行执行了一次
2021-02-08 08:31:10
205
原创 pagehelper/PageInterceptor导致MyBatis执行SQL问题
问题同事J上了一个需求, 导致一个跟这个需求毫无关系的接口报错, 报错信息显示是因为SQL语法问题, 正常SQL应该是这样:select * from table where condition order by field limit from, size但是现在却是:select * from table where condition limit from, size order by field不知道为什么order by跑到limit后面去了, 所以导致MySQL语法问题项目配置
2020-11-11 14:05:44
1125
原创 netty学习笔记-netty的整体结构(一)
不使用netty是怎么实现网络通信的netty是一个网络框架, 本篇会向你介绍netty的整体结构.回忆下我们在上学时实现的"聊天室小程序", 当时是如何做的. 首先我们定义两个系统Server和Client, 然后在Server端构造一个ServerSocket, 绑定一个端口port, 通过accept()方法等待请求进来, 为了处理多个请求, 通常我们在这里获取到请求后会将具体的处理任务派给其他线程处理, 当前线程继续accept()等待下一次请求. Client这边会构造一个Socket, 绑定
2020-11-02 22:39:37
369
2
原创 springboot(一) 启动过程-如何监听启动过程(1)
SpringApplication了解下Springboot的启动过程, 目标是整明白如何监听启动过程中的各个节点. Springboot启动就是一个main方法@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class})public class MyApplication { public static void main(String[] args) { SpringApplication.
2020-09-29 09:35:54
600
原创 dubbo学习(六) -- dubbo spi
前言了解过java spi后, 马上来看看dubbo spi有什么特殊之处dubbo spidemo还是以一个运行的demo开始, 基本和官网一样public static void main(String[] args) { ExtensionLoader<Robot> extensionLoader = ExtensionLoader.getExtensionLoader(Robot.class); Robot r = extensionL
2020-07-06 22:27:17
233
原创 dubbo学习(五) -- java spi
前言深入dubbo源码前最好先了解下java spi(service provider interface)机制, 简单来说, spi可以帮我们加载指定文件中描述的接口实现类. 嗯…就这? 是不是太简单了, 虽然我是个菜瓜, 那我也知道Class.forName呀~ 那我们来研究下~java spidemo尽管千篇一律, 还是给出一个可运行demo// 首先你需要一个对外接口public interface GreetOrBye { String say(String name);}
2020-06-14 23:00:01
183
原创 guava EventBus 学习二 源码
上篇介绍了guava包中的event bus的使用, 本篇深入源码了解实现细节EventBus了解首先当然要看EventBus类, 类上的注释说了很多, 总结如下:1 EventBus保证在多线程环境下, 不会同时访问订阅者, 除非订阅者标注了AllowConcurrentEvents注解. 如果没有使用这个注解, 订阅者不需要担心消息重入的问题.2 消息接收方法只能接收一个参数, 而且会根据消息类型路由消息到指定的订阅者. 如果消息类型存在父子关系, 那么发送子类消息, 父类订阅者也会收到.3
2020-05-26 08:16:24
364
原创 消息中间件(三) 之 RabbitMQ延迟队列
延迟任务什么是延迟任务需要延迟一段时间才需要处理的任务. 比如订单关闭, 电商平台一般会给用户30分钟左右交钱时间, 当超时未交钱就需要关闭订单. 订单的延时关闭就是一种延迟任务.怎么实现延迟任务定时任务最普遍的做法应该就是定时任务了, 比如订单关闭例子, 我们会将订单存储在表中, 通过定时任务定时扫表, 比如10分钟一次, 对扫描结果进行时间处理, 如果是超时订单则执行关闭操作.定时任务实现简单, 缺点是时间延迟时间不准确, 在订单例子中, 如果第一次扫描发现订单为29分钟未支付, 那么该订单
2020-05-11 09:10:36
732
原创 使用mybatis动态加载外部sql
背景不知道你们公司内部有没有这样的困惑, 很多部门经常会要求你们部门提供接口, 查询一些数据, 接口基本没有业务逻辑, 一条sql足以, 但是为了这个sql就不得不开发一个接口, 费时费力. 很多人也想过解决, 比如经常见到的, 会写一个包含很多字段的SQL, 然后通过不同的入参拼接不同的sql(mybatis中的). 这种方式简单粗暴, 只能查询固定表, 如果换一个表的数据, 还是要重新写, ...
2020-04-29 22:57:27
2516
7
原创 VIM 常用操作
不定期更新, 里面内容都是作者经常使用的功能, 在这里记录下来方便自己, 如果有用也是方便大家常用快捷键普通操作命令模式下:i 插入模式o 光标移动到下一行, 并转换为插入模式gg 光标跳转到文件第一行的行首G 光标跳转到文件最后一行的行首数字 + gg 跳转到指定行, 比如直接到15行, 则按下15后ggshift + 4 光标跳转到行尾0(零) 光标跳转到行首列操作1 ...
2020-04-27 21:15:25
107
原创 guava EventBus 学习一
背景event bus 数据总线, 数据发送者发送信息到总线, 数据接收者从总线接收数据. 大概类似于下飞机去取行李的时候, 旅客在行李传送带旁边等候自己的行李, 在这个场景下, 飞机相当于发送者, 旅客为接收者, 传送带就是我们的数据总线, 旅客上飞机就是一个注册的过程. 与我们后面准备学习的guava中的EventBus不同的是, 旅客是自己"拉取"的行李, 但是在guava中是总线根据注册...
2020-04-20 08:34:09
262
原创 dubbo学习(四)-- 注册中心
注册中心在orz框架中(对就是我们在做的这个框架的名字orz~), 消费者是写死生产者地址的, 为了后面支持集群扩展(真的么…), 我们这次搞一个注册中心, orz是抄…咳咳…借鉴dubbo的产品(产品…), 所以我们使用zookeeper来作为注册中心. 现在先简单了解下注册中心, 帮助还不熟悉的同学(me~).下面是zk官方文档的一些翻译, 斜体是翻译, 粗体是个人理解zookeeper...
2020-04-11 23:25:34
266
原创 消息中间件 二 之AMQP实战(下) RabbitMQ springboot实践
实现内容RabbitMQ + springboot 实现消息的发送和监听springboot版本2.1.8直接上代码配置类@Configurationpublic class RabbitConfig { // mq地址 @Bean(value = "connectionFactory") @Primary public ConnectionFacto...
2020-03-10 22:16:30
176
原创 消息中间件 二 之AMQP实战(上)
实例分析前面我们看了AMQP说明文档, 对AMQP有了大体的了解, 本文从实例出发再过一遍AMQP的基本操作.准备环境RabbitMQ server 3.7.16RabbitMQ client 5.7.3客户端代码使用的是RabbitMQ官网教程, 如下:public static void main(String[] args) throws IOException, Timeou...
2020-02-11 22:44:26
1751
原创 深入理解计算机系统 之 第一章 计算机系统漫游
1、只有ASCII构成的文件称为 文本文件,所有其他文件称为 二进制文件2、在Unix系统中,从源文件到目标文件的转化是由 编译器驱动程序完成的链接是将调用的函数通过某种方式结合到可执行文件中。3、系统的硬件组成总线, 贯穿整个系统的一组电子管道称为总线。它携带信息并负责在各个部件中传递。I/O设备, 通过适配器或者控制器连接到I/O总线。主存,在处理程序时,用来存储程序和程序处理...
2020-02-08 09:13:39
240
翻译 消息中间件 一 之 AMQP译文(下)
3 Functional Specification 功能性说明3.1 Server Functional Specification 服务端功能性说明3.1.1 Messages and Content 信息和内容在中间件处理路由和队列系统中, 信息具有原子性. 信息中有一个内容, 内容包含一个内容头, 用来存储一系列属性; 还有一个内容体, 用来保存二进制数据块信息可以对应多种不同的应...
2020-01-19 14:40:42
619
翻译 消息中间件 一 之 AMQP译文(上)
RabbitMQ是AMQP的实现成果, 所以在研究RabbitMQ之前, 不如先看看协议本身.1 Overview 概述1.1 Goals of This Document 文档目标This document defines a networking protocol, the Advanced Message Queuing Protocol (AMQP), whichenables c...
2020-01-07 22:19:14
716
原创 消息中间件 零
消息中间件是什么?MOM Message-Orientd Middleware is software infrastructure focused on sending and receiving messages between distributed systems.消息中间件就是在分布式系统中发送和接收信息的软件.从定义知, 我们通常说的消息中间件指的是在分布式系统中收发信息的工具...
2019-12-24 22:00:05
154
原创 dubbo学习(三)--优化调用功能
信息在上一章中我们已经实现了一个基本完美的rpc框架,但是我们不能骄傲,需要不断完善。首先我们来处理下消息传递的问题,之前是以‘-’分割字符串,只能传递一个参数。现在我们把它修改为json格式传递。这里json选择使用阿里的fastjson,啊,真是强强联和~~maven:<dependency> <groupId>com.alibaba</groupId...
2019-10-15 19:01:10
229
原创 dubbo 学习(二)-- 简单实现远程方法调用
参考博客前言在学习dubbo过程中,经常有“我要学习什么的想法”,经常有看完一部分不知道后面要干嘛的时候。总的来说感觉自己缺少“dubbo能干什么?”的明确答案,所以在学习的时候就缺乏学习路线,这也跟自己长期的学习习惯有关:我要学习A技能,上网搜索 “A技能教程”或者“从零开始学A”。这样自己的学习完全依赖他人的总结,所以导致学习的成果同样依赖博客的质量,这就是高耦合啊同学们!!!我的学习质量...
2019-10-12 16:42:55
299
翻译 RabbitMQ 教程译文(六) + 学习
原文Remote procedure call (RPC)在第二篇教程中,我们学会了怎么把耗时的消息通过工作队列发送给多个消费者。但是,如果我们请求一个远端服务,需要等待返回结果,那我们要怎么做。这就是完全不同的两种情况,后者被称为RPC。在我们这次教程中,我们通过RabbitMQ创建一个RPC系统:一个客户端以及一个可扩展的服务端。因为我们没有什么任务需要分发,所以我们会创建一个简单的R...
2019-09-24 18:49:16
189
原创 小程序(一)用户登陆
登陆用户登陆主要是为了获取用户标示,用于后续的业务流程。用户登陆的流程图如下本地缓存根据小程序文档,在用户不手动删除的情况下,本地缓存会一直存在,所以我们会将用户的登录信息缓存在本地中,setStorage,在本项目中会存储用户的openId;在使用的时候getStorage,如果获取不到则表示用户没有登录,后面进行登录;wx.loginwx.login执行后小程序框架会给我们返回用...
2019-09-19 08:53:32
229
原创 aop方式的参数校验
背景由于历史背景,公司项目中的接口都使用json格式入参,使用com.alibaba.fastjson.JSONObject来接收,形如public @ResponseBody Result xxx(@RequestBody JSONObject reqJsonObj) { String a = reqJsonObj.getString("a"); St...
2019-09-09 22:06:32
1513
1
原创 小程序(零)开发前期准备
前言因为一个原因需要一个答题的小程序,作为程序员当然要自己动手实现,目前还在开发中,一段时间会发布开发过程,最终会展示全部代码。1.1 环境准备按照小程序流程下载编译器、注册账号等;1.2 熟悉代码结构代码结构如下图[外链图片转存失败(img-1k713VHa-1567058129431)(小程序(零)开发前期准备.resources/94BB427D-9B82-4922-A495-0...
2019-08-29 13:57:28
124
原创 数据结构(二)--散列
目录什么是散列散列函数hash冲突分离链表法探测散列表线性探测法平方探测法双散列再散列什么是散列散列首先是一个数组,所以它的访问速度快,它与数组的不同在于可以通过一个关键字访问数据,这个关键字与数组下标之间的映射关系有散列函数提供。散列函数所以说,散列函数对于一个散列是非常重要的,它的第一个主要功能就是将关键字映射到数组下标。比较简单的散列函数,比如关键字是正整数,那么散列函数可以是将关...
2019-07-17 12:48:25
259
翻译 RabbitMQ 教程译文(五) + 学习
原文地址https://www.rabbitmq.com/tutorials/tutorial-five-java.htmlTopics在之前的教程中,我们改进了日志系统,我们使用direct exchange代替fanout exchange,不使用广播的形式发送日志。而且我们可以挑选感兴趣的日志接收。虽然使用direct exchange改进了我们的日志系统,但是还是有限制的,在多个条...
2019-05-27 13:38:54
175
原创 dubbo学习(一)--入门例子
dubbo的介绍大家自行百度,下面以一个demo作为dubbo学习的开始DUBBO 入门例子 - 一个服务一个实现dubbo版本2.5.8注册中心使用zookeeper,版本3.4代码结构如下api是接口服务定义consumer是服务消费者provider是服务生产者api代码如下public interface DemoService { String sayHi...
2019-05-23 13:34:47
172
原创 数据结构(一)--树
目录树的定义二叉查找树AVL树单旋转双旋转伸展树展开java中树的应用树的定义什么是树 :一棵树是一些节点的集合。这个集合可以是空集;若不是空集,则树由称作根的节点r以及0或多个非空的子树组成,这些子树中每一颗的根都被来自根r的一条有向的边所连接。也就是说,一棵树是N个节点和N-1条边的集合。一些名字解释儿子:节点的子树的根叫做该节点的儿子;父亲:该节点就是儿子的父亲;树叶:没有儿子的...
2019-05-01 09:56:01
995
基于FPGA的电风扇的开关控制器
2013-04-14
基于FPGA的电风扇的自动定时开关控制器设计
2013-04-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人