随笔分类 -  java

总结java语言语法相关知识点
摘要:我的上一篇博客类加载器与双亲委派中提到,SPI机制是一种上级类加载器调用下级类加载器的情形,因此会打破类加载的双亲委派模型。为了深入理解其中的细节,本博客详细剖析一下SPI机制,并以JDBC为例,基于源码来进行分析。 SPI 原理介绍 SPI(Service Provider Interface), 阅读全文
posted @ 2020-12-19 23:26 数小钱钱的种花兔 阅读(630) 评论(0) 推荐(0)
摘要:类加载器,顾名思义,即是实现类加载的功能模块,负责将Class的字节码形式加载成内存形式的Class对象。字节码文件可来源于磁盘或者jar包中的Class文件,也可以来自网络字节流。 类加载器 在JVM中,内置了三个重要的类加载器,Application classLoader,Extension 阅读全文
posted @ 2020-12-09 21:26 数小钱钱的种花兔 阅读(344) 评论(0) 推荐(0)
摘要:虚拟机把描述类的数据从class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这就是虚拟机的类加载机制。下面来总结梳理类加载的五个阶段。 类加载发生在程序运行期间,会有一些性能开销,但是会提供灵活性,Java动态扩展的特性就是依赖运行时期动态加载和动 阅读全文
posted @ 2020-12-06 22:16 数小钱钱的种花兔 阅读(263) 评论(0) 推荐(0)
摘要:在业务场景中,处理一个任务队列,可能需要依照某种优先级顺序,这时,Java中的PriorityQueue(优先队列)便可以派上用场。优先队列的原理与堆排序密不可分,可以参考我之前的一篇博客: 堆排序总结与实现 原理 PriorityQueue中维护一个Queue[]数组,在逻辑上把它理解成一个小根堆 阅读全文
posted @ 2020-11-13 16:50 数小钱钱的种花兔 阅读(360) 评论(0) 推荐(0)
摘要:线程池是很常用的并发框架,几乎所有需要异步和并发处理任务的程序都可用到线程池。 使用线程池的好处如下: 降低资源消耗:可重复利用已创建的线程池,降低创建和销毁带来的消耗; 提高响应速度:任务到达时,可立即执行,无需等待线程创建; 提高线程的可管理性:线程池可对线程统一分配、调优和监控。 原理 线程池 阅读全文
posted @ 2020-11-04 21:47 数小钱钱的种花兔 阅读(577) 评论(0) 推荐(4)
摘要:Redis的网络模型是基于I/O多路复用程序来实现的。源码中包含四种多路复用函数库epoll、select、evport、kqueue。在程序编译时会根据系统自动选择这四种库其中之一。下面以epoll为例,来分析Redis的I/O模块的源码。 epoll系统调用方法 Redis网络事件处理模块的代码 阅读全文
posted @ 2020-07-25 15:51 数小钱钱的种花兔 阅读(907) 评论(0) 推荐(0)
摘要:java反射使用总结 获取类对象 (1)【Source源代码阶段】 Class.forName("全类名"):将字节码文件加载进内存,返回Class对象 多用于配置文件,将类名定义在配置文件中。读取文件,加载类。 (2)【Class类对象阶段】 类名.class:通过类名的属性class获取 多用于 阅读全文
posted @ 2020-07-17 16:51 数小钱钱的种花兔 阅读(142) 评论(0) 推荐(0)
摘要:之所以标明“jdk7”,是因为jdk8和jdk7中的HashMap实现原理不一样。jdk7中使用“数组+链表”形式来实现哈希表,这与数据结构课上所学的一致。而jdk8在它的基础上,引入了红黑树。本博客先从最原始的“数组+链表”形式开始总结梳理。 首先在开始之前要有一个基本认识:HashMap是一个对 阅读全文
posted @ 2020-05-13 19:16 数小钱钱的种花兔 阅读(302) 评论(0) 推荐(0)
摘要:最近开始看Redis设计原理,碰到一个从未遇见的数据结构:跳跃表(skiplist)。于是花时间学习了跳表的原理,并用java对其实现。 介绍 跳跃表 是一种有序数据结构,它通过每个结点中维持多个指向其它结点的指针,从而达到快速访问结点的目的。 我们平时熟知的链表,查找效率为O(N)。跳表在链表的基 阅读全文
posted @ 2020-05-06 21:10 数小钱钱的种花兔 阅读(3117) 评论(0) 推荐(0)
摘要:问题背景 NIO是面向缓冲区进行通信的,不是面向流的。我们都知道,既然是缓冲区,那它一定存在一个固定大小。这样一来通常会遇到两个问题: 消息粘包 :当缓冲区足够大,由于网络不稳定种种原因,可能会有多条消息从通道读入缓冲区,此时如果无法分清数据包之间的界限,就会导致粘包问题; 消息不完整 :若消息没有 阅读全文
posted @ 2020-04-19 17:00 数小钱钱的种花兔 阅读(1842) 评论(0) 推荐(0)
摘要:问题 今天调试NIO后台发现一个蛋疼的问题。经过调试之后,出现问题的流程描述如下: 客户端向服务端发送消息,服务端使用IO多路复用处理输入,即一个selector监听多个channel。第一条消息正常接收,发送第二条消息时,select()立即返回0,然后开始continue无限循环,导致第二条消息 阅读全文
posted @ 2020-04-16 16:04 数小钱钱的种花兔 阅读(914) 评论(0) 推荐(1)
摘要:我前段时间的一篇博客 "java网络编程——多线程数据收发并行" 总结了服务端与客户端之间的收发并行实践。原理很简单,就是针对单一客户端,服务端起两个线程分别负责read和write操作,然后线程保持阻塞等待读写执行。 事实上,这样的模式非常糟糕。因为每一个客户端在服务端需要占用两条线程,假如有10 阅读全文
posted @ 2020-04-04 19:39 数小钱钱的种花兔 阅读(607) 评论(0) 推荐(0)
摘要:前面几个IO流相关博客总结了几个比较重要的类,还剩下几个,类源码非常易懂。这里简单总结一下我记录的要点。 CharArrayReader&CharArrayWriter 1. CharArrayReader 看了源码,感觉没什么作用,CharArrayReader大概就是遍历一个输入的char[] 阅读全文
posted @ 2020-04-03 12:58 数小钱钱的种花兔 阅读(137) 评论(0) 推荐(0)
摘要:PrintWriter是字符输出流一个重要的方法,其源码非常简单易懂。下面基于源码来分析PrintWriter跟之前的BufferWriter、FileWriter之间的区别。 构造函数 可见,PrintWriter可以用来包装Writer的任意子类,当包装OutputStream时,默认包装一层B 阅读全文
posted @ 2020-03-29 17:13 数小钱钱的种花兔 阅读(455) 评论(0) 推荐(0)
摘要:上一篇博客中,测试分析了FileReader&FileWriter,和BufferWriter&BufferReader之间的性能对比。仅仅只是简单分析。现在我基于源码的角度,来分析BufferReader与FileReader的区别。 首先在构造函数上 public int read() thro 阅读全文
posted @ 2020-03-28 16:26 数小钱钱的种花兔 阅读(478) 评论(0) 推荐(1)
摘要:最近想学习学习I/O流相关的内容,看到一篇博客: "java IO流学习总结" 这篇博客总结得很好,但我还是想按照自己的思路把一些疑点梳理一下。我们知道,IO流分为 字符流 读写和 字节流 读写,本篇博客以文件读写作为切入点,总结 字符流文件读写 相关知识点(字节流暂放)。下面附上IO图解: 由图可 阅读全文
posted @ 2020-03-23 23:07 数小钱钱的种花兔 阅读(341) 评论(0) 推荐(0)
摘要:博客搬家: "java字符编码问题" 前段时间在读《java核心技术卷一》,遇到一些名词:码点、代码单元等,其实字面意思不难理解,解释如下 码点(code point):Unicode编码表中某个字符对应的代码值 代码单元(code unit):用于UTF 16编码的最小单元,16个bit 注意上述 阅读全文
posted @ 2019-12-02 10:00 数小钱钱的种花兔 阅读(1262) 评论(0) 推荐(0)