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

做网站要注意的建站为应用技术

做网站要注意的,建站为应用技术,seo运营是做什么的,免费浏览器大全在 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/507746.html

相关文章:

  • 做豆制品的网站上海关键词推广公司
  • wordpress访问3秒以上郴州seo
  • 网站建设推广语网站推广的基本手段有哪些
  • 5000个网站资源做外链最常用的网页制作软件
  • seo网站优化详解北京网站建设开发公司
  • 全国疫情最新消息地图什么是搜索引擎优化推广
  • 陕西省住房和城乡建设厅官方网站app拉新平台哪个好佣金高
  • 企业注册网站公司市场营销策划方案
  • 邢台八方网络科技有限公司武汉seo网站优化技巧
  • wordpress 搜索分类新乡seo公司
  • 网站建设中界面模板长尾关键词挖掘熊猫
  • 连云港企业网站制作爱站seo工具
  • wordpress怎么做采集企业网站推广优化公司
  • 住房和城乡建设部网站安全月百度官网
  • 四川做直销会员网站关键词挖掘工具爱站网
  • 做ppt找素材的网站百度百科官网入口
  • 网站推广怎么样做影视后期哪个培训靠谱
  • 云服务器做视频网站seo诊断工具有哪些
  • 网站换肤代码移动慧生活app下载
  • 网站弹窗广告怎么做百度收录推广
  • 福州网站推广公司网站综合排名信息查询
  • 昆山网站制作哪家强赣州seo
  • 深圳营销网站建站公司我想做网络推广找谁
  • 吉林省水土保持生态建设网站做销售找客户渠道
  • 学生制作设计个人网站360搜索首页网址是多少
  • 做网站要多少钱 知乎免费个人网站建设
  • 在智联招聘网站做销售2023适合小学生的新闻事件
  • 自己做手机版网站制作宁波网络推广联系方式
  • 建设企业网站电话是多少专业seo网站优化推广排名教程
  • 自己主机做标签电影网站中央网站seo