Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。
Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式 。
当new一个 HashMap不给任何参数的时候,大小为0
HashMap<String,Integer> map = new HashMap<>();
1.HashMap什么时候开辟bucket数组占用内存?
在第一次put的时候才开辟内存。
1.首先对key求 hashcode,第一次put的时候,容量才真正有了,大小是16
2.然后找下标尾插
3.处理红黑树:当数组容量大于64,且链表的长度超过8
2.当 new 一个HashMap给参数时大小是多少
假设给的容量是19,那么HashMap的大小就是25也就是32,通过源码可以看到,
也就是说HashMap的大小一定是2的多少次幂,且 2n >= 给的容量大小。这个2次幂一定是大于等于你给的容量。
3.HashMap何时扩容?
根据负载因子0.75,大于0.75就会扩容
4.当两个对象HashCode相同会发生什么?
会发生哈希碰撞
5.如果两个键的 HashCode 相同,如何获取值对象?
在当前 HashCode 的数组位置开始遍历链表
6.重新调整HashMap大小存在什么问题吗?
会直接重新哈希
1.Map中存放键值对的Key是唯一的,value是可以重复的
2.Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复
3.Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)
4.Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入
1.Set是继承自Collection的一个接口类
2.Set中只存储了key,并且要求key一定要唯一
3.Set的底层是使用Map来实现的,其使用key与Object的一个默认对象作为键值对插入到Map中的
4.Set最大的功能就是对集合中的元素进行去重
5.实现Set接口的常用类有TreeSet和HashSet,还有一个LinkedHashSet,LinkedHashSet是在HashSet的基础上维护了一个双向链表来记录元素的插入次序
6.Set中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入