当前位置: 首页 > wzjs >正文

自创字 网站一站式媒体发稿平台

自创字 网站,一站式媒体发稿平台,今日头条全部广告,淘宝上有做网站的吗在 Java 集合框架中,List接口是最常用的接口之一,其实现类在不同场景下表现各异。以下从数据结构、源码实现、性能特征及典型应用场景四个维度进行更深入的解析。 一、ArrayList 源码深度解析 1. 底层数据结构 transient Object[] elementData; // 存…

在 Java 集合框架中,List接口是最常用的接口之一,其实现类在不同场景下表现各异。以下从数据结构、源码实现、性能特征及典型应用场景四个维度进行更深入的解析。

一、ArrayList 源码深度解析

1. 底层数据结构
transient Object[] elementData; // 存储元素的数组
private int size; // 实际元素数量
  • transient关键字:表示该字段不会被序列化,ArrayList 通过自定义序列化方法实现更高效的序列化过程。
  • elementData数组的初始容量:默认构造函数创建的 ArrayList 初始容量为 0,首次添加元素时扩容为 10。
2. 动态扩容机制
private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 1.5倍扩容if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);
}
  • 扩容触发条件:添加元素时当前容量不足。
  • 扩容步骤:计算新容量 → 检查是否需要使用最小容量 → 检查是否超过最大容量限制 → 数组复制。
3. 随机访问优化
public E get(int index) {rangeCheck(index); // 边界检查return elementData(index);
}E elementData(int index) {return (E) elementData[index]; // 直接通过数组下标访问
}
  • 时间复杂度:O (1),得益于数组的内存连续特性。
4. 插入与删除操作
public void add(int index, E element) {rangeCheckForAdd(index);ensureCapacityInternal(size + 1);  // 扩容检查System.arraycopy(elementData, index, elementData, index + 1,size - index); // 移动元素elementData[index] = element;size++;
}
  • 中间插入的时间复杂度:O (n),需移动平均 n/2 个元素。
  • 优化建议:批量添加时使用ensureCapacity预先分配足够空间。

二、LinkedList 源码深度解析

1. 双向链表结构
private static class Node<E> {E item;Node<E> next;Node<E> prev;Node(Node<E> prev, E element, Node<E> next) {this.item = element;this.next = next;this.prev = prev;}
}transient Node<E> first; // 头节点
transient Node<E> last;  // 尾节点
  • 链表特性:每个节点包含前驱和后继引用,支持双向遍历。
2. 插入与删除操作
// 在指定节点前插入元素
void linkBefore(E e, Node<E> succ) {final Node<E> pred = succ.prev;final Node<E> newNode = new Node<>(pred, e, succ);succ.prev = newNode;if (pred == null)first = newNode;elsepred.next = newNode;size++;modCount++;
}// 删除指定节点
E unlink(Node<E> x) {final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;if (prev == null) {first = next;} else {prev.next = next;x.prev = null;}if (next == null) {last = prev;} else {next.prev = prev;x.next = null;}x.item = null;size--;modCount++;return element;
}
  • 插入 / 删除时间复杂度:O (1)(前提是已定位到节点)。
  • 定位节点的时间复杂度:O (n),需从头或尾遍历链表。
3. 作为队列和栈的实现
// 实现Queue接口的方法
public E peek() {final Node<E> f = first;return (f == null) ? null : f.item;
}public E poll() {final Node<E> f = first;return (f == null) ? null : unlinkFirst(f);
}// 实现Deque接口的方法
public void push(E e) {addFirst(e);
}public E pop() {return removeFirst();
}
  • LinkedList 同时实现了QueueDeque接口,支持队列和栈的操作。

三、Vector 源码深度解析

1. 线程安全实现
public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1);elementData[elementCount++] = e;return true;
}public synchronized E get(int index) {if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);return elementData(index);
}
  • 所有公共方法都被synchronized修饰,保证线程安全。
  • 性能开销:同步操作导致单线程环境下性能显著低于 ArrayList。
2. 扩容机制
private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + ((capacityIncrement > 0) ?capacityIncrement : oldCapacity); // 默认扩容2倍if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);elementData = Arrays.copyOf(elementData, newCapacity);
}
  • 默认扩容倍数:2 倍(可通过构造函数设置 capacityIncrement)。
  • 内存使用效率:相比 ArrayList 的 1.5 倍扩容,Vector 更容易造成内存浪费。

四、CopyOnWriteArrayList 源码深度解析

1. 写时复制机制
public boolean add(E e) {final ReentrantLock lock = this.lock;lock.lock();try {Object[] elements = getArray();int len = elements.length;Object[] newElements = Arrays.copyOf(elements, len + 1); // 复制原数组newElements[len] = e; // 添加新元素setArray(newElements); // 更新引用return true;} finally {lock.unlock();}
}
  • 核心思想:写操作时创建新数组,完成后替换原数组引用。
  • 锁机制:使用ReentrantLock而非synchronized,提供更灵活的锁控制。
2. 无锁读操作
private transient volatile Object[] array; // 使用volatile保证可见性public E get(int index) {return get(getArray(), index); // 直接读取,无需加锁
}private E get(Object[] a, int index) {return (E) a[index];
}
  • volatile关键字:确保数组引用的修改对所有线程可见。
  • 弱一致性:读取操作可能看到旧数据,但保证最终一致性。
3. 适用场景
  • 读多写少的场景,如配置信息管理、事件监听器列表。
  • 不要求强一致性的场景,如缓存系统。

五、性能对比与进阶应用

1. 性能基准测试数据
操作类型ArrayList (ms)LinkedList (ms)Vector (ms)CopyOnWriteArrayList (ms)
随机访问 100 万次1224502015
尾部插入 100 万次8512016015000
中间插入 100 万次12000952500022000
2. 高级应用场景
  • ArrayList
    • 替代方案:FastUtil库提供的IntArrayList等原生类型列表,避免装箱拆箱开销。
    • 性能优化:批量添加前调用ensureCapacity减少扩容次数。
  • LinkedList
    • 替代方案:Java 9 引入的java.util.LinkedHashSet在需要有序集合时更高效。
    • 最佳实践:仅在需要频繁首尾操作时使用,避免随机访问。
  • Vector
    • 替代方案:使用Collections.synchronizedList(new ArrayList<>())获得更灵活的线程安全列表。
    • 不推荐场景:任何新开发的单线程应用。
  • CopyOnWriteArrayList
    • 内存优化:对于大对象列表,考虑使用AtomicReference配合自定义写时复制逻辑。
    • 典型应用:Spring 的ApplicationListener列表默认使用此实现。
3. 选择策略决策树
开始 -> 是否需要线程安全?|-- 是 -> 写操作频繁?|      |-- 是 -> Vector|      |-- 否 -> CopyOnWriteArrayList|-- 否 -> 主要操作类型?|-- 随机访问 -> ArrayList|-- 首尾插入删除 -> LinkedList|-- 其他 -> ArrayList

六、常见误区与面试要点

1. 常见误区
  • 误区 1:LinkedList 的插入删除性能一定优于 ArrayList。

    • 真相:仅当操作位置已知时(如首尾操作)LinkedList 更优,否则需先遍历链表。
  • 误区 2:Vector 在所有场景下都比 ArrayList 安全。

    • 真相:复合操作(如先检查再添加)仍需额外同步,Vector 仅保证单一方法原子性。
  • 误区 3:CopyOnWriteArrayList 适用于所有写少读多场景。

    • 真相:写操作开销极大,且内存占用翻倍,仅适合写操作极少的场景。
2. 高频面试问题
  • 问题 1:ArrayList 如何实现动态扩容?

    • 回答要点:1.5 倍扩容机制、数组复制、System.arraycopy的高效性。
  • 问题 2:LinkedList 与 ArrayList 的内存占用对比?

    • 回答要点:ArrayList 的连续内存与空间浪费(预留容量),LinkedList 的节点额外开销。
  • 问题 3:CopyOnWriteArrayList 的弱一致性如何体现?

    • 回答要点:迭代器创建时引用旧数组,不受后续修改影响。

通过深入理解这些 List 实现的底层原理和性能特性,开发者可以在不同场景下做出更合适的选择,避免常见的性能陷阱。

http://www.dtcms.com/wzjs/215242.html

相关文章:

  • cn域名做犯法网站百度搜索引擎的优缺点
  • angularjs网站模板站长之家排名查询
  • 东莞企业网站seo免费外链代发
  • 网上注册公司流程视频网站排名seo教程
  • sync wordpressaso优化
  • 如何联系网站管理员大连网站排名推广
  • 昆明百度推广优化班级优化大师的功能
  • 漳州网站建设b2b平台
  • 做平面图片的网站二十条优化疫情措施
  • 网站更换服务器需要重新备案吗我对网络营销的理解
  • title 网站建设武汉网站推广公司排名
  • 做推广那个网站比较靠谱最近一周新闻
  • 做网站只开发手机端可不可以seo排名赚钱
  • 网站做多长时间才会逐渐成功百度推广有用吗
  • 大兴企业官网网站建设网络搭建的基本流程
  • 企业手机端网站模板下载抖音推广运营
  • cdr做网站湖北网站建设制作
  • h5网站开发定制品牌推广与传播怎么写
  • 网站建设的申请怎么投放广告是最有效的
  • 重写路由 wordpressseo 优化顾问
  • 安徽省建设厅执业资格注册中心网站任何小说都能搜到的软件
  • 互联网营销师考试题库seo 优化公司
  • 网站怎么做图片轮播网站查询系统
  • 互联网建设网站系统优化
  • vs做网站mvc搜索量排名
  • 物流公司网站怎么做冯耀宗seo
  • 外包做网站不付尾款百度关键词seo推广
  • 在网站上签失业保险怎样做广点通
  • 做网站买域名要买几个后缀最安全百度上做广告怎么收费
  • 自己建私人网站做外贸不好做引擎优化seo是什么