随笔分类 -  JAVA

摘要:最近在项目中遇到了很多模糊匹配字符串的需求,总结一下实现思路。 大体需求场景是这样的:省项目中,各个地市报送的本地证照目录非常不规范,只有不规范的证照名称,且没有与国家标准证照目录中的证照名称进行对应。需要将这些名称不规范的证照与国家标准目录中的证照对应起来。 拿到一个不规范的证照名称,需要将其与国 阅读全文
posted @ 2020-10-02 22:18 牛有肉 阅读(6843) 评论(1) 推荐(1) 编辑
摘要:这次不以面试背题为目的,挑几个源码实现中值得玩味的点来分析一下。 首先看几个初始化参数,在实现中 Lea 大爷大量的使用了二进制位移运算。比如 16 表示为 1<<4 ,1 073 741 824 表示为 1<<30 。由于计算机的物理特性,二进制运算的效率尤其是位移运算是高于直接使用十进制运算的。 阅读全文
posted @ 2020-07-27 15:58 牛有肉 阅读(701) 评论(1) 推荐(0) 编辑
摘要:直接上源码,查看 register 的实现。我们查看 register 的实现会直接跟进抽象类 SelectableChannel 中: 调用了本身的另一个 register 方法: 该实现为抽象方法,我们直接向下查找 SelectableChannel 子类,查看其实现。因为 SocketChan 阅读全文
posted @ 2020-06-11 21:35 牛有肉 阅读(1156) 评论(0) 推荐(1) 编辑
摘要:在多道编程的情况下,想要保证线程按我们预想的方式协作,抛开原子性、可见性、有序性的概念,白话总结下心得: 1. 从涉及到操作共享数据的指令入手,保证它们对共享数据操作的正确性。 2. 首先保证单线程情况下,程序执行的正确性。然后判断线程中,与操作共享变量的指令存在数据依赖的指令构成的指令集。保证指令 阅读全文
posted @ 2020-06-09 21:38 牛有肉 阅读(332) 评论(0) 推荐(0) 编辑
摘要:最近工作比较忙,水一篇: /** * @Author Niuxy * @Date 2020/6/8 8:54 下午 * @Description 基于双向链表的简单 FIFO 队列 * 锁的粒度很粗,仅针对最上层操作进行互斥同步关系规划 * 最上层方法有两个:put 与 remove * 以 len 阅读全文
posted @ 2020-06-09 20:09 牛有肉 阅读(260) 评论(0) 推荐(0) 编辑
摘要:LRU(最近最少使用) 缓存为一段固定大小的缓存,按最近最少使用的淘汰策略对数据进行管理。 一个 LRU 缓存应当支持 put 和 get 操作: 进行 get 操作时,发生 cache miss 返回固定标识。缓存命中在返回数据的同时更新最近使用时间。 进行 put 操作时,如果 key 存在则更 阅读全文
posted @ 2020-06-07 17:08 牛有肉 阅读(955) 评论(0) 推荐(0) 编辑
摘要:在 NIO 中,我们读取 channel 中的数据,会通过 channel 的 read 尽最大努力将 Buffer 填满,填满后做一些其它处理。 对于 TCP 协议来说,这种做法无可厚非,因为 TCP 协议本身就不提供定界策略,只负责提供可靠的连接,也就是数据可靠的收发( 以 ack 应答机制为核 阅读全文
posted @ 2020-05-29 17:30 牛有肉 阅读(430) 评论(0) 推荐(0) 编辑
摘要:首先了解一下系统 I/O 与标准 I/O 的区别: 系统I/O,又称文件I/O,或是内核态I/O,引用文件的方式是通过文件描述符,一个文件对应一个文件描述符。一个文件描述符用一个非负整数表示,0、1、2系统默认表示标准输入、标准输出、标准错误,某些UNIX系统规定了描述符的上限值OPEN_MAX,这 阅读全文
posted @ 2020-04-22 00:41 牛有肉 阅读(693) 评论(0) 推荐(0) 编辑
摘要:如果我们要将一个文件通过 socket 发送出去,我们一般会这样写: Socket socket = new Socket(); socket.connect(new InetSocketAddress("127.0.0.1", 33456),10 * 1000); DataOutputStream 阅读全文
posted @ 2020-04-20 14:02 牛有肉 阅读(469) 评论(0) 推荐(0) 编辑
摘要:使用 JAVA 进行多道编程时,除了通过 wait/notify 对线程进行阻塞/唤醒外,我们还可以使用 LockSupport 工具类来阻塞和唤醒线程。 比如: Thread threadTest = new Thread( () -> { System.out.println("thread s 阅读全文
posted @ 2020-04-16 21:12 牛有肉 阅读(2364) 评论(0) 推荐(0) 编辑
摘要:一个经典的问题,判断某个整数是否为回文数。 问题很简单,练手题。 递归表示,如果某个字符与其回文字符不同,则不是回文数;如果相同,则继续判断其子串是否为回文数: public final boolean isPalindrome(int x) { if(x<0){return false;} if( 阅读全文
posted @ 2020-03-26 21:04 牛有肉 阅读(646) 评论(0) 推荐(0) 编辑
摘要:1.1 异常处理 异常的处理应当符合 尽早抛出,延迟捕获 的原则。 在进行 MVC 分层调用时,Service 与 Dao 层触发的异常应统一向上抛出,交给 Controller 层处理。因为只有 Controller 层可以更好的决策发生异常时应当给用户何种反馈。 但这样会造成我们的 Contro 阅读全文
posted @ 2020-03-26 19:46 牛有肉 阅读(1000) 评论(0) 推荐(0) 编辑
摘要:在实际开发时,许多业务接口的入参非常复杂,比如会有多级的 JSON 嵌套或者混杂着各种数组。 这种时候如果我们将接口参数的拼装逻辑杂乱的写在 Controller 层,代码的可读性会非常差,后续接手的人员需要一个参数一个参数的比对着接口文档来推演参数的拼装逻辑。 在这种情况下,将接口调用参数封装为数 阅读全文
posted @ 2020-03-24 21:04 牛有肉 阅读(1194) 评论(1) 推荐(0) 编辑
摘要:在使用微服务的过程中,RPC 是永远绕不开的点。之前并没有磕的很深,一直觉着 RPC 是一个黑魔法。比如我们常用的 Dubbo、SpringCloud 等框架,将微服务模块间的方法调用封装的像本地方法调用一样,方便又令人费解。 今天如愿以偿的仿照 Dubbo 自己手写了一个 rpc “框架”,虽然简 阅读全文
posted @ 2020-03-24 11:27 牛有肉 阅读(552) 评论(0) 推荐(0) 编辑
摘要:前面的博客 基于 socket 手写一个 TCP 服务端及客户端 写过一个简单的 TCP 服务端客户端,没有对代码结构进行任何设计,仅仅是实现了相关功能,用于加深对 socket 编程的认识。 这次我们对整个代码结构进行一下优化,使其模块化,易扩展,成为一个简单意义上的“框架”。 对于 Socket 阅读全文
posted @ 2020-03-22 18:44 牛有肉 阅读(706) 评论(0) 推荐(0) 编辑
摘要:通过 socket 实现一个 TCP 服务端与客户端,实现通过 TCP 协议进行消息收发。 关键在 socket 的使用的理解上。 socket 是对操作系统提供的协议栈的封装,底层调用的是操作系统提供的协议栈。 当我们调用 ServerSocket 的 accept 方法时,线程阻塞。以 TCP 阅读全文
posted @ 2020-03-21 21:02 牛有肉 阅读(1272) 评论(0) 推荐(0) 编辑
摘要:动态代理 核心方法为 Proxy.newProxyInstance 方法,该方法需要传入 被代理类的类加载器、被代理类实现的接口 以及一个 InvocationHandler 的实现类实例。 方法会通过字节码技术为我们返回一个代理对象,代理对象会实现被代理对象的所有接口,并在这些接口声明方法前后织入 阅读全文
posted @ 2020-03-20 15:21 牛有肉 阅读(831) 评论(2) 推荐(1) 编辑
摘要:代理模式 为其他对象提供一个代理以控制对某个对象的访问。代理类主要负责为委托了(真实对象)预处理消息、过滤消息、传递消息给委托类,代理类不现实具体服务,而是利用委托类来完成服务,并将执行结果封装处理。代理类本身不实现服务,而是通过调用被代理类中的方法来提供服务。 从设计模式上看,代理模式与适配器模式 阅读全文
posted @ 2020-03-20 15:17 牛有肉 阅读(166) 评论(0) 推荐(0) 编辑
摘要:了解字节码文件可以让我们从更底层的视角理解 JAVA 的内部运作机制。程序说白了就是一堆逻辑和数据,字节码文件中便存储着可以支撑 JAVA 语言逻辑的数据。 .java 文件经过 javac 编译后会生成一份 .class 字节码文件。.class 文件是 java 跨平台的基础,JVM 对各种操作 阅读全文
posted @ 2020-03-20 09:32 牛有肉 阅读(755) 评论(0) 推荐(0) 编辑
摘要:序列化与反序列化的使用场景: 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中; 在网络上传送对象的字节序列。 面向对象的一大特性便是封装,我们将模型的属性和方法封装到一个类中,非静态属性在对象实例化时被赋予具体的值。 可以这样理解,对象是 JAVA 层面用于描述一个实体的数据结构,与 XM 阅读全文
posted @ 2020-03-18 23:36 牛有肉 阅读(302) 评论(0) 推荐(0) 编辑