1.Map
1.1HasMap:
作为Map的主要实现类;线程不安全的,效率高;存储null的key和value
-
快速存储 :比如当我们对hashmap进行get和put的时候速度非常快
-
快速查找(时间复杂度o(1))
-
可伸缩:1数组扩容,边长。2,单线列表如果长度超过8的话会变成红黑树
1.2 LinkedHasMap
保证在遍历map元素时,可以照添加的顺序实现遍历。 原因:在原的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。 对于频繁的遍历操作,此类执行效率高于HashMap。
1.3 TreeMap
保证照添加的key-value对进行排序,实现排序遍历。此时考虑key的自然排序或定制排序 ,底层使用红黑树
1.4Hastable
作为古老的实现类;线程安全的,效率低;不能存储null的key和value
1.5Properties
常用来处理配置文件。key和value都是String类型
HasMap底层原理:
HashMap的底层: 数组+链表 (JDK 7.0及之前) 数组+链表+红黑树 (JDK 8.0以后)
扩充原则:
-
默认容量:16
-
默认加载因子:0.75 加载因子 = 填入表中的元素个数 / 散列表的长度 加载因子越大,填满的元素越多,空间利用率越高,但发生冲突的机会变大了;
加载因子越小,填满的元素越少,冲突发生的机会减小,但空间浪费了更多了,而且还会提高扩容rehash操作的次数。
-
扩容的临界值:16*0.75=12
-
当数组的某一个索引位置上的元素以链表的形式存在的数据个数 > 8 且当前数组的长度 > 64时,此时此索引位置上的所有数据改为使用红黑树存储
-
源码:
-
判断数组是否为空,为空通过resize()方法创建一个新的数组
-
判断key,使用hash算法计算hash值
-
不为空,比较哈希值有无冲突
-
不冲突直接存放在数组中
-
判equals以下逻辑建立在equlas为false情况
-
冲突,若此时的数据结构是红黑树,那就直接插入红黑树中
-
冲突,若此时的数据结构是链表,判断插入之后是否大于等于8
-
插入之后大于8了,就要先调整为红黑树,在插入
-
插入之后不大于8,那么就直接插入到链表尾部即可。
-
-
-
-