一、初窥HashMap
HashMap是应用更广泛的哈希表
实现,而且大部分情况下,都能在常数时间性能的情况下进行put和get操作。要掌握HashMap,主要从如下几点来把握:
- jdk1.7中底层是由数组(也有叫做“位桶”的)+链表实现;jdk1.8中底层是由数组+链表/红黑树实现
- 可以存储null键和null值,线程不安全。在HashMap中,null可以作为键,这样的键只有一个,但可以有一个或多个键所对应的值为null。
当get()方法返回null值时,即可以表示HashMap中没有该key,也可以表示该key所对应的value为null
。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个key,应该用containsKey()
方法来判断。而在Hashtable中,无论是key还是value都不能为null。 - 初始size为16,扩容:newsize = oldsize*2,
size一定为2的n次幂
- 扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入
- 插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
- 当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀
- 1.7中是先扩容后插入