详细源码解析查看面试再也不怕问到HashMap(一)
HashMap干货总结
1,可以用null做为key和value
2,capacity和load factor影响性能
3,线程不安全
4,HashMap不能保证随着时间的推移Map中的元素次序是不变的。
5,迭代时并发更改了map,则会抛出ConcurrentModificationException
6,当同一个bucket上元素拥挤(默认值为8)时,会将列表转变成红黑树来提高查询性能,缩减时(默认值为6)会恢复为链表。红黑树查找位置时折半查找效率高于链表,而删除操作效率低于链表。
7,hash(key)核心hash算法,在长度为2的幂前提下,hash值高位下移16位,参与取模,降低碰撞,另外取模部分利用2的幂减1来做&操作提高了性能。
8,链表状态下碰撞元素加入时是放入链表尾部,因为它认为最近放入的元素可能最容易被使用。
9,继承Serializable接口,可是字段使用transient修饰,比如table,entrySet。原因是hashcode操作依赖jvm所处的环境因素,不同环境可能有不同的hash值,做成存储的内容既是序列化也无法通用.所以hashmap自己实现了writeObject和readObject,这里就需要知道java在序列化和反序列化一个类时是先调用writeObject和readObject,如果没有默认调用的是ObjectOutputStream的