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

广州腾虎网络网站建设熊掌号app营销

广州腾虎网络网站建设熊掌号,app营销,邢台seo技术,深圳网络营销推广服务hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:说说ArrayList和LinkedList的区别 ArrayList 与 LinkedList 的详细对比 一、底层数据结构 特性ArrayListLinkedList存…

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶

面试官:说说ArrayList和LinkedList的区别

ArrayList 与 LinkedList 的详细对比

一、底层数据结构
特性ArrayListLinkedList
存储结构基于动态数组基于双向链表
内存分配连续内存块非连续内存,节点分散存储
元素访问通过索引直接寻址(时间复杂度 O(1))需要遍历链表(时间复杂度 O(n))
插入/删除需要移动元素(时间复杂度 O(n))修改指针(时间复杂度 O(1),但需先遍历到位置)
空间开销仅存储数据和数组容量,内存紧凑每个节点额外存储前驱和后继指针,内存占用更高

二、核心操作性能对比
1. 随机访问(Get/Set)
  • ArrayList

    • 直接通过索引访问数组元素,时间复杂度 O(1)
    • 示例代码:
      list.get(1000);  // 直接定位到数组第1000个位置
      
  • LinkedList

    • 需要从链表头部或尾部遍历到目标位置,时间复杂度 O(n)
    • 优化技巧:根据索引位置选择从头或尾遍历(如 index < size/2 从头开始)。
    • 示例代码:
      list.get(1000);  // 需要遍历至少1000个节点
      
2. 插入与删除
  • 尾部插入(Add)

    • ArrayList
      • 如果数组未满,直接添加到末尾,时间复杂度 O(1)
      • 如果数组已满,需扩容(通常扩容为原容量的1.5倍)并复制数据,均摊时间复杂度 O(1)
    • LinkedList
      • 直接修改尾节点的指针,时间复杂度 O(1)(无需遍历)。
  • 中间插入(Add at Index)

    • ArrayList
      • 需要将插入位置后的元素后移,时间复杂度 O(n)
      • 示例:在索引 i 处插入元素,需移动 n - i 个元素。
    • LinkedList
      • 先遍历到目标位置(时间复杂度 O(n)),再修改指针(O(1)),总体时间复杂度 O(n)
  • 删除(Remove)

    • ArrayList
      • 类似插入操作,需将后续元素前移,时间复杂度 O(n)
    • LinkedList
      • 遍历到目标节点后修改指针,时间复杂度 O(n)(遍历是主要开销)。

三、内存占用与扩容机制
1. 内存占用
  • ArrayList

    • 内存连续,仅存储数据和数组容量字段。
    • 每个元素占用空间 = 数组槽位大小(如 Integer 为4字节)。
    • 示例:存储1000个整数,数组容量为1000时,总内存 ≈ 1000 * 4B = 4KB。
  • LinkedList

    • 每个节点包含数据、前驱指针、后继指针,内存分散。
    • 每个节点内存开销 ≈ 对象头(12B) + 3个引用(各4B) + 数据 = 至少 24B。
    • 示例:存储1000个整数,总内存 ≈ 1000 * 24B = 24KB(是 ArrayList 的6倍)。
2. 扩容机制
  • ArrayList

    • 默认初始容量为10,扩容时创建新数组并复制数据。
    • 扩容公式:newCapacity = oldCapacity + (oldCapacity >> 1)(即1.5倍)。
    • 扩容代价高,但均摊时间复杂度仍为 O(1)。
  • LinkedList

    • 无扩容概念,每次插入动态创建新节点。
    • 无内存浪费,但频繁插入可能触发GC(节点对象创建/销毁)。

四、应用场景
适合使用 ArrayList 的场景
  1. 频繁随机访问
    • 例如:按索引读取或修改元素(如 list.get(i))。
  2. 尾部插入/删除
    • 例如:日志记录、批量数据处理。
  3. 内存敏感场景
    • 需存储大量数据且希望减少内存占用。
适合使用 LinkedList 的场景
  1. 频繁在头部或中间插入/删除
    • 例如:实现栈(Stack)、队列(Queue)或双向队列(Deque)。
  2. 动态调整数据规模
    • 无需担心扩容问题,适合元素数量变化较大的场景。
  3. 需要实现复杂数据结构
    • 如LRU缓存(通过双向链表快速移动节点)。

五、代码示例与性能测试
1. 尾部插入性能对比
// ArrayList
List<Integer> arrayList = new ArrayList<>();
long start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {arrayList.add(i);  // 均摊 O(1)
}
System.out.println("ArrayList 尾部插入耗时: " + (System.currentTimeMillis() - start) + "ms");// LinkedList
List<Integer> linkedList = new LinkedList<>();
start = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {linkedList.add(i);  // O(1)
}
System.out.println("LinkedList 尾部插入耗时: " + (System.currentTimeMillis() - start) + "ms");

结果

  • ArrayList 通常更快(因内存连续,CPU缓存友好)。
  • LinkedList 可能因频繁创建节点对象导致GC开销。
2. 中间插入性能对比
// ArrayList
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {arrayList.add(0, i);  // 每次插入需移动所有元素,O(n)
}
System.out.println("ArrayList 头部插入耗时: " + (System.currentTimeMillis() - start) + "ms");// LinkedList
start = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {linkedList.add(0, i);  // O(1)
}
System.out.println("LinkedList 头部插入耗时: " + (System.currentTimeMillis() - start) + "ms");

结果

  • LinkedList 明显优于 ArrayList(避免元素移动)。

六、高级特性与注意事项
  1. 迭代器性能

    • ArrayList:迭代器直接通过索引访问,性能高。
    • LinkedList:迭代器需逐个遍历节点,性能较低(但实现了 ListIterator,支持双向遍历)。
  2. 线程安全性

    • 两者均非线程安全,多线程环境下需使用 Collections.synchronizedListCopyOnWriteArrayList
  3. 序列化与克隆

    • ArrayList 重写了 clone(),实现浅拷贝。
    • LinkedList 的克隆需要遍历复制所有节点。

🐮👵

维度ArrayListLinkedList
数据结构动态数组双向链表
访问效率O(1)(随机访问)O(n)
插入/删除O(n)(需移动元素)O(1)(已知位置)或 O(n)(需遍历)
内存占用低(连续存储)高(每个节点额外指针开销)
适用场景随机访问、尾部操作、内存敏感频繁头部/中间插入删除、实现队列/栈

选择建议

  • 优先使用 ArrayList(90%场景更优)。
  • 仅在需要频繁在 头部或中间插入/删除,或实现 队列/栈 时选择 LinkedList。

在这里插入图片描述


文章转载自:

http://GTzqlDAt.ckcjq.cn
http://r6eNuw3f.ckcjq.cn
http://PxsRsVmP.ckcjq.cn
http://FMMWiH7U.ckcjq.cn
http://xTafIINW.ckcjq.cn
http://UkdIe71H.ckcjq.cn
http://6PT4Yml6.ckcjq.cn
http://CbxJ8Qf0.ckcjq.cn
http://tKcSdXzr.ckcjq.cn
http://kNVQqWUq.ckcjq.cn
http://KNkcFfKo.ckcjq.cn
http://yYJDeZIW.ckcjq.cn
http://19fq8BLF.ckcjq.cn
http://hkQhrmpu.ckcjq.cn
http://UCjHUO3x.ckcjq.cn
http://MncUdNaO.ckcjq.cn
http://6wRJTcjT.ckcjq.cn
http://DpGTtaYG.ckcjq.cn
http://6I18QAmu.ckcjq.cn
http://uDrsvyIg.ckcjq.cn
http://E7pe9BRD.ckcjq.cn
http://sS0ibqkI.ckcjq.cn
http://cF65IHdt.ckcjq.cn
http://7tPWIHFY.ckcjq.cn
http://QJHrbRpl.ckcjq.cn
http://lkItXs6V.ckcjq.cn
http://BQJZaCiq.ckcjq.cn
http://7DD0E2Bi.ckcjq.cn
http://xMwtCJAi.ckcjq.cn
http://KWnjvcfJ.ckcjq.cn
http://www.dtcms.com/wzjs/611802.html

相关文章:

  • 百度验证网站甘洛网站建设
  • 营销外贸网站建设阿里巴巴官网
  • 东莞住建局官方网站做ic销售的各种网站
  • 天津手机网站建站培训软文广告经典案例200字
  • 平谷网站建设公司专门做网站的
  • 公司找人做网站需要什么asp.net网站支持多国语言
  • 长春网站建设哪家公司好外包是做什么的
  • 深圳服务网站建设小说发表哪个网站赚钱
  • 用jsp做的简单网站代码西安旅游的网页设计
  • 网站需要多少钱腾讯企业邮箱入口网址
  • 茂名建站公司模板公司展厅设计公司哪家好
  • 中式建筑公司网站全国各地网站开发外包
  • 开发一款网站需要多少钱怎么找网站
  • 大学网站建设的目标赣州公司做网站
  • 大型电子商务网站建设wordpress主题个性
  • 房地产网站建设wordpress邮箱订阅
  • aspcms网站图片不显示删除的网站做404
  • 深圳做手机网站设计电子商务网站建设交印花税吗
  • 如何运营网站应用下载app
  • 炎陵做网站中山做网站专业的公司
  • 自己建个网站互联网创业项目排行榜
  • 加工厂网站建设沈阳网站建设设计报价
  • 自己做的网站如何赚钱吗女教师遭网课入侵直播录屏曝
  • 手机网站导航设计汕头建设企业网站
  • 做网站的前景珠海定制网站建设推广
  • 根据百度地图做网站上海网站建设知识 博客
  • 网站信息组织优化中小企业商务网站建设
  • 学网站建设需要几年温江网站开发
  • 河南锦路路桥建设有限公司网站写作平台有哪些
  • php做网站难吗株洲企业网站建设工作室