Java集合面试

文章目录

Java集合框架

说说有哪些常见的集合?

集合相关类和接口都在Java.util中,主要分为3种:List(列表)、Map(映射)、Set(集)。

ArrayList和LinkedList的区别?

ArrayList基于动态数组实现,所以它的查找效率高,增删效率慢

LinkedList基于双向循环链表实现,它的查找效率低,增删效率快

List和Set的区别?

List:有序,按对象进入的顺序保存对象,可重复,允许多个null元素对象,可以使用迭代器去除所有元素,再逐一遍历,也可使用get(int index)获取指定下标的元素。

set:无序,不可重复,最多允许有一个null元素对象,取元素时只能通过iterator迭代器接口取得所有元素,再逐一遍历各个元素。

HashMap的数据结构?把你了解的所有都讲一讲?

数据结构:

1.7 数组+链表 1.8 采用数组+链表+红黑树

数组用来确定元素的位置;链表用来解决哈希冲突;红黑树提高查询效率

红黑树:

​ 根节点必须是黑色

​ 所有结点非黑即红

​ 红结点两个子结点一定是黑色

​ 任意结点到叶子结点,包含的黑色结点数目相同

put流程

​ 1.首先hash算法计算出哈希值

​ 2.判断数组是否需要扩容,是就执行resize方法扩容

​ 3.然后根据哈希值去数组寻找下标

​ 4.判断下标对应位置是否为空

​ 是的话就直接插入

​ 否的话就判断key是否相同

​ 相同的话直接覆盖

​ 不相同转到5

​ 5.判断是否为树节点(判断是否为红黑树)

​ 是的话在树中插入键值对

​ 否的话进行下一步

​ 6.遍历链表,判断key是否存在,

​ 存在的话就覆盖

​ 不存在的话插入链表尾部

​ 插入之后判断链表长度是否>8

​ 大于转为红黑树

​ 不大于就结束

​ 7.判断容量是否达到扩容阈值

​ 是就执行resize方法扩容

​ 否就结束

Hashmap的resize方法的执行过程?

两种情况会调用resize方法

1.第一次调用Hashma的put方法时,会调用resize方法对table数组进行初始化,如果不传入指定值,默认为16.

2.扩容时会调用resize方法,即size大于数组阈值threshold时,数组大小翻倍。

get流程

​ 1.根据哈希值到数组对应下标寻找元素

​ 判断是否是要查找的元素

​ 是就返回

​ 2.判断是否为树节点

​ 是就遍历红黑树查找

​ 3.判断是否为链表

​ 是就遍历链表查找

JDK8 HashMap为什么引入红黑树?解决了什么问题?

引入红黑树我认为是这样,当产生hash冲突时会形成链表,当数据多了冲突多了,链表会越来越长,造成链化,此时查询特别耗时间,本来时间复杂度为O(1)结构可能达到O(n),引入红黑树可以优化查询。

HashMap什么情况下会触发扩容呢?

当它未初始化,第一个put时会触发扩容。后面插入值,当大于扩容阈值时

HashMap与ConcurrentHashMap的区别是什么?

HashMap不是线程安全的,而ConcurrentHashMap是线程安全的.

ConcurrentHashMap采用锁分段技术,整个ConcurrentHashMap由一个个Segment组成,Segment通过继承ReentrantLock来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个Segment是线程安全的,也就实现了全局的线程安全。

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap和HashTable的区别?

HashMap线程不安全(效率高), 也可以使用Collections.synchronizedMap(hashMap)使其实现同步,Hashtable线程安全(效率比较低)

HashMap的key和value都允许为null,而Hashtable的key和value都不允许为null,Hashtable遇到null,直接返回NullPointerException

HashCode和equals方法?

如果两个对象相等,则hashCode一定也是相同的

两个对象的hashcode值相同,它们不一定是相等的

equals方法被重写,则hashCode方法也必须被重写

相关推荐
weixin_448771722 分钟前
使用xml模板导出excel
xml·java·excel
_一条咸鱼_28 分钟前
大厂Android面试秘籍:Activity 窗口管理模块(四)
android·面试·android jetpack
请叫我飞哥@29 分钟前
在 Visual Studio Code 中安装 Python 环境
ide·vscode·python
烁34741 分钟前
每日一题(小白)模拟娱乐篇27
java·数据结构·算法·娱乐
Python之栈1 小时前
PINN:用深度学习PyTorch求解微分方程
人工智能·python·数据分析
黑客老李1 小时前
面试经验分享 | 成都渗透测试工程师二面面经分享
经验分享·面试·职场和发展
狂炫一碗大米饭1 小时前
快刷每日面经😋
前端·面试
魔道不误砍柴功1 小时前
2025年Java无服务器架构实战:AWS Lambda与Spring Cloud Function深度整合
java·架构·serverless
豌豆花下猫1 小时前
Python 潮流周刊#97:CUDA 终于原生支持 Python 了!(摘要)
后端·python·ai
随机惯性粒子群1 小时前
mujoco graspnet 仿真项目的复现记录
python·机器学习·机械臂·graspnet·mujcoo