Java数据结构(4)-ArrayList

H3C无线控制器二层注册实战:从零配置到AP上线全流程(附常见问题排查) 本文详细解析了H3C无线控制器二层注册的全流程,从网络基础准备、AC核心配置到AP上线,重点阐述了CAPWAP隧道建立的关键步骤。文章提供了清晰的典型配置示例,并针对AP无法上线、状态异常等常见问题,给出了六种典型故障现象的排查思路与解决命令,帮助网络工程师快速定位并解决问题。 阅读详情

ArrayList是一个类,这个类有一个数组参数elementData,ArrayList集合中的元素正是保存在这个数组中,它继承了数组查询的高性能,参考第3篇。ArrayList还封装了很多方法,便于对数组中的数据进行操作处理,其中就包括上一篇说的扩容,建议先理解第3篇数组。

扩容原理

在eclipse中调试以下代码,如下设置四个断点,打开调试视图。

	public static void main(String[] args) {
		List list = new ArrayList();
		System.out.println("断点1");
		list.add(1);
		System.out.println("断点2");
		list.add(2);
		list.add(3);
		list.add(4);
		list.add(5);
		list.add(6);
		list.add(7);
		list.add(8);
		list.add(9);
		list.add(10);
		System.out.println("断点3");
		list.add(11);
		System.out.println("断点4");
	}
  • 断点1:list的数组参数elementData的值为Object[0],表示数组初始长度为0。

  • 断点2:在集合中添加了第一个元素,elementData数组长度变成了10。即初始扩容长度为10。

  • 断点3:在集合中一共添加了10个元素,elementData长度仍然为10,此时无需扩容。

  • 断点4:添加第11个元素,即超出了原数组长度。elementData长度扩容为15,即第二次以后的扩容,长度为原长度的1.5倍。

  • 注意看图,elementData在断点1时标识是29,在断点2和断点3处的标识都是31,而在断点4时标识46,第2篇讲过,这说明elementData引用变量前后一共指向了三个不同的数组对象。也就是说,elementData并没有真正的扩容,而是创建了一个容量更大的数组对象来替代之前的数组,并且复制之前的数组内容。

元素类型Object

第3篇讲过,数组元素的长度必须是一致的。而以上代码中,我添加的都是int类型数据。假如我添加一个long型数据,如下,也是可以的。而int(4字节 )和long(8字节 )的长度是不一样的,这是为什么?

			list.add(1);
			list.add(1l);

假如声明时使用List<Integer>,就指定了固定元素类型。而我的代码中并没有使用泛型,所以它的类型可以是任意Object,但不能是基本类型。当添加int元素时,会自动转换为Integer。当添加long元素时,会自动转换为Long。因此,最终list所有的元素类型都是引用类型(4字节),长度相同,这是实现数组高性能查询所必需的。以后讲其他集合的元素类型时,也和ArrayList是一样的原理,不再解释。

在尾部添加

第3篇在数组中添加了5亿个元素,很快就执行完成。假如用同样的方法在ArrayList中添加5亿元素会怎么样?

		int size=500000000;
		List list = new ArrayList();
		long t1 = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			list.add(i);
		}
		long t2 = System.currentTimeMillis();
		System.out.println(t2-t1);
  • 运行结果:内存溢出

一直运行了n分钟没有结果,最终报错内存溢出。因为在这个过程中,会不断的扩容,不断的创建新数组对象,最终把内存撑爆。要解决这个问题,可以在创建ArrayList时传入一个int参数,根据参数值会直接初始一个较大的数组,就不用再频繁的扩容了。注意:如果初始数组太大又不使用,也会让费内存空间。修改代码,将new ArrayList()改成new ArrayList(size)

List list = new ArrayList(size);

只是这样做还不够,因为上面说了,list.add(i)实际上是创建了5亿个对象,数据量太大内存仍然不足。再次修改添加代码,将list.add(i)改成list.add(1),1会转换成new Integer(1),5亿个new Integer(1)仍然是5亿个对象。但是java对一些对象做了缓存,其中包括new Integer(0至127),以后会讲。现在只需知道,i改成1后只会有一个new Integer(1)对象,而不会创建5亿个对象。之后文章都会使用1作为集合参数,不再解释。修改代码如下 ,再次运行

list.add(1);
  • 耗时:1080毫秒

add()方法默认是在尾部添加数据,ArrayList的size可以帮助数组瞬间完成定位,然后直接添加,所以这样的性能是很高的。


在指定位置添加

list.add(int index,E element)方法是在位置index处添加,如下

		int size=500000000;
		List list = new ArrayList(size);
		long t1 = System.currentTimeMillis();
		for(int i=0;i<size;i++){
			list.add(0,1);
		}
		long t2 = System.currentTimeMillis();
		System.out.println(t2-t1);
  • 耗时:无限


上图可以看出,向指定位置0插入元素时,其后面的所有元素都要一个个的向后移动,即每添加一个元素要移动n次元素。虽然没有创建对象,不会内存溢出,但是时间性能实在太低。

删除的性能

和添加同理,在尾部删除性能很高。但在指定位置删除也存在性能问题,需要把后面元素一个一个的往前移。


特性

  • 有序列表:集合中的元素按照添加顺序排列,先添加进集合的排在前面,后添加的排在后面。
  • 底层就是数组:操作尾部数据时,其性能是最高的。操作越靠前的数据,性能越低。
  • 封装了数组:操作更简便,代码可读性更高。但是也封装了额外操作,比如安全检查,数组是否越界等,这也带来一些性能开销,所以ArrayList性能会比数组稍稍低那么一点点。

应用场景

  • 做普通项目时,对性能没有那么严格的要求,如果想要快速开发,使用封装过的ArrayList是第一选择。
  • 关于从指定位置添加和删除,是ArrayList的性能缺陷。我们要做的是将其优点发挥到其擅长的场景,将其不擅长的场景交给其他数据结构来处理,扬长避短。后续要介绍的集合都是一样,没有哪一种结构是完美的,只有其最适合哪种场景。
SAP会计凭证导入ABAP开发模板+注意点—附带源码 开发并不仅仅只要考虑实现的功能,只实现功能的是程序,考虑到使用场景的是工程。使用bapi校验创建会计凭证的数据,报错和参数和正式创建一致。用途,防止产生错误的凭证,即使财务凭证可以冲销。正式创建会计凭证。隐藏的坑。 阅读详情

相关推荐

内网穿透-frp二层隧道搭建

环境: weblogic: 192.168.0.133 10.10.20.12 win7 : 10.10.20.7 10.10.10.7go语言、跨平台的 可以分为frpc和frps frpc—>请求----->frps frps:放到黑客公网上 1.需要出网 2.配置: frpc:放到肉鸡上,请求frps 2.端口转发 2.1frpc传到肉鸡(weblogic) 利用工具,传入内存马到weblogic,然后使用冰蝎进行连接 然后在文件管理中上传frpc.exe和frpc.ini文件 fr

yyytaotao的博客 2105

ArrayList初始容量及扩容概述

初始容量 结论: new ArrayList<>(); 容量是 transient Object[] elementData; private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {}; public ArrayList() { this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA; } 就是这个空数组,所以容量为0 add扩容 先看ad

qq_44595532的博客 924

DSPACE仿真平台的使用

DSPACE仿真平台的使用 文章目录DSPACE仿真平台的使用1.ModelDesk新建项目2.MotionDesk引入项目3.ControlDesk引入项目4.项目整合运行 我们使用DSPACE仿真平台软件来模拟小汽车的自动驾驶。 总共需要用到DSPACE大类下的三个软件:ModelDesk、ControlDesk、MotionDesk。 1.ModelDesk新建项目 在桌面上点击ModelDesk图标,打开DSPACE—ModelDesk 选择 File 标签,侧边栏选择 New,点击 New A

qq_42582489的博客 7529

java中ArrayList类中的size()方法

size()就是获取到ArrayList中存储的对象的个数,举例: List list = new ArrayList(); list.add("123"); list.add("123"); int c =list.size();System.out.print(c);上面输出的结果:2;备注:list每次add,之后size值会进行加1,也就是说list的对象数增加了一个。

llkoio的专栏 5万+

硅传CC1310二次开发必备:手把手教你用JTAG解锁被锁定的Flash存储器

本文针对硅传CC1310模块二次开发中常见的Flash锁定问题,提供了从原理剖析到实战操作的完整解决方案。详细介绍了如何使用Uniflash和Flash Programmer 2等工具进行Flash解锁和擦除,并强调了硬件连接稳定性与供电质量的关键作用,帮助开发者彻底解决烧录障碍,为后续应用开发铺平道路。

weixin_29189373的博客 255

DSP28335学习笔记——McBSP配置为SPI

由于28335硬件外设上只有一个SPI接口,所以当SPI接口不够用时,可以将McBSP配置为SPI接口。 参考28335的数据手册,当DSP为主机时,配置McBSP为SPI所用到的接线如下图所示。 另外总结一些调试过程中的经验。 1.传输数据位数的确定 由RCR1寄存器中的RWDLEN1和XCR1寄存器中的XWDLEN1决定。分别对应着接受和发送的位数,在配置成SPI模式的时候,这

捕虫少年 1万+

ArrayList的基本使用

一、ArrayList的简介ArrayList底层的数据结构是线性表中的顺序表,底层是一个长度可以动态增长的数组。数组有很多缺点,ArrayList弥补了数组的缺点。基本格式:ArrayList list = new ArrayList();备注:从JDK1.7+开始,右侧的尖括号内部可以不写内容,但是本身还是要写的。二、ArrayList的使用(1)add(Object element) 向列表的尾部添加指定的元素。size() 返回列表中的元素个数get(int index) 返...

reallsk的博客 667

解密HDMI热插拔检测电路:从HPD引脚到EDID读取的全流程避坑

本文深入解析HDMI热插拔检测与EDID读取的全流程,从HPD引脚信号特性、DDC通道I2C协议到EDID数据结构,系统剖析了硬件电路设计、信号完整性和软件协议中的常见陷阱与解决方案,为消费电子设备开发者提供了一套完整的实战避坑指南。

weixin_29291069的博客 650

new ArrayList()设置了大小,但在指定位置添加值时出现越界异常

new ArrayList()设置了大小,但在指定位置添加值时出现越界异常

Java 领域内容 743

Windows下用Docker快速搭建SearXNG私有搜索引擎(附Dify集成配置)

本文详细介绍了在Windows环境下使用Docker快速搭建SearXNG私有搜索引擎的完整流程,包括环境准备、容器化部署、安全配置优化以及与Dify平台的深度集成方法。通过分步指导和实用配置示例,帮助开发者构建兼具隐私保护和AI增强能力的本地化搜索解决方案,特别适合需要定制化搜索服务的应用场景。

weixin_30300225的博客 336

VMware下载与安装

一、VMware下载 二、VMware安装

欢迎订阅我的“JAVA全栈开发笔记(全)”专栏,价格优惠,仅需19.9元。 317

java集合详解之ArrayList

1 特点 有序的,可以存储重复值和null值。 底层是数组实现的,线程不安全。通过下标查询、速度快,非末尾增删的时候需要重新移动数据,所以增删性能低。 调用构造函数new ArrayList()时,最开始是一个空数组,在第一次add的时候会创建一个初始容量为10的数组。也可以自定义初始化容量new ArrayList(int initialCapacity)。 以自身的1.5倍容量扩容,不可以设置容量增量。 2 源码分析 2.1 接口的定义和属性 public class ArrayList&

最初的模样 7426

x2-DFD:A framework for explainable and explainable deepfake detection

该文章提出了X2-DFD框架,用于可解释和可扩展的深度伪造检测。通过评估大型多模态语言模型(MLLMs)在深度伪造检测中的内在能力,发现它们在不同伪造相关特征上的有效性各异。基于此,实施了针对性的微调策略,显著提高了MLLMs的解释能力,并整合了外部深度伪造检测器(EDDs),以结合MLLMs和传统检测器的互补优势,实现更好的检测和解释。

志在山顶的人,不会贪念山腰的风景 510

JAVA数据结构 DAY4-ArrayList

小编作为新晋码农一枚,会定期整理一些写的比较好的代码,作为自己的学习笔记,会试着做一下批注和补充,如转载或者参考他人文献会标明出处,非商用,如有侵权会删改!欢迎大家斧正和讨论!在 Java 开发中,ArrayList 是使用频率极高的集合类。它基于动态数组实现,兼顾了随机访问的高效性与灵活扩容的特性,成为存储和操作数据的首选工具之一。本文将从线性表基础概念出发,全面剖析 ArrayList 的底层原理、核心用法、扩容机制,并通过实战案例加深理解,最后探讨其局限性与优化思路。扩容触发条件。

HRDMN的博客 898

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java数据结构——4.顺序表(ArrayList)《干货笔记》

Java数据结构——4.顺序表(ArrayList)《干货笔记》

要努力去发光,而不是被照亮~ 1041

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

1.4.2 Java数据结构章 ArrayList

List接口无法实例化arraylist是顺序表,跟vector一类。

qq_40533485的博客 288

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

数据结构学习笔记4--ArrayList(Java编码实现ArrayList构造器)

对数据结构的一些学习笔记,(此博客编码实现ArrayList构造器未完成后续会继续更新)

weixin_47734224的博客 876

Java数据结构——4.2顺序表(ArrayList)-模拟实现

比特就业课Java数据结构——顺序表(ArrayList)-模拟实现 课后思维总结

要努力去发光,而不是被照亮~ 467

Java数据结构——4.1顺序表(ArrayList)-知识区

比特就业课Java数据结构——顺序表(ArrayList)-知识区 课后思维总结

要努力去发光,而不是被照亮~ 373

Java数据结构——ArrayList

Java数据结构中ArrayList概念及其方法的介绍

2401_89019969的博客 1982

【Java数据结构】ArrayList详解

ArrayList 是Java集合框架中的一个类,底层使用的数据结构就是顺序表,它实现了List接口,提供了动态数组的功能,ArrayList可以根据需要自动进行扩容,允许存储任意类型的对象。

weixin_65949261的博客 3096

java中的ArrayList和LinkedList的底层剖析

LinkedList也是一个动态的线性表,所以它就必须能够存储元素,能够获取大小,ArrayList底层是通过一个数组存储元素,LinkedList内部是通过一个结点类来存储元素,同时这个Node里面有两个指针,prev指向前一个结点、next指向下一个结点,同时提供一个构造方法,当我们需要添加一个元素的时候本质是添加一个结点,再把这个元素放入到这个结点内部,同时维护好这个结点的前后结点。我们要对数组进行封装,也就是让这个数组如果元素装满了之后,重新创建一个更大的数组,将原来的元素复制过去。

qq_64039411的博客 2692

数据结构之ArrayList

4.

2302_79269413的博客 1200

【数据结构】ArrayList原理及实现学习总结

一、ArrayList介绍 ArrayList是一种线性数据结构,它的底层是用数组实现的,相当于动态数组。与Java中的数组相比,它的容量能动态增长。类似于C语言中的动态申请内存,动态增长内存。 当创建一个数组的时候,就必须确定它的大小,系统会在内存中开辟一块连续的空间,用来保存数组,因此数组容量固定且无法动态改变。ArrayList在保留数组可以快速查找的优势的基础上,弥补了数组在创建后,...

简约人生的博客 2万+

Java数据结构 | ArrayList与顺序表

ArrayList与顺序表详解

m0_56361048的博客 1467

【数据结构】List与ArrayList

Java List接口与顺序表实现 本文介绍了Java集合框架中的List接口及其实现原理。List是继承自Collection的线性表接口,具备有序元素管理能力。文章首先分析了List接口的定义和核心方法,包括继承自Collection的基础方法和List特有的位置操作方法。 重点介绍了顺序表(数组实现)这一线性表的物理存储结构,并详细演示了如何自定义实现顺序表(MyArrayList)。包括: 异常类设计(空表异常和索引非法异常) 核心成员变量和构造方法 工具方法实现(边界校验、动态扩容) 核心功能实现

记录了从0学习Java技术栈的日常 1251
上一篇: Java数据结构(3)-数组
下一篇: Java数据结构(5)-LinkedList
free_java
博客等级 码龄10年 664粉丝 131原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值