目录
(1) 用Arrays.asList转List后,如果修改了数组内容,list受影响吗?
(2) List用toArray转数组后,如果修改了List内容,数组受影响吗?
1.3、ArrayList和LinkedList的区别是什么?
HHashMap相关面试题ashMap相关面试题HashMapfa
(3)刚才你多次介绍了hsahmap的扩容,能讲一讲HashMap的扩容机制吗?
(4)刚才你说的通过hash计算后找到数组的下标,是如何找到的呢,你了解hashMap的寻址算法吗?
(6)我看你对hashmap了解的挺深入的,你知道hashmap在1.7情况下的多线程死循环问题吗?
集合框架体系
一、List相关面试题
List
相关面
1.1、ArrayList
- 底层数据结构 :ArrayList底层是用动态的数组实现的。
-
初始容量 : ArrayList 初始容量为 0 ,当第一次添加数据的时候才会初始化容量为 10
-
扩容逻辑:ArrayList 在进行扩容的时候是原来容量的 1.5 倍,每次扩容都需要拷贝数组。
1.2、如何实现数组和List之间的转换?
- 数组转List ,使用JDK中java.util.Arrays工具类的asList方法
- List转数组,使用List的toArray方法。无参toArray方法返回 Object数组,传入初始化长度的数组对象,返回该对象数组
(1) 用Arrays.asList转List后,如果修改了数组内容,list受影响吗?
Arrays.asList
转换
list
之后,如果修改了数组的内容,
list
会受影响,因为它的底层使用的Arrays
类中的一个内部类
ArrayList
来构造的集合,在这个集合的构造器中,把我们传入的这个集合进行了包装而已,最终指向的都是同一个内存地址。
(2) List用toArray转数组后,如果修改了List内容,数组受影响吗?
list
用了
toArray
转数组后,如果修改了
list
内容,数组不会影响,当调用了
toArray以后,在底层是它是进行了数组的拷贝,跟原来的元素就没啥关系了,所以即使list修改了以后,数组也不受影响。
1.3、ArrayList和LinkedList的区别是什么?
(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都不是线程安全的
- 如果需要保证线程安全,有两种方案:
- 在方法内使用,局部变量则是线程安全的
- 使用线程安全的ArrayList和LinkedList
HHashMap相关面试题ashMap相关面试题HashMapfa
二、HashMap相关面试题
1、红黑树
红黑树(
Red Black Tree
)
:也是一种自平衡的二叉搜索树
(BST)
,之前叫做平衡二叉B
树(
Symmetric Binary B-Tree
)
红黑树的特质:
- 性质1:节点要么是红色,要么是黑色
- 性质2:根节点是黑色
- 性质3:叶子节点都是黑色的空节点
- 性质4:红黑树中红色节点的子节点都是黑色
- 性质5:从任一节点到叶子节点的所有路径都包含相同数目的黑色节点
在添加或删除节点的时候,如果不符合这些性质会发生旋转,以达到所有的性质,保证红黑树的平衡。
2、说一下HashMap的实现原理?
HashMap的数据结构: 底层使用hash表数据结构,即数组和链表或红黑树
- 当我们往HashMap中put元素时,利用key的hashCode重新hash计算出当前对象的元素在数组中的下标
- 存储时,如果出现hash值相同的key,此时有两种情况。
- a. 如果key相同,则覆盖原始值;
- b. 如果key不同(出现冲突),则将当前的key-value放入链表或红黑树中
- 获取时,直接找到hash值对应的下标,在进一步判断key是否相同,从而找到对应值。
HashMap的jdk1.7和jdk1.8有什么区别?
- JDK1.8之前采用的是拉链法。拉链法:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。
- jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8) 时并且数组长度达到64时,将链表转化为红黑树,以减少搜索时间。扩容resize( ) 时,红黑树拆分成的树的结点数小于等于临界值6个,则退化成链表
3、讲一讲HashMap的扩容机制?
4、HashSet与HashMap的区别?
(1)HashSet
实现了
Set
接口
,
仅存储对象
; HashMap
实现了
Map
接口
,
存储的是键值
对
.
(2)HashSet
底层其实是用
HashMap
实现存储的
, HashSet
封装了一系列
HashMap
的
方法
.
依靠
HashMap
来存储元素值
,(
利用
hashMap
的
key
键进行存储
),
而
value
值默
认为
Object
对象
.
所以
HashSet
也不允许出现重复值
,
判断标准和
HashMap
判断标准
相同
,
两个元素的
hashCode
相等并且通过
equals()
方法返回
true。