1.Map的特点:存储的是键值对
2.Map中的键值对可以看成一个Entry
(Map中的键值对在存储底层创建一个Node类的对象,并把键值对的内容放到该对象的属性中,Node实现了Entry接口)
3.Map中的key是无序的不可重复的。向Map中的Key添加的自定义类的对象必须重写hashCode和equals方法
可以把所有的key开成是Set集合
4.Map中的value是无序的可重复的,想Map中的value添加自定义类的对象必须重写equals
可以把所有的value看成是collection的集合
5.Map中的Entry(Node)是无序的不可重复的,Entry在数组的位置是有key决定的.
三 Set的再说明
1.HashSet的底层就是HashMap,向HashSet中添加的数据实际上添加到了HashMap的key中
因为HashMap的key必须重写hashCode和equals方法所以向HashSet中添加的内容必须重写hashCode和equals方法
四:面试题
1.HashMap和Hashtable 的区别?
hashMap 是线程不安全的,Hashtable是线程安全的,hashtable 的key 和value 不能为null
hashMap 的key 和 value 可以为null,hashtable是jdk1.0时出现的类
2.HashMap的底层实现原理?
当我们向集合中添加了k1,v1,时,首先根据k1哈希值决定元素存放的位置,如果该位置上没有元素,则直接存储
如果该位置上已经存在其他元素k2,v2那么调用equals方法让k1和k2进行比较,如果结果为true那么value进行覆盖v2覆盖v1。
如果equals结果为false那么将以链表的形式存放元素,在jdk1.8时,当链表上元素数量达到8时
那么链表会替换成红黑树
3.为什么要扩容2倍…?
16 ,32,64 …
15, 31, 63
像15,31,63这些数值的二进制最后几位全部是1.
如果最后几位全部是1的话那么hash值是多少都能得到015,031,0~63
(数组上的每一个索引位置都可能算到,否则一定有些索引位置将永远无法得到,也就是将永远无法存数据)
1111
0000
-----
1111
1111
0100
----
0100
1111
x
----
x
如果不是1111存在的问题
1011
0100
----
0000
1011
0111
----
0011 注意 :那么将有一些数值永远无法得到
五 :HashMap的构造器:
new HashMap() : 底层会创建一个长度为16的数组(Node类型),加载因子为0.75,当我们向集合中添加的数据
超过12 (16 * 0.75)时便会扩容,扩容为原来的2倍。