https://i.loli.net/2020/09/25/5sEaNw31zuGnbhc.jpg

HashMap源码分析-jdk1.8

HashMaps是基于Map的键值对映射表,底层是通过数组,链表,红黑树(JDK1.8加入)来实现的

HashMap结构

HashMap中存储元素,是将key和value封装成了一个Node,先以一个Node数组的来存储,通过key的hashCode来计算hash值,根据hash值和HashMap的大小确定存入元素在数组中的位置。当hashCode相同时,即产生了相同的数组索引位置,那么就会通过单向链表的形式来继续存储。

javac编译器-语义分析与字节码生成

语法分析之后,编译器获得了程序代码的抽象语法树表示,语法树能表示一个结构正确的源程序的抽象,但无法保证源程序是符合逻辑的,而语义分析的主要任务是对结构上正确的源程序进行上下文有关性质的审查,如进行类型审查

插入式注解处理器实战--检查命名书写规范

要通过注解处理器API实现一个编译器插件,首先需要了解这组API的一些基本知识。

我们实现注解处理器的代码需要继承抽象类javax.annotation.processing.AbstractProcessor,这个抽象类中只有一个必须覆盖的abstract方法:“process()”,它是Javac编译器在执行注解处理器代码时要调用的过程,我们可以从这个方法的第一个参数“annotations”中获取到此注解处理器所要处理的注解集合,从第二个参数“roundEnv”中访问到当前这个Round中的语法树节点,每个语法树节点在这里表示为一个Element。

双亲委派模型

从Java虚拟机的角度来讲,只存在两种不同的类加载器:

一种是启动类加载器(Bootstrap ClassLoader),这个类加载器用 C++ 语言实现, 是虚拟机自身的一部分:

另一种就是所有其它的类加载器, 这些类加载器用Java 语言实现,独立于虚拟机外部,并且全都继承与抽象类 java.lang.ClassLoader。

内存分配与回收策略总结

> Java技术体系中所提倡的自动内存管理最终可以归结为自动化地解决了两个问题:给对象分配内存以及回收分配给对象的内存。

对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。 少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。