Java常见集合(含2024最近面试题)

目录

集合框架体系

一、List相关面试题

1.1、ArrayList

 1.2、如何实现数组和List之间的转换? 

(1) 用Arrays.asList转List后,如果修改了数组内容,list受影响吗?

(2) List用toArray转数组后,如果修改了List内容,数组受影响吗?

1.3、ArrayList和LinkedList的区别是什么?

HHashMap相关面试题ashMap相关面试题HashMapfa

二、HashMap相关面试题

​        1、红黑树

2、说一下HashMap的实现原理?

 3、讲一讲HashMap的扩容机制? 

4、HashSet与HashMap的区别?

5、HashTable与HashMap的区别?

二、真实面试题

(1)说一下HashMap实现原理?

​编辑(2)说一下HashMap的put方法的具体流程?

(3)刚才你多次介绍了hsahmap的扩容,能讲一讲HashMap的扩容机制吗?

(4)刚才你说的通过hash计算后找到数组的下标,是如何找到的呢,你了解hashMap的寻址算法吗?

(5)为何HashMap的数组长度一定是2的次幂?

(6)我看你对hashmap了解的挺深入的,你知道hashmap在1.7情况下的多线程死循环问题吗?

(7)hashmap是线程安全的吗?

(8)HashSet与HashMap的区别?

(9)HashTable与HashMap的区别?

集合框架体系

一、List相关面试题

List 相关面

1.1、ArrayList

  • 底层数据结构 ArrayList底层是用动态的数组实现的。
  • 初始容量 ArrayList 初始容量为 0 ,当第一次添加数据的时候才会初始化容量为 10
  • 扩容逻辑:ArrayList 在进行扩容的时候是原来容量的 1.5 倍,每次扩容都需要拷贝数组。

 1.2、如何实现数组和List之间的转换? 

  • 数组转List ,使用JDKjava.util.Arrays工具类的asList方法
  • List转数组,使用ListtoArray方法。无参toArray方法返回 Object数组,传入初始化长度的数组对象,返回该对象数组

(1) 用Arrays.asListList后,如果修改了数组内容,list受影响吗?

Arrays.asList 转换 list 之后,如果修改了数组的内容, list 会受影响,因为它的底层使用的Arrays 类中的一个内部类 ArrayList 来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址。

(2) ListtoArray转数组后,如果修改了List内容,数组受影响吗?

list 用了 toArray 转数组后,如果修改了 list 内容,数组不会影响,当调用了 toArray以后,在底层是它是进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。

1.3、ArrayListLinkedList的区别是什么?

(1)底层数据结构

  • ArrayList 是动态数组的数据结构实现
  • LinkedList 是双向链表的数据结构实现

(2)操作数据效率

  •  ArrayList按照下标查询的时间复杂度O(1)【内存是连续的,根据寻址公式】, LinkedList不支持下标查询。
  • 查找(未知索引): ArrayList需要遍历,链表也需要链表,时间复杂度都是O(n)
  • 新增和删除
    • ArrayList尾部插入和删除,时间复杂度是O(1);其他部分增删需要挪动数组,时间复杂度是O(n)
    • LinkedList头尾节点增删时间复杂度是O(1),其他都需要遍历链表,时间复杂度是O(n)
  • 内存空间占用
    • ArrayList底层是数组,内存连续,节省内存
    • LinkedList 是双向链表需要存储数据,和两个指针,更占用内存
  • 线程安全
    • ArrayList和LinkedList都不是线程安全的
    • 如果需要保证线程安全,有两种方案:
      • 在方法内使用,局部变量则是线程安全的
      • 使用线程安全的ArrayListLinkedList

HHashMap相关面试题ashMap相关面试题HashMapfa

二、HashMap相关面试题

1、红黑树

红黑树( Red Black Tree :也是一种自平衡的二叉搜索树 (BST) ,之前叫做平衡二叉B 树( Symmetric Binary B-Tree

红黑树的特质:
  • 性质1:节点要么是红色,要么是黑色
  • 性质2:根节点是黑色
  • 性质3:叶子节点都是黑色的空节点
  • 性质4:红黑树中红色节点的子节点都是黑色
  • 性质5:从任一节点到叶子节点的所有路径都包含相同数目的黑色节点
在添加或删除节点的时候,如果不符合这些性质会发生旋转,以达到所有的性质,保证红黑树的平衡。

2、说一下HashMap的实现原理?

HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树

  • 当我们往HashMapput元素时,利用keyhashCode重新hash计算出当前对象的元素在数组中的下标
  • 存储时,如果出现hash值相同的key,此时有两种情况。
    • a. 如果key相同,则覆盖原始值;
    • b. 如果key不同(出现冲突),则将当前的key-value放入链表或红黑树中
  • 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。

HashMapjdk1.7jdk1.8有什么区别?

  • JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
  • jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8) 时并且数组长度达到64时,将链表转化为红黑树,以减少搜索时间。扩容resize( ) 时,红黑树拆分成的树的结点数小于等于临界值6个,则退化成链表

 3、讲一讲HashMap的扩容机制? 

4、HashSetHashMap的区别?

(1)HashSet 实现了 Set 接口 , 仅存储对象 ; HashMap 实现了 Map 接口 , 存储的是键值
.
(2)HashSet 底层其实是用 HashMap 实现存储的 , HashSet 封装了一系列 HashMap
方法 . 依靠 HashMap 来存储元素值 ,( 利用 hashMap key 键进行存储 ), value 值默
认为 Object 对象 . 所以 HashSet 也不允许出现重复值 , 判断标准和 HashMap 判断标准
相同 , 两个元素的 hashCode 相等并且通过 equals() 方法返回 true。

5、HashTableHashMap的区别?

二、真实面试题

(1)说一下HashMap实现原理?

(2)说一下HashMap的put方法的具体流程?

(3)刚才你多次介绍了hsahmap的扩容,能讲一讲HashMap的扩容机制吗?

(4)刚才你说的通过hash计算后找到数组的下标,是如何找到的呢,你了解hashMap的寻址算法吗?

(5)为何HashMap的数组长度一定是2的次幂?

(6)我看你对hashmap了解的挺深入的,你知道hashmap1.7情况下的多线程死循环问题吗?

(7)hashmap是线程安全的吗?

(8)HashSetHashMap的区别?

(9)HashTableHashMap的区别?

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值