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的一个工具类

 

posted @ 2022-02-27 23:58  Fancy[love]  阅读(31)  评论(0编辑  收藏  举报