java集合面试题

103 阅读3分钟

欢迎关注WX公众号:“程序猿补课班”,分享Java相关技术知识,学习经验,面试经验等。小伙伴快来补课吧!

正文开始

1.说说常见的集合有哪些吧?

  • Collection接口的子接口包括:Set接口和List接口
  • Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap等
  • Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等
  • List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等

2.List 和 Set,Map 的区别 ?

ListSetMap
允许重复元素不能存放重复元素键值对存储,键必须惟一,值能够重复
能够插入多个null元素只可以一个null元素键只可以一个null,值能够有多个null
有序无序无序

3.HashSet和TreeSet有什么区别?

HashSetTreeSet
底层是由哈希表实现的底层是由红黑树实现
元素没有顺序元素有顺序性

4.Arraylist与LinkedList 区别 ?

ArraylistLinkedList
基于动态数组的数据结构基于链表的数据结构
查询快更新快

5.说一说 HashMap 底层数据结构?

HashMap 底层是 数组 + 链表 + 红黑树 的数据结构。

6.HashMap中PUT方法的流程?

  1. 通过key计算出一个hashcode
  2. 通过hashcode与“与操作”计算出一个数组下标
  3. 在把put进来的key,value封装为一个entry对象
  4. 判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
  5. 如果该下标对应的位置不为空,则需要把entry插入到链表中
  6. 并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
  7. 如果是JDK7,则使用头插法
  8. 如果是JDK8,则会遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中

7.什么是哈希冲突?

当两个不同的输入值,根据同一散列函数计算出相同的散列值的现象,我们就把它叫做碰撞(哈希碰撞)

8.hash 冲突时怎么办?

  • hash 冲突指定是 key 值的 hashcode 计算相同,但 key 值不同的情况。
  • 如果桶中的元素原本只有一个或已经是链表了,新增元素直接追加到链表尾部;
  • 如果桶中元素已经是链表,并且链表个数大于等于 8 时,此时有两种情况:
  • 如果数组大小小于 64,数组再次扩容,链表不会转化为红黑树;
  • 如果数组大小大于 64 时,链表就会转化为红黑树。
  • 这里不仅仅判断了链表元素个数大于等于 8,还判断了数组大小,数组容量小于 64 没有立即转化的原因,猜测主要是因为红黑树占用的空间比链表大很多,转化也比较耗时,所以数组容量小的情况下冲突严重,我们可以先尝试扩容,看看能否通过扩容来解决冲突的问题。

9.HashMap是怎么解决哈希冲突的?

开放定址法、链地址法(拉链法)、再哈希法、建立公共溢出区等方法 参考:

www.cnblogs.com/weigy/p/125…

10.HashSet是如何保证数据不可重复的?

由于HashMap的K值本身就不允许重复,并且在HashMap中如果K/V相同时,会用新的V覆盖掉旧的V,然后返回旧的V,那么在HashSet中执行这一句话始终会返回一个false,导致插入失败,这样就保证了数据的不可重复性;

[如有错漏之处,敬请指正]