Java集合每日一考-2
1.Map存储数据的特点是什么?并指明key,value,entry存储数据的特点。
Map存储的是双列数据,key-value对数据
key:无序的、不可重复的→Set存储
value:无序的、可重复的 –→Collection存储
key-value:无序的、不可重复 →Set存储
2.描述HashMap的底层实现原理(jdk 8版)
HashMap是数组+链表+红黑树实现
数组:Node类型。单个Node:Hash、key、value、Next组成
当链表数量大于8时,结构转化为红黑树
HashMap的内部存储结构其实是数组+链表+树的结合。当实例化一个 HashMap时,会初始化initialCapacity和loadFactor,在put第一对映射关系 时,系统会创建一个长度为initialCapacity的Node数组,这个长度在哈希表 中被称为容量(Capacity),在这个数组中可以存放元素的位置我们称之为 “桶”(bucket),每个bucket都有自己的索引,系统可以根据索引快速的查 找bucket中的元素。
每个bucket中存储一个元素,即一个Node对象,但每一个Node对象可以带 一个引用变量next,用于指向下一个元素,因此,在一个桶中,就有可能 生成一个Node链。也可能是一个一个TreeNode对象,每一个TreeNode对象 可以有两个叶子结点left和right,因此,在一个桶中,就有可能生成一个 TreeNode树。而新添加的元素作为链表的last,或树的叶子结点。
当HashMap中的元素个数超过数组大小(数组总大小length,不是数组中个数 size)*loadFactor 时 , 就会进行数组扩容 , loadFactor 的默认 值 (DEFAULT_LOAD_FACTOR)为0.75,这是一个折中的取值。也就是说,默认 情况下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中 元素个数超过16*0.75=12(这个值就是代码中的threshold值,也叫做临界值) 的时候,就把数组的大小扩展为 2*16=32,即扩大一倍,然后重新计算每个元 素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知 HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。 当HashMap中的其中一个链的对象个数如果达到了8个,此时如果capacity没有 达到64,那么HashMap会先扩容解决,如果已经达到了64,那么这个链会变成 树,结点类型由Node变成TreeNode类型。当然,如果当映射关系被移除后, 下次resize方法时判断树的结点个数低于6个,也会把树再转为链表。
3.Map中常用实现类有哪些?各自有什么特点?
HashMap:数组+链表+红黑树
LinkedHashMap:使用了一对双向链表来记录添加 元素的顺序
TreeMap:TreeMap 可以保证所有的 Key-Value 对处于有序状态
Hashtable:TreeMap 可以保证所有的 Key-Value 对处于有序状态
4.如何遍历Map中的key-value对,代码实现
1 class Test1 { 2 public static void main(String[] args) { 3 Employee fantao = new Employee("fantao", 25, new MyDate(1997, 4, 9)); 4 Employee fengfeng = new Employee("fengfeng", 25, new MyDate(1996, 12, 9)); 5 Employee keke = new Employee("keke", 3, new MyDate(2019, 4, 5)); 6 Employee maodou = new Employee("maodou", 1, new MyDate(2020, 9, 9)); 7 Employee pang = new Employee("pang", 1, new MyDate(2020, 9, 9)); 8 9 10 HashMap hashMap = new HashMap(); 11 hashMap.put(1,fantao); 12 hashMap.put(2,fengfeng); 13 hashMap.put(3,keke); 14 hashMap.put(4,pang); 15 hashMap.put(5,maodou); 16 //遍历所有的key-value方式一:entrySet 17 Set entrySet = hashMap.entrySet(); 18 Iterator iterator1 = entrySet.iterator(); 19 while (iterator1.hasNext()){ 20 Object obj = iterator1.next(); 21 Map.Entry entry = (Map.Entry) obj; 22 System.out.println(entry.getKey()+"---->"+entry.getValue()); 23 } 24 //遍历所有的key-value方式二: 25 Set keySet = hashMap.keySet(); 26 Iterator iterator2 = keySet.iterator(); 27 while (iterator2.hasNext()){ 28 Object key = iterator2.next(); 29 Object value = hashMap.get(key); 30 System.out.println(key+"_____"+value); 31 } 32 33 } 34 35 }
5.Collection和Collections的区别?
存储单列集合的一个接口,内部有常用的List和Set接口
Collections是操作Collection和Map的一个工具类