HashMap应用哈希表实现,增删查改的时间复杂度一般能达到O(1);不经过任何比较,就能查找到某个数据。
- jdk1.7中底层由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现
- 可以存储null键和null值,线程不安全。在HashMap中,null作为key只能有一个,但可以有一个或多个键所对应的Value为null。当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个key,应该用containsKey()方法来判断。而在Hashtable中,无论是key还是value都不能为null。
- 初始size为16,扩容是2倍扩容,size一定为2的n次幂
- 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
- 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
- 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
- 1.7中是先扩容后插入新值的,1.8中是先插值再扩容
若干Key的哈希值按