一、.Map接口:双列数据,存储key-value 键值对的数据的集合。
Map接口的主要实现类:
二、Map结构的理解:
三、HashMap的底层实现原理?以JDK7为例说明
HashMap hashMap = new HashMap():
在实例化以后,底层创建了长度是16的一维数组Entry[] table
…可能已经执行过多此put了…
map.put(key1,value1):
首先调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算以后,得到Entry数组中的存放位置。
如果此位置上的数据为空,此时key1-value1添加成功 -------情况1
如果此位置上的数据不为空(意味着此位置存在一个或多个数据,以链表的形式存在),比较key1和已经存在的一个或多个数据的哈希值:
如果key1的哈希值,与已经存在的数据的哈希值,都不相同。此时key1-value1添加成功。-----情况2
如果key1的哈希值和已经存在的某一个数据(key2-value2)的哈希值相同,继续比较:调用key1所在类的equals(key2)
如果equals()返回false:此时key1-value1添加成功 ----情况3
如果equals()返回true:使用value1替换value2
补充:关于情况2和情况3:此时key1-value1和原来的数据以链表的方式进行存储。
扩容:在不断添加的过程中,会遇到扩容的问题,当超出临界值(且要存放的位置非空)时,扩容,默认的扩容方式:扩容为原来容量的2倍,并将原有的数据复制过来。
JDK8相较于JDK7在底层实现方面的不同:
DEFAULT_INITIALCAPACITY:HashMap的默认容量:16
DEFAULT_LOAD_FACTOR:HashMap的默认加载因子:0.75
threshold:扩容的临界值 =容量*默认加载因子 =12
TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树:8
MIN_TREEIFY_CAPACITY:桶中的Node被树化时,最小的hash表容量为:64