资讯动态

java集合篇面试模拟

发布时间:2026/9/12 20:52:29 来源:尧图企业网站定制
问题1 Arraylist和LinkedList的区别它们是有序的还是无序的2 ArrayList 和 LinkedList 的应用场景3.ArrayList的扩容机制说一下4.HashMap实现原理介绍一下5.HashMap是线程安全的吗6.在 Java 的 hashmap 中 get一个元素的过程是怎样的7.hashmap的put过程介绍一下8.HashMap的扩容机制介绍一下9.ConcurrentHashMap怎么实现的10.说一下HashMap和Hashtable、ConcurrentMap的区别11.Set集合有什么特点如何实现key无重复的回答1底层数据结构不同ArrayList 是数组实现LinkedList 是链表实现插入和删除操作的效率不同ArrayList 在尾部进行插入和删除操作时效率较高,在中间或开头插入、删除效率很低需要移动后面的所有元素LinkedList 在头部和尾部进行插入、删除操作时效率很高只需要调整节点的指针即可在中间位置操作需要遍历链表找到目标位置时间复杂度是 O (n)后续只需要调节指针随机访问的效率不同ArrayList 通过索引快速访问元素时间复杂度为 O (1)LinkedList必须从头或尾逐个遍历查询时间复杂度为O (n)空间占用LinkedList每个元素比ArrayList多两个指针存储元素数量相同时LinkedList占用更大都是有序的2ArrayList适用于需要频繁访问的场景。LinkedList适用于频繁进行插入和删除操作的场景。3.ArrayList在添加元素时如果当前元素个数已经达到了内部数组的容量上限就会触发扩容操作。先算新容量默认是原来的 1.5 倍用移位运算效率更高扩容操作涉及创建新数组、复制旧元素、把引用指向新数组。4.JDK 7 是「数组 链表」通过哈希算法将元素的键Key映射到数组中的槽位。采用头插法多线程下会成环导致 get 死循环JDK 8 改成「数组 链表 红黑树」——链表长度 ≥ 8且数组长度 ≥ 64 时转红黑树查找从 O(n) 降到 O(log n)树节点 ≤ 6 时退化回链表。采用尾插法扩容按hash oldCap拆成高低两条链整体搬走不会成环但仍会覆盖丢数据5.JDK 8解决了并发扩容时可能形成环形链表的问题并没有解决多线程操作 HashMap 时的数据丢失问题解决方法是优先使用ConcurrentHashMap6.get 就三步先hash(key)定位桶桶空直接返回 null桶不空先比首节点最快路径命中就返回没命中看类型——是树就走getTreeNode按 hash 分叉 O(log n)是链表就 do-while 逐个比 hash 和 equals最长也就 8 个节点找不到统一返回 null。全程不改 modCountkey 为 null 时 hash 是 0落 0 号桶。7.put()方法用于向HashMap中添加键值对1.拿到 key计算它的 hash 值通过 hash 值定位到数组对应的桶下标。2.桶为空创建一个新的 Node 对象来存储键值对桶不为空先判断头节点 key 是否一致一致就覆盖 value。不一致就遍历链表或者红黑树找到相同 key 就更新找不到就插入新节点。3.插入后如果链表长度到 8、数组≥64链表转红黑树。4.判断负载因子是否超过扩容阈值超过就扩容为原来 2 倍重新迁移节点。8.默认的负载因子是0.75即如果hashmap中的元素个数超过了总容量75%则会触发扩容扩容做两件事新建 2 倍数组 → 搬移旧数据。搬移的巧妙处因为容量是 2 的幂(n-1)的掩码扩容后高位只多 1 bit所以只需判断e.hash oldCap为 0 留在原位非 0 移到「原位 oldCap」无需重算 hash。9.JDK 1.7是Segment分段锁JDK 8和 HashMap 一样的数组 链表/红黑树用volatile CAS synchronized保证安全锁粒度细化到单个桶。写入四步容器是否为空为空则使用 volatile 加 CAS 来初始化桶空用CAS 无锁写入桶非空synchronized 锁住桶头节点再遍历覆盖/尾插插入完成后更新计数。读操作全程无锁——靠volatileJava 的关键字用来修饰变量保证可见性这是它读性能高的根本原因。10.HashMap线程不安全允许 null初始容量 162 倍扩容数组 链表 红黑树。 Hashtable全局 synchronized 锁并发差不允许 null初始容量 11扩容 2n1只有数组 链表基本淘汰。 ConcurrentHashMap线程安全不允许 null。1.7 分段锁1.8 去掉分段锁CAS 桶级 synchronized并发性能更好。11.set集合特点Set集合中的元素是唯一的不会出现重复的元素。HashSet / LinkedHashSet底层是哈希表插入元素时先用hashCode()定位桶再用equals()比较是否已存在相同元素存在则不再插入TreeSet底层是红黑树插入元素时不调用hashCode/equals而是用自然排序或自定义 的返回值是否为 0 来判断是否重复。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价