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

下载的网站模版怎么用startit wordpress

下载的网站模版怎么用,startit wordpress,中国交通建设集团有限公司招标网,h5可以做网站么文章目录 **核心数据结构****动态扩容机制****添加元素流程**整体流程(以 add(E e) 为例)**场景1:第一次添加元素(空数组扩容)****场景2:末尾插入且容量充足****场景3:触发扩容(容量…

文章目录

  • **核心数据结构**
  • **动态扩容机制**
  • **添加元素流程**
    • 整体流程(以 add(E e) 为例)
    • **场景1:第一次添加元素(空数组扩容)**
    • **场景2:末尾插入且容量充足**
    • **场景3:触发扩容(容量不足)**
      • **扩容核心方法 `grow()`**
      • **安全检查方法 `hugeCapacity(minCapacity)`**
        • 拓展1:`MAX_ARRAY_SIZE` **的存在意义**
        • **拓展2:**`hugeCapacity` **处理溢出**
        • **拓展3:为什么允许返回** `Integer.MAX_VALUE`
    • **场景4:中间插入(需移动元素)- `add(int index, E e)`**
      • **核心方法 `add(int index, E e)`**
  • **删除元素流程(以 remove(int index) 为例)**
  • **ModCount 作用**
  • **线程安全性**
  • **性能优化技巧**
  • **与 LinkedList 的对比**

Java 的 ArrayList 是集合框架中最核心的动态数组实现,也是高频使用的容器之一。

核心数据结构

基于数组实现,维护 elementData 数组存储元素:

// JDK 1.8
transient Object[] elementData; // 实际存储元素的数组
private int size;               // 当前元素数量
  • transient 修饰的 elementData 不会被默认序列化(通过自定义序列化逻辑优化存储)

动态扩容机制

当添加元素时发现容量不足,触发 grow(int minCapacity) 扩容:

private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 扩容为旧容量的1.5倍if (newCapacity - minCapacity < 0)newCapacity = minCapacity; // 最小需要满足 minCapacityelementData = Arrays.copyOf(elementData, newCapacity);
}

核心逻辑

  1. 扩容倍率:新容量 = 旧容量 * 1.5(位运算 oldCapacity >> 1 代替除法优化性能)

  2. 数组拷贝Arrays.copyOf() 底层使用 System.arraycopy(),为本地方法(效率高)


添加元素流程

整体流程(以 add(E e) 为例)

public boolean add(E e) {ensureCapacityInternal(size + 1); // 确保容量足够elementData[size++] = e;          // 尾部插入元素return true;
}
  • 容量检查:若当前数组已满,触发扩容后再插入

  • 尾部插入:时间复杂度 O(1)
    在这里插入图片描述

场景1:第一次添加元素(空数组扩容)

  • 触发条件:默认构造的 ArrayList(初始 elementData 为空数组)首次调用 add()

  • 流程

    1. minCapacity = size + 1 = 1

    2. 判断当前容量 elementData.length = 0,需要扩容。

    1. 计算新容量 newCapacity = max(10, 1)newCapacity = 10.

    2. 新数组 elementData = new Object[10],将元素插入首位。

场景2:末尾插入且容量充足

  • 流程

    1. ensureCapacityInternal(size + 1) ➔ 无需扩容。

    2. elementData[size++] = e ➔ 直接插入末尾,无需移动元素,O(1) 时间复杂度

场景3:触发扩容(容量不足)

  • :数组已满(size == elementData.length)时添加新元素。

  • 扩容步骤

    1. oldCapacity = 10.

    2. 计算增长量 oldCapacity >> 1 = 5newCapacity = 15.

    1. Arrays.copyOf(elementData, 15) ➔ 快速本地方法拷贝数组。

    2. 扩容代价:数组拷贝 O(n),需在插入时尽量避免频繁扩容。

扩容核心方法 grow()

private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); // 计算1.5倍扩容if (newCapacity - minCapacity < 0) {newCapacity = minCapacity; // 手动调整至至少满足 minCapacity}if (newCapacity - MAX_ARRAY_SIZE > 0) {newCapacity = hugeCapacity(minCapacity); // 安全检查(最大容量限制)}elementData = Arrays.copyOf(elementData, newCapacity);
}

安全检查方法 hugeCapacity(minCapacity)

private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // 溢出判断:如果 minCapacity 已经超过 Integer.MAX_VALUE,会变成负数throw new OutOfMemoryError(); // 比较需求容量和最大数组容量约束(Integer.MAX_VALUE - 8)return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;
}

hugeCapacity 的决策逻辑分为:

  • 情况 1minCapacity 正常(非负且 <= MAX_ARRAY_SIZE

    → 返回 MAX_ARRAY_SIZE(即 Integer.MAX_VALUE - 8)。

  • 情况 2minCapacity > MAX_ARRAY_SIZE

    → 直接返回 Integer.MAX_VALUE(允许尝试分配更大的容量,但可能导致 OOM)。

  • 异常处理minCapacity < 0(溢出导致)

    → 抛出 OutOfMemoryError(申请容量已超过 Integer.MAX_VALUE,无法满足)。

拓展1:MAX_ARRAY_SIZE 的存在意义

Java 规范允许 JVM 实现为数组对象分配内存时保留一部分头部信息(如对象头、数组长度等),可能导致某些情况下实际数组最大可用容量小于 Integer.MAX_VALUE。约定 MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8 是为了避免直接分配 Integer.MAX_VALUE 导致内存不足,属于一种保护性设计

拓展2:hugeCapacity 处理溢出

minCapacity 的值因为连续扩容超过 Integer.MAX_VALUE 时,会变成一个负数(整数溢出)。此时 minCapacity < 0 的检查会立即抛出 OutOfMemoryError,避免试图创建非法数组。

拓展3:为什么允许返回 Integer.MAX_VALUE

在 JVM 实现支持的情况下,部分版本的 JVM 可能允许数组实际容量接近 Integer.MAX_VALUEhugeCapacity 在此刻做了一个折中决策

  • 优先尝试返回 Integer.MAX_VALUE(信任 JVM 能处理)。

  • 若 JVM 实际无法分配,则会在 Arrays.copyOf() 阶段抛出 OutOfMemoryError

场景4:中间插入(需移动元素)- add(int index, E e)

list.add(2, "hello"); // 在索引2处插入元素
  • 流程

    1. 检查索引合法性(index >= 0 && index <= size)。

    2. 检查容量 ➔ 不够则扩容。

    1. 计算需要移动的元素数量: numMoved = size - index = 3.

    2. 调用 System.arraycopy(elementData, 2, elementData, 3, numMoved),将原数据从索引2开始的元素后移1位。

    1. elementData[2] = "hello".

    2. 时间复杂度:平均 O(n).

核心方法 add(int index, E e)

public void add(int index, E element) {rangeCheckForAdd(index); // 索引范围检查ensureCapacityInternal(size + 1); // 移动元素:需向后移的元素数量 = size - indexSystem.arraycopy(elementData, index, elementData, index + 1, size - index);elementData[index] = element;size++;
}

删除元素流程(以 remove(int index) 为例)

public E remove(int index) {rangeCheck(index); // 索引越界检查modCount++;         // 结构性修改次数(用于迭代器快速失败)E oldValue = elementData(index); // 保存被删除元素int numMoved = size - index - 1; // 需要移动的元素数量if (numMoved > 0) {// 将 index+1 到末尾的元素向前移动一位System.arraycopy(elementData, index+1, elementData, index, numMoved);}elementData[--size] = null; // 清空原末尾元素,帮助GCreturn oldValue;
}

核心点

  • 移动代价:平均时间复杂度 O(n),末尾删除为 O(1)

  • GC处理:手动赋 null 避免内存泄漏

ModCount 作用

迭代器通过 modCount 追踪结构性修改:

private class Itr implements Iterator<E> {int expectedModCount = modCount; // 记录创建迭代器时的修改次数public E next() {checkForComodification(); // 检查是否发生结构性修改// ... 其他逻辑}final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}
}
  • 结构性修改:任何导致 size 变化或元素位置变化的操作(增、删、排序等)

  • 多线程问题:未同步时快速失败机制能检测部分并发问题

线程安全性

  • 非线程安全ArrayList 的设计不保证多线程环境下的安全

  • 替代方案

    • Collections.synchronizedList(new ArrayList<>()) 同步包装类

    • CopyOnWriteArrayList 写时复制容器(适合读多写少场景)

性能优化技巧

  1. 初始化时指定容量:避免频繁扩容

    ArrayList<String> list = new ArrayList<>(1000); // 直接指定初始容量
    
  2. 批量操作优先:避免循环内多次扩容

    list.addAll(Arrays.asList("A", "B", "C")); // 批量添加减少扩容次数
    
  1. 谨慎使用 contains/remove(Object):时间复杂度 O(n),高频操作可改用 HashSet

与 LinkedList 的对比

操作ArrayListLinkedList
随机访问O(1)(通过索引)O(n)(需要遍历链表)
头部插入/删除O(n)(需移动元素)O(1)(只需调整指针)
内存占用紧凑(无需指针)每个元素需额外指针空间
适用场景读多写少、随机访问高频频繁增删、顺序访问

文章转载自:

http://wTHNHAYf.zddbz.cn
http://sQnmNGLw.zddbz.cn
http://eVsx8EFP.zddbz.cn
http://jDT5RKyq.zddbz.cn
http://lQ6NdWqn.zddbz.cn
http://IVAwogrT.zddbz.cn
http://cKd0aOYM.zddbz.cn
http://p8Xaz3qE.zddbz.cn
http://5nnalzA3.zddbz.cn
http://7n8qLCvi.zddbz.cn
http://rI6UFpaz.zddbz.cn
http://P3dDERa3.zddbz.cn
http://RFRo1CrR.zddbz.cn
http://HghodbPZ.zddbz.cn
http://HdtZan2N.zddbz.cn
http://BIEBprg0.zddbz.cn
http://17kE9oWd.zddbz.cn
http://sS9lJPFa.zddbz.cn
http://n3ElIQJW.zddbz.cn
http://B6GRq6yl.zddbz.cn
http://s8nqPO1b.zddbz.cn
http://nEhu7Uxr.zddbz.cn
http://yymOkjQw.zddbz.cn
http://6Xb9PBlX.zddbz.cn
http://UzuDJ8IE.zddbz.cn
http://tnCvmStw.zddbz.cn
http://WDtTgq67.zddbz.cn
http://XxD00gdB.zddbz.cn
http://cd6JAPSC.zddbz.cn
http://DmQJabV0.zddbz.cn
http://www.dtcms.com/wzjs/737464.html

相关文章:

  • 网站如何运营网站动画是怎么做的
  • 搜集关键词的网站看书网站排名
  • 深圳设计网站排行贵城乡建设官方网站
  • 哪些网站可以免费申请网站建设工作整改报告
  • 深圳罗湖外贸网站建设网络设计与管理是干什么的
  • 大连市建设局网站高端网站建设 骆诗
  • 网站投放广告多少钱wordpress前端开发教程
  • 亚马逊网站做外贸学做网站有用吗
  • 山东济南seo整站优化费用华耀建设网站
  • 南昌科技网站建设吉林市做网站的公司
  • 个人网站可以做社区吗备案号放网站下面居中
  • 壹互联是网站公司吗wordpress登陆
  • 山西建设网站公司网页设计与网站建设的目的
  • 成品网站管系统黄山网站设计公司
  • 南宁网站建设云尚网络如何接单做网站
  • 自己做一个音乐网站怎么做重庆定制型网站建设
  • 网站制作需要多少费用制作网站软件免费
  • 重庆网站空间键词排名wordpress 集赞系统
  • 做网站怎么做wordpress 后台 模板
  • 怎么建设网站石家庄网站托管公司
  • 新网站seo技术wordpress全是博客
  • 化妆品销售网站的源代码腾讯云服务器学生
  • 上海个人网站备案wordpress post模板
  • 洛阳疾控最新通告今天谷歌搜索优化
  • 网站建设与网页设计心得体会wordpress 大型站
  • 商城网站做推广方案南昌网站制作代理商
  • 网站制作应用搭建个人主页
  • 中山 环保 骏域网站建设专家销客多分销小程序价格
  • 网站优化推广哪家好深喘旋磨做紧夹断妖精网站
  • 大网站服务器维护费用怎么制作ppt 教程