浅析 ArrayList

ArrayList是一个使用List接口实现的Java类。顾名思义,Java ArrayList提供了动态数组的功能,其中数组的大小不是固定的。它实现了所有可选的列表操作,并允许所有元素,包括null。

ArrayList 继承于 AbstractList ,实现了 ListRandomAccessCloneablejava.io.Serializable 这些接口。

public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, java.io.Serializable{}

ArrayList 中的构造函数

// 默认初始化容量
private static final int DEFAULT_CAPACITY = 10;
// 用于空实例的共享空数组实例。
private static final Object[] EMPTY_ELEMENTDATA = {};
// 用于默认大小的空实例的共享空数组实例。我们将其与EMPTY_ELEMENTDATA区别开来,以了解添加第一个元素时要膨胀多少。
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};public ArrayList() {this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;}public ArrayList(int initialCapacity) {if (initialCapacity > 0) {this.elementData = new Object[initialCapacity];} else if (initialCapacity == 0) {this.elementData = EMPTY_ELEMENTDATA;} else {throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);}}public ArrayList(Collection<? extends E> c) {Object[] a = c.toArray();if ((size = a.length) != 0) {if (c.getClass() == ArrayList.class) {elementData = a;} else {elementData = Arrays.copyOf(a, size, Object[].class);}} else {// replace with empty array.elementData = EMPTY_ELEMENTDATA;}}

  • 默认构造函数,使用初始容量10构造一个空列表(无参数构造)

  • 带初始容量参数的构造函数。(用户自己指定容量)

  • 构造包含指定collection元素的列表,这些元素利用该集合的迭代器按顺序返回

自动扩容


public void ensureCapacity(int minCapacity) {int minExpand = (elementData != DEFAULTCAPACITY_EMPTY_ELEMENTDATA)// any size if not default element table? 0// larger than default for default empty table. It's already// supposed to be at default size.: DEFAULT_CAPACITY;// 最小容量大于初始容量if (minCapacity > minExpand) {ensureExplicitCapacity(minCapacity);}}private static int calculateCapacity(Object[] elementData, int minCapacity) {if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {return Math.max(DEFAULT_CAPACITY, minCapacity);}return minCapacity;}private void ensureCapacityInternal(int minCapacity) {ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)// 扩容grow(minCapacity);}private void grow(int minCapacity) {// overflow-conscious codeint oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0)newCapacity = minCapacity;if (newCapacity - MAX_ARRAY_SIZE > 0)newCapacity = hugeCapacity(minCapacity);// minCapacity is usually close to size, so this is a win:elementData = Arrays.copyOf(elementData, newCapacity);}private static int hugeCapacity(int minCapacity) {if (minCapacity < 0) // overflowthrow new OutOfMemoryError();return (minCapacity > MAX_ARRAY_SIZE) ?Integer.MAX_VALUE :MAX_ARRAY_SIZE;}

当我们在 Java 中创建 ArrayList 时,它的默认容量为 10。如果添加的元素多于初始容量,则 ArrayList 可以自动调整大小。如果确定需要添加到 ArrayList 的最小元素数,则可以使用ensureCapacity()方法指定。

  • 初始容量:当创建一个新的 ArrayList 时,它会指定一个初始容量。这个初始容量决定了 ArrayList 可以容纳多少个元素,而不必扩容。

  • 扩容因子:ArrayList 还具有一个扩容因子,它决定了当 ArrayList 需要扩容时,它的容量将增加多少。扩容因子通常是一个大于 1 的数字,例如 1.5 或 2。

  • 扩容条件:当 ArrayList需要添加一个新元素时,它会检查其当前容量是否足够。如果当前容量不够,它将进行扩容。

  • 扩容过程:扩容过程包括以下步骤:

    创建一个新的数组,其容量为当前容量乘以扩容因子。

    将 ArrayList 中的所有元素复制到新的数组中。

    将新的数组设置为 ArrayList 的 backing 数组。

    将 ArrayList 的容量更新为新的容量。

ArrayList的重要特性

  • ArrayList继承AbstractList类并实现List接口。

  • ArrayList按大小初始化。但是,如果集合增大,则大小会自动增加;如果从集合中删除对象,则大小会自动减小。

  • ArrayList允许我们随机访问列表。

  • ArrayList 不能用于原始类型,如 int、char 等。我们需要一个包装类来处理这种情况。

  • Java中的ArrayList可以看作C++中的向量。

  • ArrayList 不同步。 Java 中它的等价同步类是 Vector。

ArrayList 中方法

  • add(int index, Object element):该方法用于在列表中的特定位置索引处插入特定元素。

  • add(Object o):此方法用于将特定元素附加到列表末尾。

  • addAll(Collection c):此方法用于将特定集合中的所有元素附加到所提到的列表的末尾,按照指定集合的迭代器返回值的顺序。

  • addAll(int index, Collection c):用于将特定集合中从指定位置开始的所有元素插入到提到的列表中。

  • clear():此方法用于从任何列表中删除所有元素。

  • clone():该方法用于返回 Java 中 ArrayList 的浅表副本。

  • contains(Object o):如果此列表包含指定元素,则返回 true。

  • ensureCapacity(int minCapacity):如有必要,增加此 ArrayList 实例的容量,以确保它至少可以容纳最小容量参数指定的元素数量。

  • forEach(Consumer<? super E> action):对 Iterable 的每个元素执行给定的操作,直到处理完所有元素或该操作引发异常。

  • get(int index):返回此列表中指定位置的元素。

  • indexOf(Object o):返回特定元素第一次出现的索引,如果该元素不在列表中,则返回 -1。

  • isEmpty():如果此列表不包含任何元素,则返回 true。

  • lastIndexOf(Object o):返回特定元素最后一次出现的索引,如果该元素不在列表中,则返回 -1。

  • listIterator():返回此列表中元素的列表迭代器(按正确的顺序)。

  • listIterator(int index):返回列表中元素的列表迭代器(按正确的顺序),从列表中的指定位置开始。

  • remove(int index):删除此列表中指定位置的元素。

  • remove(Object o):从此列表中删除第一次出现的指定元素(如果存在)。

  • removeAll(Collection c):从此列表中删除指定集合中包含的所有元素。

  • removeIf(Predicate filter):删除此集合中满足给定谓词的所有元素。

  • removeRange(int fromIndex, int toIndex):从此列表中删除索引介于 fromIndex(包含)和 toIndex(不包含)之间的所有元素。

  • retainAll(Collection<?> c):仅保留此列表中指定集合中包含的元素。

  • set(int index, E element):将此列表中指定位置的元素替换为指定元素。

  • size():返回此列表中的元素数量。

  • spliterator():在此列表中的元素上创建一个后期绑定和快速失败的 Spliterator。

  • subList(int fromIndex, int toIndex):返回此列表中指定的 fromIndex(包含)和 toIndex(不包含)之间的部分的视图。

  • toArray():此方法用于返回一个数组,其中包含按正确顺序排列的列表中的所有元素。

  • toArray(Object[] o):它还用于返回一个包含此列表中所有元素的数组,其顺序与之前的方法相同。

  • trimToSize():此方法用于将 ArrayList 实例的容量修剪为列表的当前大小。

向 ArrayList 添加元素

可以使用 add() 方法向 ArrayList 添加元素。

// 这将在列表末尾添加“emanjusaka”
aList.add("emanjusaka");// 这将在第四个位置添加“emanjusaka”
aList.add(3,"emanjusaka");

更改 ArrayList 中的元素

可以使用 set() 方法更改 ArrayList 中的元素。需要提供索引和新元素,然后此方法用新的给定元素更新给定索引处存在的元素。

package top.emanjusaka;import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("emanjusaka");aList.add("Tom");aList.add("Jack");aList.set(1, "Jerry");System.out.println(aList);}
}

输出结果:

从 ArrayList 中移除元素

可以使用 remove() 方法从 ArrayList 中移除元素。

package top.emanjusaka;import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("emanjusaka");aList.add("Tom");aList.add("Jack");System.out.println(aList);aList.remove("Tom");System.out.println(aList);aList.remove(1);System.out.println(aList);}
}

输出结果:

迭代 ArrayList

package top.emanjusaka;import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("emanjusaka");aList.add("Tom");aList.add("Jack");for (String s : aList) {System.out.println(s);}}
}

输出结果:

ArrayList 大小

可以使用ArrayList的size() 方法来查找ArrayList中的元素数量。

package top.emanjusaka;import java.util.ArrayList;public class Main {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("emanjusaka");aList.add("Tom");aList.add("Jack");System.out.println("Number of elements in ArrayList: " + aList.size());}
}

输出结果:

对 ArrayList 进行排序

可以使用 Collections 实用程序类的 sort() 方法对 ArrayList 进行排序。

package top.emanjusaka;import java.util.ArrayList;
import java.util.Collections;public class Main {public static void main(String[] args) {ArrayList<String> aList = new ArrayList<>();aList.add("emanjusaka");aList.add("Tom");aList.add("Jack");Collections.sort(aList);for (String s : aList) {System.out.println(s);}}
}

输出结果:

文章转载自:emanjusaka

原文链接:https://www.cnblogs.com/emanjusaka/p/page_12.html

体验地址:引迈 - JNPF快速开发平台_低代码开发平台_零代码开发平台_流程设计器_表单引擎_工作流引擎_软件架构

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234533.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ECharts封装及配置整理

1 认识ECharts ECharts&#xff0c;一个基于 JavaScript 的开源可视化图表库 ECharts官网 国内Echarts使用手册网站&#xff1a; https://www.w3cschool.cn/echarts_tutorial/echarts_tutorial-d5b128yu.html 示例网站&#xff1a; https://www.isqqw.com/ http://chart.ma…

【Docker】以service形式离线安装卸载的docker、compose服务

CentOS7离线卸载Docker步骤 移除开机自启 [rootCenOS-1 system]# systemctl disable docker移除注册文件 rm -rf /etc/systemd/system/docker.service删除相关安装目录 rm -rf $(find / -name docker)CentOS7离线安装Docker、Compose步骤 资源地址&#xff1a;docker_20.10…

《数据结构、算法与应用C++语言描述》- 最小输者树模板的C++实现

输者树 完整可编译运行代码见&#xff1a;Github::Data-Structures-Algorithms-and-Applications/_31loserTree 输者树&#xff1a;每一个内部节点所记录的都是比赛的输者&#xff0c;晋级的节点记录在边上。本文中&#xff0c;赢者是分数较低的那个&#xff0c;输者是分数高…

虾皮电商申请:一站式开店指南

随着跨境电商的快速发展&#xff0c;越来越多的商家开始意识到东南亚市场的潜力。虾皮电商&#xff08;Shopee&#xff09;作为东南亚地区最大的电商平台之一&#xff0c;为商家提供了一个开拓市场的机会。本文将详细介绍如何在虾皮电商平台上开店&#xff0c;并给出一些建议来…

STM32/STM8资源节约主义编程方式

STM32/STM8资源节约主义编程方式 在小资源芯片进行代码设计时&#xff0c;如STM32C0系列&#xff0c;STM8系列&#xff0c;因为官方库本身要包含各种场景应用特征的支持&#xff0c;所以会有一些冗余的代码占用更多FLASH空间。当需要实现资源占用最简化设计方式时&#xff0c;…

记一次gunicorn启动报错

问题&#xff1a; 使用 gunicorn -w 1 -b 0.0.0.0:5005 main:app 启动时报错 gunicorn: error: unrecognized arguments: -w 1 -b 0.0.0.0:5005 main:app 原因&#xff1a; 是由于代码中包含 args parser.parse_args()会将gunicorn 的启动参数当作输入。 修改为&#xf…

4、ollvm移植到ndk中

准备ndk&#xff1a; android-ndk-r21b-linux-x86_64 git checkout ollvm-Obfuscation 将编译好的ollvm中的bin include lib三个文件夹放到ndk中的android-ndk-r21b-linux-x86_64/android-ndk-r21b/toolchains/llvm/prebuilt/linux-x86_64目录中&#xff0c;进行替换 确认cl…

uniapp 导入ucharts图表插件 H5项目, 使用echarts eopts配置

先下载ucharts H5示例源码&#xff1a; uCharts: 高性能跨平台图表库&#xff0c;支持H5、APP、小程序&#xff08;微信小程序、支付宝小程序、钉钉小程序、百度小程序、头条小程序、QQ小程序、快手小程序、360小程序&#xff09;、Vue、Taro等更多支持canvas的框架平台&#…

如何在公网环境下使用Potplayer访问本地群晖webdav中的影视资源

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav ​ 国内流媒体平台的内…

读写锁ReentrantReadWriteLockStampLock详解与实践实例

读读不存在线程安全问题。写读&#xff0c;写写操作存在线程安全问题的 现实中有这样一种场景&#xff1a;对共享资源有读和写的操作&#xff0c;且写操作没有读操作那么频繁&#xff08;读多写少&#xff09;。在没有写操作的时候&#xff0c;多个线程同时读一个资源没有任何…

硬件基础与实施运维工程师的介绍

目录 一、实施与运维 1.2 实施运维一般做什么 1.1.1实施工程师 1.1.2运维工程师 1.3 实施运维需要具备哪些技能 三、基础硬件 四、操作系统 4.1 Windows 4.2 Linux 4.3 macOS 4.4 Unix 五、总结 一、实施与运维 1.1 实施运维是干什么的 1、运维工程师负责服务的稳…

第二周:AI产品经理全局学习

一、AI产品架构全景 二、 AI产品岗位分析和了解 三、 AI产品能力模型 四、AI产品经理工作流 五、AI产品经理学习路径和规划 六、本周市场动态

力扣 面试经典150算法题

1合并两个有序数组88. 合并两个有序数组-CSDN博客简单23

如何在Ubuntu系统中安装VNC并结合内网穿透实现远程访问桌面

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

相机基础概念介绍

一.概念 Camera的成像原理 景物通过镜头&#xff08;LENS&#xff09;生成的光学图像投射到图像传感器(Sensor)表面上&#xff0c;然后转为模拟的电信号&#xff0c;经过 A/D&#xff08;模数转换&#xff09;转换后变为数字图像信号&#xff0c;再送到数字信号处理芯片&…

去掉乘法运算的加法移位神经网络架构

[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning? 代码&#xff1a;https://github.com/huawei-noah/AdderNet/tree/master 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度…

水平居中、垂直居中、水平垂直居中

1.水平居中 1.1块级元素 text-align:center; 1.2块级元素 注意&#xff1a;需要给标签指定宽度 margin:0 auto; 1.3绝对定位 和 自我位移 position:absolute; left:50%; transform:translateX(-50%); 注意&#xff1a;使用绝对定位会使元素脱离文档流 1.4flex布局 d…

速通数据结构顺序表代码题

顺序表 顺序表递增有序&#xff0c;插入元素x&#xff0c;仍递增有序用顺序表最后一个元素覆盖整个顺序表中最小元素&#xff0c;并返回该最小元素将顺序表的元素逆置将a1,a2,a3……am b1,b2,b3……bn转换成b1,b2,b3……bn a1,a2,a3……am删除顺序表中所有值为x的元素从顺序表中…

【六大排序详解】开篇 :插入排序 与 希尔排序

插入排序 与 希尔排序 六大排序之二 插入排序 与 希尔排序1 排序1.1排序的概念 2 插入排序2.1 插入排序原理2.2 排序步骤2.3 代码实现 3 希尔排序3.1 希尔排序原理3.2 排序步骤3.3 代码实现 4 时间复杂度分析 Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&am…

HIve安装配置(超详细)

文章目录 Hive安装配置一、Hive安装地址二、Hive安装部署1. 把 apache-hive-3.1.2-bin.tar.gz上传到Linux的/export/software目录下2. 解压apache-hive-3.1.2-bin.tar.gz到/export/servers/目录下面3. 修改apache-hive-3.1.2-bin.tar.gz的名称为hive4. 修改/etc/profile&#x…