首先看类定义:
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable private transient Object[] elementData; public ArrayList(int initialCapacity) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; } /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { this(10); }
使用无参的构造方法时,ArrayList将我们初始一个长度为10的Object[]数组
下面再看看 add函数
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
调用add函数时会将当前数组的长度+1后,通过ensureCapacity 函数进行判断数组大小是否可用,如果超过可用大小,那么ArrayList底层会生成一个新的数组,长度为原数组的1.5倍+1,值得关注的是Arrays.copyOf(elementData, newCapacity);
我们再看下移除函数
public E remove(int index) { RangeCheck(index); modCount++; E oldValue = (E) elementData[index]; int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // Let gc do its work return oldValue; }
删除数组元素的时候,也会进行System.arraycopy..要将被删除元素的后续元素向前移动
总结:
ArrayList:
1) ArrayList底层使用数组实现,当使用不带参数的构造方法生成ArrayList对象时,实际上会在底层生成一个长度为10的Object类型数组
2) 如果生成的数组超过10个,那么ArrayList底层会生成一个新的数组,长度为原数组的1.5倍+1,然后将原数组的元素复制到新数组之中,并且后续增加的内容都会放到新数组之中,当新数组无法容纳增加的元素时,重复该过程
3) 对于ArrayList元素的删除操作,需要将被删除元素的后续元素向前移动,代价比较高
相关推荐
Arraylist
在本毕业设计中,主要涉及了Java编程语言的高级特性,特别是对集合框架中的ArrayList和LinkedList两种数据结构的实现。这两个类是Java中常用的数据存储容器,它们都是List接口的实现,但各自有着不同的特点和应用...
作业 10-08 1. 随机产生 20 个整数(10以内的),放入一个ArrayList中, 用迭代器遍历这个ArrayList 2. 并删除其中为 5 的数 3. 再产生 3 个整数,插入到位置 4 处 4. 把所有值为 1 的数都变成 10
在本Java毕业设计项目中,主要探讨了两种重要的数据结构——ArrayList和LinkedList,它们都是Java集合框架中的核心组件,属于List接口的实现类。ArrayList和LinkedList各有特点,适合不同的应用场景,理解并掌握这两...
java毕业设计,项目包含完整前后端源码,带数据库sql文件。项目可正常运行! 环境说明: 开发语言:Java 前端框架:小程序 JDK版本:JDK1.8 数据库:mysql 5.7+ 部署容器:tomcat7+ 数据库工具:Navicat11+ ...
这里我们关注的是集合嵌套,特别是ArrayList类型的嵌套,也就是一个ArrayList包含另一个ArrayList的实例。这种结构可以用来表示复杂的数据结构,例如多层关系的数据,如本例中的学校与班级、班级与学生的层次关系。 ...
ArrayList是Java集合框架中List接口的一个具体实现,它继承了AbstractList抽象类,并实现了List、RandomAccess、Cloneable和Serializable接口。ArrayList的核心特点是其内部基于动态数组的数据结构,即使用Object...
在这个主题中,我们将深入探讨如何在JNI中操作ArrayList对象并添加一个int类型的数据。 首先,我们需要理解ArrayList在Java中的本质。ArrayList是Java集合框架中的一个重要类,它实现了List接口,用于存储可变大小...
在.NET框架中,ArrayList和DataTable是两种常用的集合类,它们分别代表了两种不同的数据存储方式。ArrayList是一个基于对象数组的动态大小的列表,而DataTable则是一个内存中的表格数据结构,通常用于存储和操作关系...
首先,ArrayList是.NET Framework中的一个类,它继承自System.Collections.ArrayList,主要用于存储动态大小的可变数组。ArrayList可以存储任何类型的对象,非常灵活,但不提供类型安全。在C#中,我们通常更推荐使用...
### C# 中 Array、...- **List**:结合了 Array 和 ArrayList 的优点,是现代 C# 编程中最常用的集合类型之一,支持类型安全性和高效的动态调整大小。 在实际开发过程中,应根据具体需求选择最合适的集合类型。
一个C++(Ubuntu16.04+QT5.9.1)通过JNI,调用JAVA类及方法的示例。通过JNI传递和返回多种类型的参数,boolean ,int,String,ArrayList,ArrayList嵌套ArrayList<ArrayList<String>>等。
C# ArrayList是一个重要的数据结构,它是.NET框架早期版本中用于动态数组存储的类。这个类在System.Collections命名空间中,提供了灵活的大小调整和数据管理功能。ArrayList在C#编程中扮演了重要的角色,尤其在处理...
### ArrayList的使用详解 #### 一、什么是ArrayList? `ArrayList`是.NET框架中提供的一种动态数组类型,它属于`System.Collections`命名空间。与普通的数组相比,`ArrayList`具有更强大的功能,比如它可以动态地...
在C语言中,ArrayList是一种常见的数据结构,它模拟了Java或.NET等高级语言中的动态数组。ArrayList提供了在数组中添加、删除和查找元素的便利操作,而无需预先知道数组的大小。下面,我们将深入探讨如何用C语言实现...
ArrayList类是Java编程语言中一个常用的集合类,它属于Java集合框架的一部分,位于`java.util`包中。ArrayList是一个基于数组实现的动态列表,可以存储任何类型的数据,并且支持动态扩容。在本实例中,我们将深入...
在Java编程语言中,`ArrayList`是`java.util`包中的一个重要集合类,它提供了动态数组的功能。这个数据结构允许我们存储、访问和管理一组元素。而在C语言中,由于没有内置的类似集合的数据类型,程序员需要自定义...
在Android开发中,ArrayList是一个非常重要的数据结构,它属于Java集合框架的一部分,但在Android环境中被广泛使用。ArrayList关键字查询是Android应用中常见的功能,尤其在显示大量数据的ListView中,用户通常需要...