一、接口interface
JDK7及其之前:
1.接口中变量默认修饰符为:public final static
2.接口中方法的默认修饰符为:public abstract
JDK8及其以后:
1.接口中可以添加非抽象方法——static:定义时必须有方法体,实现类不能重写,可以通过接口名调用
2.接口中可以添加非抽象方法——default:定义时必须添加方法体,必须写修饰符default不能省略,实现类可以重写
JDK9及其以后:
1.新增了非抽象方法——private:定义时必须有方法体,实现类不能重写也不能访问
二、堆内存
JDK8之前:
1.由年轻代Young、老年代Tenured、永久代PermGen构成
JDK8之后:
1.永久代被元空间MetaSpace替代
三、自动装箱和自动拆箱
JDK5以后:
1.引入了自动装箱和自动拆箱
2.自动装箱:valueOf()
例如:Integer i = Integer.valueOf(666);
可以写成: Integer i = 666;
3.自动拆箱:xxxValue()
例如:int j = i.intValue();
可以写成: int j = i;
注:Integer类提供了范围为-128~127的静态数组缓存cache,数据在范围之外的都使用new Integer创建新对象
四、String类
JDK8及其之前:
1.底层使用的是char数组
JDK9及其之后:
1.底层使用的是byte数组,提高效率
补充:Stringbuilder扩容机制原来的2倍+2
五、枚举enum
JDK5引入枚举类型:
1.枚举里面存放的都是常量,默认使用public final static修饰,一般是用于限制取值的。
六、ArrayList
JDK7:
1.无参构造创建ArrayList对象时,数组的默认长度为10
JDK8:
1.无参构造创建ArrayList对象时,数组的默认长度为0
扩容机制:
1.当容量不足时,会扩充原来长度的50%,如果扩充后还是不满足,则扩充当前新增元素所需的最小数量
七、HashMap&HashSet
JDK7及其之前:
1.底层是(Entry)数组+链表的形式,链表采用的的是头插法。
JDK8及其之后:
1.底层是(Node)数组+链表|红黑树的形式,链表采用的是尾插法。
注:当链表中存储的数据大于等于8个时,会转化为红黑树的形式存储
扩容机制:
1.HashMap默认长度为16,装填因子为0.75,阈值:16*0.175=12,当存储的数量超过这个阈值时,会自动扩容为原来的2倍,且全部数据都重新Hash,存入扩容后的HashMap中
2.HashSet底层就是HashMap,存入的数据中存到了Key中,而value统一是同一个Object()对象。