Please enable JavaScript.
Coggle requires JavaScript to display documents.
Map01-HashMap - Coggle Diagram
Map01-HashMap
Map概述
key—value数据具有自我描述性(常用于数据传输)——>记住
Map中存储的都是成对的数据:key—value数据
Map特点
1.Map是Map集合体系的顶级接口
2.Map的一些子实现有序,另一些子实现无序(对于map我们所有研究的要点都在key上)
3.Map不允许存储重复元素(指key)(key重复的定义不一样)
4.Map的有些子实现允许存储null,有些子实现不允许存储null(指key)
HashMap
特点
1.是Map接口的子实现
2.HashMap的底层结构: 数组+链表+红黑树 (jdk1.8之前是单纯的: 数组+链表)
3.底层数组默认初始长度16,底层数组扩容机制:扩为原来的二倍
4.允许存储重复元素
5.不允许存储重复的Key
6..允许Key值为null
7.线程不安全
8.加载因子默认0.75:(什么是加载因子)存储阈值 = 加载因子*数组长度
9.hash值得计算为什么要做^?为了让高位参加运算——>为了充分散列
10.在hashmap中key值重复的定义:hash值是否一样
如果一样比较key是否相等或是否equals
11.hashmap中不允许存储重复的key值,如果重复会用新的value值替换旧的value值
12.hashmap中有可能某个位置是红黑树,如果key值存储到红黑树上,会通过比较key值大小来确定存储位置,同样,如果hash值相等,继续比较key值是否相等或者相equals
13.如果在数组中某个位置散列了多份key-value数据,当存储到8份要存储第9份的时候会由链表转化为红黑树
14.当散列数据达到8份要存储第9份的时候,会不会一定转化为红黑树?不一定,当数组的长度没有达到64的时候,会优先选择扩列,扩列之后会导致原来的数据按照新的数组长度取模/散列,得到新的位置,未必会存在9个元素存在同一位置的情况
15.如果hashmap底层数组长度产生了扩容,原本存在x位置的元素可能不在原来的位置,有可能在x+1的位置,这取决于二进制邻高位是否为1.
16.如果我们在构造方法里指定了数组的长度,那么这个底层数组的长度会变成大于指定长度的最小的2的幂值。
17.如果在删除hashmap元素的时候,会导致红黑树上的元素变少,根节点或者其左右结点,或者其左节点的左节点有一个为null,那么这个红黑树会变为链表。
18.如果hashmap发生了扩容,某个下表的位置存储的是红黑树,该红黑树会被拆分,如果任一部分拆分的结点小于6,那么就没有必要保持红黑树,会转化为链表。
19.默认加载因子0.75,如果非要更改建议在0.5-1之间
HashMap的底层结构(重点 背)
1.JDK1.8之前HashMap底层只有数组和链表;
JDK1.8之后加上了红黑树,目的是提升某些情况下的存储效率
2.key-value是怎么存储到这个数组+链表+红黑树的?
1.拿出key计算 得到一个int类型值
2.把这个计算的值-->和数组长度取模
-->得到了这份key-value数据要存储的数组位置
3.有可能不同的key-value数据中的key值,经过计算以及取模之后,得到的下标是一样的-->构成链表
4.链表可能在不断的添加过程中,过长-->转化成红黑树
3.加载因子:0.75
如果数组长度=16
只能存储12份数据