源码分析
*static final int* *DEFAULT_INITIAL_CAPACITY*** = 1 << 4; // aka 16 表示1向左移4位,2的4次方**
**static final int* *MAXIMUM_CAPACITY** = 1 << 30;//hashmap数组的最大容量
*static final float* *DEFAULT_LOAD_FACTOR*** = 0.75f;//默认加载因子,当集合的容量大于75%的时候,就进行扩容
*static final int* *TREEIFY_THRESHOLD*** = 8;//jdk1.8,当链表长度大于8的时候,就调整成红黑树
*static final int* *UNTREEIFY_THRESHOLD*** = 6;//jdk1.8 当链表长度小于6时,调整成链表
*static final int* *MIN_TREEIFY_CAPACITY*** = 64;//jdk1.8 当链表长度大于8时,并且集合元素个数大于等于64
*transient* Node<K,V>[] *table*;//hash表中的数组
*transient int* *size*;//元素个数
总结:
(1)hashmap刚刚创建时候,table是null,为了节省空间,当添加第一个元素的时候,table容量调整为16.
(2)当元素个数大于阈值(16*0.75=12)时,会进行扩容,扩容后大小为原来的2倍,目的是减少调整元素的个数。
(3)Jdk1.8 当每个链表长度大于8,并且数组元素个数大于等于64的时候,会调整为红黑树,目的是提高执行效率
(4)Jdk1.8 当链表长度小于6时,会调整成链表
(5)Jdk1.8以前,链表时头插法,jdk1.8以后时是尾插入。
Hashset的底层是hashmap
Map集合的实现类
HashMap[重点]:
Jdk1.2版本,线程不安全,运行效率快;允许用null,作为key或是value。
Hashtable:
Jdk1.0版本,线程安全,运行效率慢;不允许null作为key或是value。基本上在实际项目开发过程中这个类是不用的。
Propertise:继承自HashTable
Hashtable的子类,要求key和value都是String。通常用于配置文件的读取。
TreeMap:
实现了SortedMap接口(是Map的子接口),可以对key自动排序。
TreeSet底层的实现原理使用的就是TreeMap