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

免费产品推广网站设计网站公司收费

免费产品推广网站,设计网站公司收费,中国建设银行陕西省分行网站,wordpress京东主题分享ArrayList 和 LinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。 1. ArrayList 和 LinkedList 的底层区别 (1) 底层数据结构 ArrayList: 基于动态数组(Dynamic Ar…

ArrayListLinkedList 是 Java 集合框架中两种常用的列表实现,它们在底层数据结构、性能特点和适用场景上有显著的区别。以下是它们的详细对比以及 ArrayList 的扩容机制。


1. ArrayList 和 LinkedList 的底层区别

(1) 底层数据结构

  • ArrayList

    • 基于动态数组(Dynamic Array)实现。
    • 元素在内存中是连续存储的。
    • 实现了 RandomAccess 接口,支持随机访问,可以通过索引快速定位元素。
  • LinkedList

    • 基于双向链表(Doubly Linked List)实现。
    • 每个元素(节点)包含数据和两个指针,分别指向前后节点。
    • 不支持随机访问,必须从头或尾遍历链表才能访问指定位置的元素。

RandomAccess是标志性接口,标识某个 List 实现支持快速随机访问。


(2) 性能特点

特性ArrayListLinkedList
随机访问快速(时间复杂度为 O(1))。慢(时间复杂度为 O(n),需要遍历链表)。
插入/删除较慢(时间复杂度为 O(n),可能需要移动元素)。快速(时间复杂度为 O(1),只需调整指针)。
内存占用较低(仅存储元素和少量额外信息)。较高(每个节点需要存储数据和两个指针)。

(3) 使用场景

  • ArrayList

    • 适用于频繁随机访问元素的场景。
    • 适合读多写少的场景。
    • 示例:存储一组用户 ID,并根据索引快速查找某个用户。
  • LinkedList

    • 适用于频繁插入和删除操作的场景。
    • 适合写多读少的场景。
    • 示例:实现队列或栈等数据结构。

2. ArrayList 的扩容机制

(1) 动态数组的特点

  • ArrayList 内部使用一个数组来存储元素。
  • 当数组容量不足时,ArrayList 会自动扩容以容纳更多元素。

(2) 扩容过程

  1. 初始容量

    • 默认初始容量为 10。
    • 可以通过构造方法指定初始容量。
      ArrayList<Integer> list = new ArrayList<>(20); // 初始容量为 20
      
  2. 扩容触发条件

    • 当添加新元素时,如果当前数组容量不足以容纳新元素,则触发扩容。
  3. 扩容策略

    • 新容量通常是原容量的 1.5 倍(即原容量 + 原容量的一半)。
    • 扩容后,会创建一个新的数组,并将原数组中的所有元素复制到新数组中。
    • 源码示例(JDK 8 中的部分代码):
      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); // 复制到新数组
      }

    private static int hugeCapacity(int minCapacity) {
    if (minCapacity < 0) // 溢出(int 整型最大值溢出)
    throw new OutOfMemoryError();
    return (minCapacity > MAX_ARRAY_SIZE) ?
    Integer.MAX_VALUE :
    MAX_ARRAY_SIZE;
    }

    
    
  4. 性能影响

    • 扩容操作涉及数组的复制,因此是一个耗时的操作。
    • 如果可以预估元素数量,建议在初始化时指定合适的容量,避免频繁扩容。

步骤

  1. 计算新容量:新容量通常是旧容量的 1.5 倍(即 oldCapacity + (oldCapacity >> 1))。例如,若当前容量为 10,则扩容后为 15。

  2. 比较最小需要容量:如果计算得到的新容量仍小于所需的最小容量(minCapacity),则将新容量设为 minCapacity

  3. 检查最大容量限制:如果新容量超过了 ArrayList 能支持的最大容量(Integer.MAX_VALUE - 8),则将新容量设为 Integer.MAX_VALUE

  4. 数组复制:最终,使用 Arrays.copyOf() 方法将原数组的元素复制到新数组中,并将新数组赋值给 elementData

JDK 作者 Mark Reinhold 在 OpenJDK 邮件讨论中也提到,“减 8”是经验值,历史兼容留下的设置,它不是必须是 8,但不能是 0。

是为了防止堆内存溢出,大多数 JVM 对象是 8 字节对齐,加上对象头等等,但实际上大概率也是会堆内存溢出。

JDK21 的源码和 JDK8 稍有不同,但大致一样, JDK8 是硬编码,JDK21 是引入方法传入参数。

源码展示

	private Object[] grow(int minCapacity) {  int oldCapacity = elementData.length;  if (oldCapacity > 0 || elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {  int newCapacity = ArraysSupport

文章转载自:

http://enXXnL4b.tqpnf.cn
http://x4LQ64ty.tqpnf.cn
http://UAj4YcvG.tqpnf.cn
http://tT3z6mrk.tqpnf.cn
http://DaVs0eGV.tqpnf.cn
http://tuC5v6ws.tqpnf.cn
http://428JfHYP.tqpnf.cn
http://V7UbGQAG.tqpnf.cn
http://L45YtEQl.tqpnf.cn
http://pyevWc9n.tqpnf.cn
http://5Qpr55bQ.tqpnf.cn
http://g7Lov0Dt.tqpnf.cn
http://BvR9OZft.tqpnf.cn
http://AvVvVGLE.tqpnf.cn
http://zSRxf0eH.tqpnf.cn
http://Nb1xCIc4.tqpnf.cn
http://hwyDZRjJ.tqpnf.cn
http://jja7r2Pq.tqpnf.cn
http://GdA9lUx5.tqpnf.cn
http://3BtCbXGo.tqpnf.cn
http://suwWmTKP.tqpnf.cn
http://RPYBdcHt.tqpnf.cn
http://kcFDvsUk.tqpnf.cn
http://P5vz2ElP.tqpnf.cn
http://oeZ3Vyfi.tqpnf.cn
http://DXPK9Asg.tqpnf.cn
http://VQSwqZta.tqpnf.cn
http://krNcb7Bo.tqpnf.cn
http://D9n51pko.tqpnf.cn
http://v6HB0RtY.tqpnf.cn
http://www.dtcms.com/wzjs/745165.html

相关文章:

  • 指定网站怎么设置路由器只访问抖音小程序赚钱
  • 建设方面的知识 网站美间软装官网
  • 毕业设计做购物网站网站设计高度
  • 网站提高内容的丰富度创意怎么下载网站页面
  • 网站系统容量评估机械公司网站模板
  • 东莞做网站设计制作网站制造
  • 陕西省咸阳市建设银行网站微平台图片
  • 如何破解网站后台密码网络营销课程实训报告
  • 上海网站制作平台注册logo去哪里注册
  • 上海网站建设百度推广公司佛山互联网公司
  • 江苏住房建设厅主办网站阿里云做网站教程
  • 建设网站五个步骤wordpress excel插件
  • 免费做电子相册的网站水泵行业网站哪个做的好
  • 企业网站开发 流程软件开发一般需要多少钱
  • 深圳专业软件网站建设网站建设硬件和软件技术环境配置
  • 佛山网站建设定制开发实验室网站制作
  • 做电影资源网站有哪些vue 做企业网站
  • 两学一做 专题网站河南省台前县建设局网站
  • 网站开发薪水一般多少钱专业网站建设一条龙
  • 单网页网站内容网站建设与营销服务
  • win10 做网站服务器吗做免费视频网站违法吗
  • 网站修改 iis6应用程序池家用电脑桌面做网站
  • 徐州住房与建设局网站免费ppt成品
  • 安庆网站建设电话网站建设怎么学
  • 什么网站做一手房好上海网站制作公司是什么
  • 制作网站软件app网页游戏开服表源码
  • 网站需要备案才能建设吗PHP做克隆网站
  • 东莞英文网站制作百度seo公司一路火
  • 官方网站的重要性宣传软文怎么写
  • 做同城网站需要哪些手续宣传页在线设计软件