Java List实现类面试题

devtools/2025/2/28 13:18:47/

Java List实现类面试题

ArrayList

Q1: ArrayList的实现原理是什么?

ArrayList是基于数组实现的List,支持动态扩容。

java">public class ArrayListPrincipleExample {// 模拟ArrayList的基本实现public class SimpleArrayList<E> {private static final int DEFAULT_CAPACITY = 10;private Object[] elementData;private int size;public SimpleArrayList() {elementData = new Object[DEFAULT_CAPACITY];}public boolean add(E e) {ensureCapacity(size + 1);elementData[size++] = e;return true;}private void ensureCapacity(int minCapacity) {if (minCapacity > elementData.length) {int newCapacity = Math.max(elementData.length * 3/2, minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);}}}
}

Q2: ArrayList的扩容机制是怎样的?

java">public class ArrayListGrowthExample {public void demonstrateGrowth() {// 1. 默认构造函数ArrayList<String> list1 = new ArrayList<>();  // 初始容量为0// 2. 指定初始容量ArrayList<String> list2 = new ArrayList<>(20);// 3. 扩容过程ArrayList<String> list = new ArrayList<>();for (int i = 0; i < 11; i++) {list.add("item" + i);System.out.println("Size: " + list.size() + ", Capacity: " + getCapacity(list));}}// 通过反射获取实际容量private static int getCapacity(ArrayList<?> list) {try {Field field = ArrayList.class.getDeclaredField("elementData");field.setAccessible(true);return ((Object[]) field.get(list)).length;} catch (Exception e) {return -1;}}
}

LinkedList

Q3: LinkedList的实现原理是什么?

LinkedList是基于双向链表实现的List。

java">public class LinkedListPrincipleExample {// 模拟LinkedList的基本实现public class SimpleLinkedList<E> {private static class Node<E> {E item;Node<E> prev;Node<E> next;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.prev = prev;this.next = next;}}private Node<E> first;private Node<E> last;private int size;public boolean add(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null)first = newNode;elsel.next = newNode;size++;return true;}}
}

Q4: ArrayList和LinkedList的性能对比?

java">public class ListPerformanceComparison {public void comparePerformance() {ArrayList<Integer> arrayList = new ArrayList<>();LinkedList<Integer> linkedList = new LinkedList<>();int n = 100000;// 1. 添加性能对比long start = System.currentTimeMillis();for (int i = 0; i < n; i++) {arrayList.add(i);}System.out.println("ArrayList添加耗时:" + (System.currentTimeMillis() - start));start = System.currentTimeMillis();for (int i = 0; i < n; i++) {linkedList.add(i);}System.out.println("LinkedList添加耗时:" + (System.currentTimeMillis() - start));// 2. 随机访问性能对比start = System.currentTimeMillis();for (int i = 0; i < n; i++) {arrayList.get(i);}System.out.println("ArrayList随机访问耗时:" + (System.currentTimeMillis() - start));start = System.currentTimeMillis();for (int i = 0; i < n; i++) {linkedList.get(i);}System.out.println("LinkedList随机访问耗时:" + (System.currentTimeMillis() - start));// 3. 插入性能对比start = System.currentTimeMillis();for (int i = 0; i < 1000; i++) {arrayList.add(0, i);}System.out.println("ArrayList头部插入耗时:" + (System.currentTimeMillis() - start));start = System.currentTimeMillis();for (int i = 0; i < 1000; i++) {linkedList.addFirst(i);}System.out.println("LinkedList头部插入耗时:" + (System.currentTimeMillis() - start));}
}

实践应用

Q5: 如何选择ArrayList和LinkedList?

java">public class ListSelectionExample {// 1. 随机访问场景public void randomAccess() {List<Integer> list = new ArrayList<>();  // 选择ArrayListfor (int i = 0; i < 100000; i++) {list.add(i);}// 随机访问元素Random random = new Random();for (int i = 0; i < 1000; i++) {list.get(random.nextInt(list.size()));}}// 2. 频繁插入删除场景public void frequentModification() {List<Integer> list = new LinkedList<>();  // 选择LinkedList// 频繁在头部插入for (int i = 0; i < 10000; i++) {list.add(0, i);}// 频繁在中间删除Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {if (iterator.next() % 2 == 0) {iterator.remove();}}}
}

Q6: List的常见陷阱有哪些?

java">public class ListPitfallsExample {// 1. 类型转换问题public void typeCastPitfall() {List<Integer> list = new ArrayList<>();list.add(1);// Integer number = list.get(0);  // 自动拆箱Integer number = (Integer) list.get(0);  // 显式转换}// 2. 并发修改问题public void concurrentModificationPitfall() {List<String> list = new ArrayList<>();list.add("1");list.add("2");// 错误方式try {for (String item : list) {if ("1".equals(item)) {list.remove(item);}}} catch (ConcurrentModificationException e) {System.out.println("并发修改异常");}// 正确方式Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String item = iterator.next();if ("1".equals(item)) {iterator.remove();}}}// 3. 内存泄漏问题public void memoryLeakPitfall() {List<Object> list = new ArrayList<>();Object obj = new Object();list.add(obj);// 可能导致内存泄漏obj = null;  // 原对象仍然被list引用// 正确方式list.remove(0);  // 先从list中移除obj = null;      // 再置空引用}
}

面试关键点

  1. 理解ArrayList和LinkedList的实现原理
  2. 掌握ArrayList的扩容机制
  3. 了解LinkedList的节点结构
  4. 熟悉两种List的性能特点
  5. 掌握List的选择原则
  6. 注意List使用中的陷阱
  7. 理解内存管理和性能优化
  8. 掌握并发访问的处理方式

http://www.ppmy.cn/devtools/163355.html

相关文章

VidSketch:具有扩散控制的手绘草图驱动视频生成

浙大提出的VidSketch是第一个能够仅通过任意数量的手绘草图和简单的文本提示来生成高质量视频动画的应用程序。该方法训练是在单个 RTX4090 GPU 上进行的&#xff0c;针对每个动作类别使用一个小型、高质量的数据集。VidSketch方法使所有用户都能使用简洁的文本提示和直观的手绘…

网络安全防御模型

目录 6.1 网络防御概述 一、网络防御的意义 二、被动防御技术和主动防御技术 三、网络安全 纵深防御体系 四、主要防御技术 6.2 防火墙基础 一、防火墙的基本概念 二、防火墙的位置 1.防火墙的物理位置 2.防火墙的逻辑位置 3. 防火墙的不足 三、防火墙技术类型 四…

2025年网校系统源码开发趋势:技术革新的教育培训APP搭建实战

2025年&#xff0c;随着AI、大数据、云计算等技术的深度融合&#xff0c;网校教育系统的源码开发也迎来了新的发展趋势。本文将深入探讨这些趋势&#xff0c;并结合教育培训APP的开发实战&#xff0c;展示如何应对未来的技术挑战。 一、2025年网校教育系统源码的技术趋势 AI驱…

如何正确理解mAP、精度、召回率等概念

mAP&#xff08;Mean Average Precision&#xff09;即平均精度均值&#xff0c;是目标检测任务中广泛使用的一个重要评估指标&#xff0c;用于衡量模型在检测不同类别目标时的整体性能&#xff0c;下面为你详细介绍&#xff1a; 精度&#xff08;Precision&#xff09;和召回…

vue项目本地开发完成后部署到服务器后报404是什么原因

如何部署 前后端分离开发模式下&#xff0c;前后端是独立布署的&#xff0c;前端只需要将最后的构建物上传至目标服务器的web容器指定的静态目录下即可 我们知道vue项目在构建后&#xff0c;是生成一系列的静态文件。 常规布署我们只需要将这个目录上传至目标服务器即可。 /…

(八)Java-Collection

一、Collection接口 1.特点 Collection实现子类可以存放多个元素&#xff0c;每个元素可以是Object&#xff1b; 有些Collection的实现类&#xff0c;可以存放重复的元素&#xff0c;有些不可以&#xff1b; 有些Collection的实现类&#xff0c;有些是有序的&#xff08;Li…

【单片机】MSP430MSP432入门

文章目录 0 前言1 开发方式选择2 CCS和开发相关软件3 Keil开发MSP4324 IAR for 430开发MSP4305 总结 0 前言 最近因为想学DSP&#xff0c;所以把之前卸载的CCS给装回来了&#xff0c;手头也还有之前电赛剩下的MSP430和MSP432的板子&#xff0c;由于年代久远&#xff0c;想着花点…

Ubuntu中dpkg命令和apt命令的关系与区别

在 Ubuntu 中&#xff0c;dpkg 和 apt 是软件包管理的核心工具&#xff0c;但二者的角色和功能有显著区别&#xff1a; ​一、功能定位 ​特性​​**dpkg**​​**apt**​​层级​底层工具&#xff08;直接操作 .deb 文件&#xff09;高层工具&#xff08;管理软件仓库和依赖关…