Java集合面试题专题
Java集合面试题专题该为北京面试面试题记录不喜勿喷什么是hash碰撞如果两个元素不相同,但是hash函数的值相同,这两个元素就是一个碰撞因为把任意长度的字符串变成固定长度的字符串,所以存在一个hash对应多个字符串的情况,所以碰撞必然存在hashMap默认容量为什么是16- 默认容量都是 16 负载因子是 0.75 。就是当 HashMap 填充了 75% 的 busket 是就会扩容最小的可能性是16 * 0.75 12为了减少hash值的碰撞,需要实现一个尽量均匀分布的hash函数,在HashMap中通过利用key的hashcode值,来进行位运算公式:index e.hash (newCap - 1)反观长度16或者其他2的幂,length - 1的值是所有二进制位全为1,这种情况下,index的结果等同于hashcode后几位的值 只要输入的hashcode本身分布均匀,hash算法的结果就是均匀的所以,**HashMap的默认长度为16,是为了降低hash碰撞的几率参考文章HashMap 的长度为什么是 2 的幂次方为了能让 HashMap 存取高效尽量较少碰撞也就是要尽量把数据分配均匀每个链表/红黑树长度大致相同。这个实现就是把数据存到哪个链表/红黑树中的算法。参考地址HashMap实现原理·Java 中最常用的两种结构是数组和模拟指针引用几乎所有的数据结构都可以利用这两种来组合实现HashMap 也是如此。实际上 HashMap 是一个“链表散列”。HashMap 是基于 hashing 的原理。HashMap由数组链表组成的数组是HashMap的主体链表则是主要为了解决哈希冲突而存在的如果定位到的数组位置不含链表当前entry的next指向null,那么对于查找添加等操作很快仅需一次寻址即可参考文章·我们使用 #put(key, value) 方法来存储对象到 HashMap 中使用 get(key) 方法从 HashMap 中获取对象。 当我们给 #put(key, value) 方法传递键和值时我们先对键调用 #hashCode() 方法返回的 hashCode 用于找到 bucket 位置来储存 Entry 对象。多线程调用HashMap导致的问题主要是多线程同时put时如果同时触发了rehash操作会导致HashMap中的链表中出现循环节点进而使得后面get的时候会死循环cup飙升至100%文章与HashTable的区别HashTable和HashMap的实现原理几乎一样差别无非是1.HashTable不允许key和value为null2.HashTable是线程安全的。但是HashTable线程安全的策略实现代价却太大了简单粗暴get/put所有相关操作都是synchronized的这相当于给整个哈希表加了一把大锁多线程访问时候只要有一个线程访问或操作该对象那其他线程只能阻塞相当于将所有的操作串行化在竞争激烈的并发场景中性能就会非常差。ConcurrentHashMap实现原理ConcurrentHashMap是由Segment数组结构和HashEntry数组结构组成。Segment是一种可重入锁ReentrantLock在ConcurrentHashMap里扮演锁的角色HashEntry则用于存储键值对数据。一个ConcurrentHashMap里包含一个Segment数组Segment的结构和HashMap类似是一种数组和链表结构 一个Segment里包含一个HashEntry数组每个HashEntry是一个链表结构的元素 每个Segment守护者一个HashEntry数组里的元素,当对HashEntry数组的数据进行修改时必须首先获得它对应的Segment锁。扩容扩容的时候首先会创建一个两倍于原容量的数组然后将原数组里的元素进行再hash后插入到新的数组里。为了高效ConcurrentHashMap不会对整个容器进行扩容而只对某个segment进行扩容。ConcurrentHashMap的锁分段技术首先将数据分成一段一段的存储然后给每一段数据配一把锁当一个线程占用锁访问其中一个段数据的时候其他段的数据也能被其他线程访问。有些方法需要跨段比如size()和containsValue()它们可能需要锁定整个表而而不仅仅是某个段这需要按顺序锁定所有段操作完毕后又按顺序释放所有段的锁。这里“按顺序”是很重要的否则极有可能出现死锁在ConcurrentHashMap内部段数组是final的并且其成员变量实际上也是final的但是仅仅是将数组声明为final的并不保证数组成员也是final的这需要实现上的保证。这可以确保不会出现死锁因为获得锁的顺序是固定的。参考ConcurrentHashMap的读是否要加锁为什么不加锁在1.8中ConcurrentHashMap的get操作全程不需要加锁这也是它比其他并发集合比如hashtable、用Collections.synchronizedMap()包装的hashmap;安全效率高的原因之一。 get操作全程不需要加锁是因为Node的成员val是用volatile修饰的和数组用volatile修饰没有关系。 数组用volatile修饰主要是保证在数组扩容的时候保证可见性。参考文章ConcurrentHashMap的迭代器是强一致性的迭代器还是弱一致性的迭代器弱一致性在这种迭代方式中当iterator被创建后集合再发生改变就不再是抛出ConcurrentModificationException取而代之的是在改变时new新的数据从而不影响原有的数据iterator完成后再将头指针替换为新的数据这样iterator线程可以使用原来老的数据而写线程也可以并发的完成改变更重要的这保证了多个线程并发执行的连续性和扩展性是性能提升的关键。HashMap 和 ConcurrentHashMap 的区别oncurrentHashMap 是线程安全的 HashMap 的实现;1、ConcurrentHashMap 对整个桶数组进行了分割分段(Segment)然后在每一个分段上都用 lock 锁进行保护相对 于Hashtable 的 syn 关键字锁的粒度更精细了一些并发性能更好。而 HashMap 没有锁机制不是线程安全的。JDK8 之后ConcurrentHashMap 启用了一种全新的方式实现,利用 CAS 算法。2、HashMap 的键值对允许有 null 但是 ConCurrentHashMap 都不允许。HashSet实现原理HashSet中不允许有重复元素这是因为HashSet是基于HashMap实现的HashSet中的元素都存放在HashMap的key上面而value中的值都是统一的一个private static final Object PRESENT new Object();。HashSet跟HashMap一样都是一个存放链表的数组。整理 1HashSet底层由HashMap实现 2HashSet的值存放于HashMap的key上 3HashMap的value统一为PRESENTHashSet 和 TreeSet 的区别1、 TreeSet 是二差树实现的,Treeset中的数据是自动排好序的不允许放入null值。 2、HashSet 是哈希表实现的,HashSet中的数据是无序的可以放入null但只能放入一个null两者中的值都不能重复就如数据库中唯一约束。 3、HashSet要求放入的对象必须实现HashCode()方法放入的对象是以hashcode码作为标识的而具有相同内容的 String对象 hashcode是一样所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。如何选用对于在 Map 中插入、删除和定位元素这类操作HashMap 是最好的选择。 然而假如你需要对一个有序的 key 集合进行遍历 TreeMap 是更好的选择。ArrayList 与 LinkedList 区别ArrayList 是实现了基于动态数组的数据结构因为地址连续一旦数据存储好了查询操作效率会比较高在内存里是连着放的。因为地址连续ArrayList 要移动数据所以插入和删除操作效率比较低。LinkedList 基于链表的数据结构地址是任意的所以在开辟内存空间的时候不需要等一个连续的地址。对于新增和删除操作 add 和 remove LinedList 比较占优势。LinkedList 适用于要头尾操作或插入指定位置的场景。因为 LinkedList 要移动指针所以查询操作性能比较低。选用场景当需要对数据进行对随机访问的情况下选用 ArrayList 。当需要对数据进行多次增加删除修改时采用 LinkedList 。如果容量固定并且只会添加到尾部不会引起扩容优先采用 ArrayList 。ArrayList 扩容如果通过无参构造的话初始数组容量为0当真正对数组进行添加时才真正分配容量。每次按照1.5倍位运算的比率通过copeOf的方式扩容。 在JKD1.6中实现是如果通过无参构造的话初始数组容量为10.每次通过copeOf的方式扩容后容量为原来的1.5倍加1.以上就是动态扩容的原理。参考ArrayList 与 Vector 区别ArrayList 和 Vector 都是用数组实现的;区别1、Vector 是多线程安全的线程安全就是说多线程访问同一代码不会产生不确定的结果而 ArrayList 不是。Vector 类中的方法很多有 synchronized 进行修饰这样就导致了 Vector 在效率上无法与 ArrayList 相比。2、两个都是采用的线性连续空间存储元素但是当空间不足的时候两个类的增加方式是不同。3、Vector 可以设置增长因子而 ArrayList 不可以。适用场景分析1、Vector 是线程同步的所以它也是线程安全的而 ArrayList 是线程无需同步的是不安全的。如果不考虑到线程的安全因素一般用 ArrayList 效率比较高。实际场景下如果需要多线程访问安全的数组使用 CopyOnWriteArrayList 。2、如果集合中的元素的数目大于目前集合数组的长度时在集合中使用数据量比较大的数据用 Vector 有一定的优势。这种情况下使用 LinkedList 更合适。

相关新闻

Java并发-synchronized关键字

Java并发-synchronized关键字

概念:是利用锁的机制来实现同步的。锁机制有如下两种特性:互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。…

2026/7/28 16:40:34 阅读更多 →
矩阵代数

矩阵代数

矩阵的加减法矩阵的数乘矩阵的乘法 定义:设A(aij)m*s,B(bij)s*n,那么规定矩阵A与矩阵B的成绩是一个m*n矩阵C(cij),其中 cijai1b1jai2b2j…ainbnj∑k1saikbkj\sum_{k1}^{s}a_{ik}b_{kj}∑k1s​aik​bkj​(i1,2,…,m;j1,2,…,n)并把…

2026/7/28 16:40:34 阅读更多 →
基于掌控板与超声波传感器的智能避障小车项目实践

基于掌控板与超声波传感器的智能避障小车项目实践

1. 项目概述:当一只瓢虫被困在“数字牢笼”里最近在Labplus3和掌控板的社区里,看到一个挺有意思的项目,叫“一只瓢虫的困惑——画地为牢”。光看标题,你可能会觉得这像是个哲学寓言或者艺术装置。但对我们这些搞硬件编程和互动设计…

2026/7/28 16:40:34 阅读更多 →

最新新闻

AI Agent Skill 工程化 10:Skill 治理——Owner、清单、发布与季度复盘

AI Agent Skill 工程化 10:Skill 治理——Owner、清单、发布与季度复盘

Skill 一多,新问题就不是「怎么改」,而是「谁有权改、改坏了找谁」,尤其团队的Skill管理尤其重要 。这篇文章讲治理。工具很少,规矩很多——而且这些规矩,你们仓库里其实已经有一半雏形了。前言一句话:让 S…

2026/7/28 16:49:38 阅读更多 →
小安派工:智慧工地车辆道闸弱电工程,工地进出车辆管理布线要点

小安派工:智慧工地车辆道闸弱电工程,工地进出车辆管理布线要点

一、工地车辆道闸弱电施工环境难点工地出入口属于车流密集区域,渣土车、工程货车通行频次高,路面长期承受重压,伴随扬尘、雨水冲刷、车辆震动冲击。道闸配套弱电线路埋设于路面或者沿路边敷设,一旦缺少有效防护,容易出…

2026/7/28 16:49:38 阅读更多 →
【AI新手避坑指南】:20年AI专家亲授5大致命误区,90%初学者第3条就已踩雷

【AI新手避坑指南】:20年AI专家亲授5大致命误区,90%初学者第3条就已踩雷

更多请点击: https://kaifayun.com 第一章:AI新手认知误区的底层根源 许多初学者将AI等同于“自动完成一切的黑箱”,这种误解并非源于懒惰或无知,而是由技术传播链中的三重失真共同塑造:媒体简化、教学断层与工具封装…

2026/7/28 16:49:38 阅读更多 →
1. 准备工作

1. 准备工作

1.准备工作前期准备工作当前系统环境学习书箱和资源前期准备工作 当前系统环境 当前系统环境Windows10专业版1903。官网下载并安装Python,当前最新版本Python为3.7.4(20190730)。官网下载并安装Sublime。官网下载并安装Pycharm。搜索Mysql …

2026/7/28 16:49:38 阅读更多 →
基础Demo_4 if判断语句使用(学习笔记)

基础Demo_4 if判断语句使用(学习笔记)

if判断第一种语句格式 if判断语句用于判断代码如果a除以2不能为0 此代码块中代码不执行 public class Demo01_IF{public static void main(String[] args){int a 11; // 判断 if(a % 2 0 ){ //如果a除以2不能为0 此代码块中代码不执行System.out.println( a " 为偶数&…

2026/7/28 16:49:38 阅读更多 →
BFS算法解析:从水桶问题看广度优先搜索

BFS算法解析:从水桶问题看广度优先搜索

1. 从两个水桶问题说起 记得第一次遇到两个水桶问题时,我正在准备一场编程面试。题目是这样的:你有两个容量分别为3升和5升的空水桶,如何准确量出4升水?看似简单的问题却让我卡壳了半小时。直到后来系统学习了广度优先搜索&#x…

2026/7/28 16:48:38 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻