Java集合面试题

写在前面

最近快面试了,收集相关的面试题,也是对自己知识的总结


1 Collection和Collections有什么区别?

Collection 是JDK中集合层次结构中的最根本的接口
Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法,不能实例化,Collection 集合框架的工具类

2 List、Set、Map 之间的区别是什么?

List:有序集合,元素可重复
Set:无序集合,不重复集合
Map:键值对集合,Key无序,唯一;value 允许重复

3 HashMap和Hashtable 有什么区别?

HashMap 线程不安全;Hashtable 中的方法是 线程安全的。
HashMap 的 key 和 value 都是可以是 null,key 只允许一个 null;Hashtable 的 key 和 value 都不可为 null。
默认初始大小和扩容方式不同。HashMap 默认初始大小 16,容量必须是 2 的整数次幂,扩容时将容量变为原来的2倍;Hashtable 默认初始大小 11,扩容时将容量变为原来的 2 倍加 1。

4 ArrayList和LinkedList的区别是什么?

ArrayList 基于动态数组实现的非线程安全的集合;LinkedList 基于双向链表实现的非线程安全的集合。
扩容问题:ArrayList 默认初始化长度为 10,每次扩容为原来的1.5倍,由于ArrayList是基于数组的,所以每次扩容会将原数组中的元素重新拷贝到新数组中(扩容代价高);LinkedList 不存在扩容问题,新增元素放到集合尾部,修改相应的指针节点即可。
对于元素的 get 和 set 方法,一般 ArrayList 的速度要优于 LinkedList。因为 ArrayList 直接通过数组下标直接找到元素;LinkedList 要移动指针遍历每个元素直到找到为止。
新增和删除元素,一般 LinkedList 的速度要优于 ArrayList。因为 ArrayList 在新增和删除元素时,可能扩容和复制数组;LinkedList只需要修改节点指针即可。

5 HashSet实现原理是什么?有什么特点?

HashSet 是基于 HashMap 实现的,查询速度特别快
HashMap 是支持 key 为 null 值的,所以 HashSet 支持添加 null 值
HashSet 存放自定义类时,自定义类需要重写 hashCode() 和 equals() 方法,确保对象的唯一性判断
无序、不可重复

6 介绍下HashMap

在 JDK 1.8 之前是由“数组+链表”组成。因为使用链表的查找性能是 O(n),而使用红黑树是 O(logn),在JDK 1.8及以后,为了提升在 hash 冲突严重时(链表过长)的查找性能,HashMap底层变为“数组+链表+红黑树”的结构
HashMap 还有以下几个重要属性:
1)size:HashMap 已经存储的节点个数;
2)threshold:扩容阈值,当 HashMap 的个数达到该值,触发扩容。 threshold 还会被用来存初始化时的容量。HashMap 直到我们第一次插入节点时,才会对 table 进行初始化,避免不必要的空间浪费。
3)loadFactor:负载因子,扩容阈值 = 容量 * 负载因子。
4)默认初始容量是16。HashMap 的容量必须是2的N次方,HashMap 会根据我们传入的容量计算一个大于等于该容量的最小的2的N次方,例如传 9,容量为16。通过无符号右移的算法得来。


static final int tableSizeFor(int cap) {
    int n = cap - 1;
    n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}

7 HashMap 的插入流程是怎么样的

计算key的hashCode值(可以通过hashCode与高16位做异或运算)
如果数组为空,调用resize初始化列表,
如果key没有碰撞,直接将元素添加到数组中
如果key发生碰撞,进行三种判断,
1)如果key与头结点的key地址相同或者equals后相等,则将新的value覆盖到旧的value
2)如果key与头结点的key不等,对于链表结构,遍历到key地址相同,覆盖旧值;或者循环遍历到某个节点为空,采用尾插法将元素插入。再判断整个链表个数是否超过了红黑树的阈值8且数组size大于64,若满足条件,则转换成红黑树。
3)如果是红黑树结构,就从树的根节点开始遍历,找到key相同的节点对旧value进行覆盖,反之新建节点,放到红黑树对应位置。
如果链表长度大于8或者数组长度大于扩容阈值,进行resize扩容

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值