1.存储键值对
2.键不能重复
3.值可以重复
4.无序
1.存储结构:哈希表(数组+链表+红黑树)
2.重复的依据:键的hashCode()方法和equals()方法
static final int DEFAULT_INITIAL_CAPACITY = 16;//hashMap初始容量大小
static final int MAXIMUM_CAPACITY = 1073741824;//hashMap的数组最大容量
static final float DEFAULT_LOAD_FACTOR = 0.75F;//默认加载因子
//默认加载因子:即当容量为100时,当数量达到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 HashMap.Node<K, V>[] table;//哈希表中的数组
transient int size;//元素个数
Node : 就是键值对
(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里的方法;
原文:https://www.cnblogs.com/banshaoyueliang/p/15313910.html