这个抽象类也是默认实现了一些Map接口里面的方法,同时有两个静态内部类实现了Entry接口
这两个静态内部类的不同之处就在于,SimpleEntry实现了setValue方法(这个方法用来修改当前节点的value),而SimpleImmutableEntry没有实现setValue方法,单纯只是抛出了一个UnSupport异常出来
注释的意思就是,使用这个节点会不支持改变值,那么就可以保证线程安全,线程不安全可能是因为获取的那个oldValue会丢失掉上一个线程的修改,即A、B两个线程同时setValue,因为同时进入,还没修改,拿的oldValue都是一样的,但假设A先执行完setValue,那么B应该获取的oldValue是A修改的值才对。
SimpleEntry的setValue方法
SimpleImmutableEntry的setValue方法
![还有一个区别就是
对于K,V属性,两者的修饰是不一样的
SimpleEntry的key是不可变的,而value是可变的
而SimpleImmuntableEntry的key和value都是不可变的
接下来我们就进入HashMap吧
HashMap继承了AbstractMap和实现了Map(与前面的ArrayList一样,都出现了多余的操作,即AbstractMap已经实现了Map,后面实现Map就多余了)
JDK1.7的HashMap,估计都知道底层是数组加链表
常量和变量
可以看到,HashMap拥有的变量和常量还挺多
逐个逐个来看
ALTERNATIVE_HASHING_THRESHOLD_DEFAULT
从注释上可以看出,这个静态常量是当使用字符串来代替hashcode的时候,HashMap默认的阈值,当size(HashMap里面元素个数)超过这个阈值就要进行扩容
而且可以看到,这个扩容条件是元素个数大于Integer的最大值
这样设置可能是因为hashcode是一个整形,所以当超出整形的范围才会使用字符串来代替hashcode,所以扩容条件也是大于Integer的最大值
DEFAULT_INITIAL_CAPACITY
这个静态变量是HashMap底层主数组的容量,默认值是 2 4 2^4 24,也就是16,而且注释上还有一个很重要的信息,即默认的容量必须是2的幂次方,至于为什么,后面再进行解释
DEFAULT_LOAD_FACTOR
这个就是负载因为,当数组的使用率超过这个负载因子时就要进行扩容,默认是