集合常见的面试题

1. List,Set,Map的区别

        List是有序可重复的

        Set是无序不可重复的

        Map是通过键值对来操作元素的key是无序不可重复的,value是无序可重复的

2. ArrayList和LinkedList的区别是什么?

        ArrayList底层通过动态数组实现的LinkedList底层通过双向链表实现的

        ArrayList支持快速随机访问。

        ArrayList在查找的效率更高时间复杂度为O(1) 

        LinkedList在增删的效率更高时间复杂度为O(1)

3.ArrayList的扩容机制

        ArrayList初始大小为10每次扩容是之前的1.5倍。当需要扩容时就会创建一个新数组这个新数组就是旧数组的1.5倍然后将旧数组中的元素复制到新数组中。

4. ArrayList和Vector的区别是什么?

        ArrayList是非线程安全的Vector是线程安全的通过同步锁来实现线程安全的

        ArrayList默认扩容是之前的1.5倍Vector默认扩容2倍

5.HashMap在JDK1.7和JDK1.8中有哪些不同?HashMap的底层实现?

        HashMap在1.7是通过数组+链表来实现的,在1.8的时候使用数组+链表+红黑树来实现的

        在1.7的时候采用头插法,在1.8的时候采用尾插法。

6. 为啥要使用红黑树

        主要为了降低哈希冲突和解决链表过长的效率问题。红黑树有自平衡性能保证插入和删除保证O(logn)的时间复杂度

7.说一下 HashMap 的实现原理

        HashMap在jdk1.7通过数组+链表实现的在jdk1.8使用数组+链表+红黑树实现的,当链表长度大于8数组长度小于64链表就会转为红黑树,当红黑树节点小于8j就会转为链表。

        HashMap初始容量为16每次扩容都是之前的2次幂。

8.为啥HashMap每次扩容都是之前的二次幂

        HashMap的key通过哈希值来确定位置的他里面用的(length-1)&hash值来替代%操作提高性能

9. HashMap的put方法的具体流程?

        首先会确定数组是否为空,若为空就进行初始化大小为16的数组若不为空通过key计算hash值根据hash值计算数组下标,然后判断该数组下标是否有值,如果有值判断key是否相等相等的话进行覆盖,不相等的话判断当前节点是否为红黑树,如果为红黑树转为红黑树节点直接插入,如果为链表遍历链表判断key是否有相等的有的话就直接覆盖没有则在链表尾部插入当链表长度大于8并且数组长度大于64就会转为红黑树。

10.HashMap的扩容操作是怎么实现的?

       首先会创建一个新数组是之前的两倍

        遍历旧数组中的每个链表和红黑树

        如果是链表则重新计算链表中每个元素的下标并放到新数组中

        如果是红黑树则先遍历红黑树并计算每个红黑树的节点对应的数组下标的位置然后放到新数组中。

        统计数组中的每个位置的元素个数

        如果元素个数大于8就会转为红黑树将红黑树的根节点插入到当前位置

        如果元素个数小于8就会转为链表将链表插入到当前位置

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值