Java -- ArrayList
ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。
优点
- 查找数据性能很快,跟Vector比也要快些
- 可以插入任何数据类型
- 以数组实现,节约空间,但有容量限制,默认初始化大小为10,当超出后,会自动扩容为原来的1/2(50%)的容量,即自动扩容机制。
缺点
- 非线程安全
- 更新删除性能会比较差,因为实质是数组
- 自动增长会带来数据向新数组的重新拷贝,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。
- 需要连续的存储空间
工作原理
底层使用数组实现
private transient Object[] elementData;
构造方法
ArrayList提供了三种方式的构造器
- 构造一个默认初始容量为10的空列表
- 构造一个指定初始容量的空列表
- 构造一个包含指定collection的元素的列表,这些元素按照该collection的迭代器返回它们的顺序排列的。
public ArrayList() { this(10); } public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } public ArrayList(Collection<? extends E> c) { elementData = c.toArray(); size = elementData.length; // c.toArray might (incorrectly) not return Object[] (see 6260652) if (elementData.getClass() != Object[].class) elementData = Arrays.copyOf(elementData, size, Object[].class); }
插入、修改、存储数据
- 查找数据和修改指定数据get(index)/set(index,e),性能很高
- 添加add(e)操作性能也很好(直接在数组末尾添加元素)
- 按照下标来插入元素或者删除操作,add(index,e)/remove(index)/remove(e),性能会低,需要使用 system.arraycopy()来移动受影响的元素
调整容量
每当向数组中添加元素时,都要去检查添加后元素的个数是否会超出当前数组的长度,如果超出,数组将会进行扩容,以满足添加数据的需求。
扩容规则
- 将老数组中的元素重新拷贝一份到新的数组中
- 每次数组容量的增长大约是其原容量的1.5倍
可以知道,这样扩容的代价太高了,所以应该作适当的处理。
解决方法
- 当我们可预知要保存的元素的多少时,要在构造ArrayList实例时,就指定其容量,以避免数组扩容的发生。
- 根据实际需求,通过调用ensureCapacity方法来手动增加ArrayList实例的容量。
并发处理
ArrayList也采用了快速失败的机制,通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
相关推荐
day14-ArrayList集合 1.ArrayList 1.1ArrayList类概述【理解】 什么是集合 提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 ArrayList集合的特点 ...底层是数组实现的,长度可以...array.add("java");
mongo-java-driver3.0以上jar压缩包大全 try { //1.连接池相关选项配置 MongoClientOptions options=MongoClientOptions.builder() .connectionsPerHost(poolSize) .minConnectionsPerHost(minpoolsize) ...
《FCKeditor Java版2.4.1对JDK 1.4的兼容性改造详解》 FCKeditor是一款流行的开源在线文本编辑器,广泛应用于Web应用中的富文本编辑功能。其Java版本(FCKeditor-java)使得开发者可以将这款编辑器无缝集成到Java...
ArrayList是Java集合框架中的一种列表实现,它实现了List接口,允许存储包括null在内的所有元素。ArrayList的本质是一个动态数组,其容量可以根据需要自动增长。默认初始容量为10,随着元素的增加,ArrayList会自动...
ArrayList是Java集合框架中常用的动态数组,它允许我们在运行时添加、删除和访问元素。在Java中,ArrayList实现了List接口,因此它支持有序的元素序列,并且允许有重复元素。本文将深入解析ArrayList的主要方法,...
4. **集合框架**:Java集合框架包括List、Set、Map等接口以及实现这些接口的类,如ArrayList、LinkedList、HashSet、HashMap等。它们提供了存储和操作对象的高效方式。 5. **输入/输出**:Java的I/O流系统支持文件...
本示例"arrayliSt---listDemo"显然是一个关于ArrayList基本操作和使用的演示。下面我们将深入探讨ArrayList的相关知识点。 1. **ArrayList的构造** ArrayList在初始化时,可以通过不带参数的构造器创建一个空的...
计算机后端-Java-Java核心基础-第24章 集合01 14. ArrayList的源码分析.avi
《Vector、ArrayList、List使用深入剖析》-JAVA中文站(www_java-cn_com).htm
DiffResult diffResult = jDiff.diff(Lists.newArrayList(text1.split("\\s")), Lists.newArrayList(text2.split("\\s"))); output.output(diffResult); System.out.println(output.getText()); ``` 以上代码将...
【Java基础——List接口详解(ArrayList、LinkedList、匿名类)】 在Java编程中,List接口是集合框架的重要组成部分,提供了有序存储元素的功能。ArrayList和LinkedList是List接口的两种主要实现,它们各有优缺点,...
例如,`new ArrayList()`简化为`new ArrayList()`。 5. **文件系统API增强**:Java 7引入了新的NIO.2文件系统API,提供了更强大的文件操作功能,如文件路径、遍历目录树和异步I/O等。 6. **改进的类型推断**:Java...
在Java编程语言中,ArrayList是一个常用的集合类,它实现了可变大小的数组,方便我们存储和操作一组有序的对象。然而,Java并不支持像某些其他语言(如JavaScript或Python)那样的函数作为参数传递,而是通过方法回...
ArrayList 是 Java 中一种常用的列表类,它是 List 接口的实现,基于动态数组的数据结构。ArrayList 的核心特性在于其能够动态地调整数组的大小以适应元素数量的变化,从而提供了比传统固定大小数组更为灵活的使用...
ArrayList是Java集合框架中的重要部分,是一种能够存储可变数量元素的集合。ArrayList的特点是基于数组的数据结构,这使得它在随机访问元素时表现良好,但数组的缺点是容量固定,而ArrayList弥补了这一点,它的容量...
Java试题-2:ArrayList类动态代理 什么是动态代理 动态代理该怎么实现