HashTable
1、底层:数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable(方法上加了synchronized关键字修饰),效率低,后来针对这一缺点ConcurrentHashMap做了相关优化。
2、初始size为11,扩容:newsize = oldsize*2+1
3、计算index的方法:index = (hash & 0x7FFFFFFF) % tab.length
HashMap
1、底层:数组+链表(jdk1.7后+红黑树)实现,可以存储null键和null值,线程不安全
2、初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂。
3、扩容针对整个Map,每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入。
4、插入元素后才判断该不该扩容,有可能无效扩容(插入后如果扩容,如果没有再次插入,就会产生无效扩容)
5、当Map中元素总数超过Entry数组的75%,触发扩容操作,为了减少链表长度,元素分配更均匀。
6、计算index方法:index = hash & (tab.length – 1)
*(
HashMap的初始值还要考虑加载因子:
哈希冲突:若干Key的哈希值按数组大小取模后,如果落在同一个数组下标上ÿ