Q:谈一谈 java 集合框架
A:我觉得应该从以下三个问题来讲
1. 集合框架是什么?
2. 集合框架是用来做什么的?
3. 集合框架的体系结构是什么?
4. 集合框架中三大类型?
首先,它就是一个容器,存放着任意数量且具有相同属性的对象,还对外提供了一系列操作这些对象的方法。
其次,它可以整理数据、简单快速的查询元素、有些集合还提供了一系列排列有序的元素,并且可以在集合中快速的插入和删除、有些集合还提供键值对方式存储,可以通过 key 找到对应的唯一对象。
最后,简单的看一下它的体系结构,可以大致分为两条线:
List:它是以线性方式存储的,可以存放重复元素,也可以存放 null 值。
Set:存储无序元素(存储和获取的顺序不定),值不能重复。
Map:键值对的方式存储。
Q:谈谈 ArrayList、Vector、LinkedList 的区别?
A:关于区别,个人觉得直接从源码分析最为透彻,但是这里我们还是一步步来推演比较方便。
首先,三者都是 List 名下的产物。参考上一个问题,可知其三者相同点。但是其底层数据结构却有不同:ArratList 是动态数组结构,而 LinkedList 却是循环双向链表结构。由数组和链表的区别,可知以下区别:
①:前者改查快,后者增删快。
②:前者支持高效的随机访问,后者必须按序访问。
其次,ArrayList & Vector 的区别:
看似相同都是基于数组的底层结构,但是仍存在众多区别:
①:Vector 是线程安全的,所以增删改查都比 ArrayList 慢。
②:Vector 维护了一个字段,可以通过构造器去设置每次扩容的大小。
③:扩容时,ArrayList 底层数组容量增长到原来的 1.5 倍,Vector 增长到原来的容量的 2 倍。
Q:谈谈 HashSet、TreeSet?
A:首先三者都继承了 Set 的特性,还是有以下的主要区别:
①、HashSet 是基于 hash 表的数据结构,而 TreeSet 是基于红黑树的数据结构,所以,HashSet 的性能总比 TreeSet 好。
②、TreeSet 一般在元素需要排序的情况下使用。
Q:谈谈 HashMap?
A:从下面几个问题来谈?
1. HashMap 的数据结构?
2. HashMap 的工作原理?
3. HashMap 跟其他 XxxMap 的比较?
首先,HashMap 的数据结构:哈希表结构(数组+链表)实现的,但是当链表的长度超过 8 时,链表转换为红黑树。
其次,HashMap 的工作原理,可以从存储对象、获取对象、容量相关、遍历这几个方面来谈。
存储对象时,将 K/V 值传给 put() 方法:
①、获取数组下标:index = (数组大小-1) & hash(K);
②、调整数组大小:元素的个数 > 数组大小 * 负载因子,数组大小扩容为原来的 2 倍;
③、如果 hash(K) 值在 HashMap 中不存在,则执行插入,否则发生碰撞;
④、如果发生碰撞,且两者之间 equals 返回 true,则更新键值对,否则返回 false,插入链表的尾部或者红黑树中。
获取对象时,将 K 传给 get() 方法:
①、获取该键值所在数组下标;
②、顺序遍历链表,equals() 方法查找相同链表中 K 值对应的 V 值。
容量相关:
①、默认容量是 16,也可以构造时设置。
②、扩容时,将 table 数组长度变为原来的两倍。
遍历:
①、只需要 K 值的时候:for-each map.keySet()
②、需要 V 值的时候:for-each map.entrySet()
最后,看看跟 HashMap 相关的比较
Q:HashMap 和 HashTable 有什么区别?
A:①、HashMap 线程不安全,HashTable 线程安全,所以 HashTable 的效率低;
②、HashMap 允许 null 值的存在,而 HashTable 不允许;
③、HashTable 默认数组大小为 16,扩容时扩大 2 倍,HashTable 为 11,扩容时扩大 2倍+1。
④、哈希值的使用不同:HashMap 需要重新计算 hash 值,而 HashTable 直接使用对象的 hashCode。
Q:HashMap,LinkedHashMap,TreeMap 有什么区别?
A:HashMap 参考以上问题
①、LinkedHashMap 保存了记录的插入顺序 FIFO,遍历比 HashMap 慢;
②、TreeMap 保存的记录根据键排序,默认按键值升序。
Q:谈谈 HashMap 哈希运算的细节?为什么这么做?
A:JDK 1.8 中,是通过 hashCode() 的高 16 位异或低 16 位实现的:(h = k.hashCode()) ^ (h >>> 16)。
为了混合原始哈希码的高位和低位,从而加大低位的随机性。