HashMap源码分析-jdk1.8
HashMaps是基于Map的键值对映射表,底层是通过数组,链表,红黑树(JDK1.8加入)来实现的
HashMap结构
HashMap中存储元素,是将key和value封装成了一个Node,先以一个Node数组的来存储,通过key的hashCode来计算hash值,根据hash值和HashMap的大小确定存入元素在数组中的位置。当hashCode相同时,即产生了相同的数组索引位置,那么就会通过单向链表的形式来继续存储。
HashMaps是基于Map的键值对映射表,底层是通过数组,链表,红黑树(JDK1.8加入)来实现的
HashMap中存储元素,是将key和value封装成了一个Node,先以一个Node数组的来存储,通过key的hashCode来计算hash值,根据hash值和HashMap的大小确定存入元素在数组中的位置。当hashCode相同时,即产生了相同的数组索引位置,那么就会通过单向链表的形式来继续存储。
要通过注解处理器API实现一个编译器插件,首先需要了解这组API的一些基本知识。
我们实现注解处理器的代码需要继承抽象类javax.annotation.processing.AbstractProcessor,这个抽象类中只有一个必须覆盖的abstract方法:“process()”,它是Javac编译器在执行注解处理器代码时要调用的过程,我们可以从这个方法的第一个参数“annotations”中获取到此注解处理器所要处理的注解集合,从第二个参数“roundEnv”中访问到当前这个Round中的语法树节点,每个语法树节点在这里表示为一个Element。
从Java虚拟机的角度来讲,只存在两种不同的类加载器:
一种是启动类加载器(Bootstrap ClassLoader),这个类加载器用 C++ 语言实现, 是虚拟机自身的一部分:
另一种就是所有其它的类加载器, 这些类加载器用Java 语言实现,独立于虚拟机外部,并且全都继承与抽象类 java.lang.ClassLoader。
对象的内存分配,往大方向讲,就是在堆上分配(但也可能经过JIT编译后被拆散为标量类型并间接地栈上分配),对象主要分配在新生代的Eden区上,如果启动了本地线程分配缓冲,将按线程优先在TLAB上分配。 少数情况下也可能会直接分配在老年代中,分配的规则并不是百分之百固定的,其细节取决于当前使用的是哪一种垃圾收集器组合,还有虚拟机中与内存相关的参数的设置。
最近App加了一个发邮件的功能,就用spring的javaMail写了下。
整个开发过程没啥难的,需求就是打包发送一些附件,再来点模板,没想到最后栽在了编码问题上,忘了那本书说过了。
软件开发,编码问题将伴随你的一生