Java ArrayList是如何工作的?
ArrayList内部使用什么数据结构?内部Java ArrayList是如何工作的?,java,arraylist,Java,Arraylist,ArrayList内部使用什么数据结构?内部ArrayList使用对象[] 当您向阵列列表添加项目时,列表将检查备份阵列是否还有空间。如果有空间,新项目只会添加到下一个空白处。如果没有空间,将创建一个更大的新阵列,并将旧阵列复制到新阵列中 现在,还有更多的空间,新元素将添加到下一个空白空间中 因为人们非常喜欢源代码: /** * The array buffer into which the elements of the ArrayList are stored. * The capaci
ArrayList
使用对象[]
当您向阵列列表添加项目时,列表将检查备份阵列是否还有空间。如果有空间,新项目只会添加到下一个空白处。如果没有空间,将创建一个更大的新阵列,并将旧阵列复制到新阵列中
现在,还有更多的空间,新元素将添加到下一个空白空间中
因为人们非常喜欢源代码:
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient Object[] elementData;
直接从JDK中出来。它使用一个对象[]
,当数组满时,它会生成一个更大的数组
您可以读取。它使用一个数组和两个整数来指示第一个值-最后一个值索引
private transient int firstIndex;
private transient int lastIndex;
private transient E[] array;
一个示例实现。通常,像ArrayLists
这样的结构是由类内定义的一个好的老式数组实现的,不能在类外直接访问
最初会为列表分配一定量的空间,当您添加一个超过数组大小的元素时,将使用新容量(通常是当前大小的几倍,因此框架不会在添加每个新条目时不断重新分配数组)重新初始化数组.免费提供。以下是摘录:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
/**
* The array buffer into which the elements of the ArrayList are stored.
* The capacity of the ArrayList is the length of this array buffer.
*/
private transient E[] elementData;
.
.
.
}
公共类ArrayList扩展了AbstractList
实现列表、随机访问、可克隆、java.io.Serializable
{
/**
*存储ArrayList元素的数组缓冲区。
*ArrayList的容量是此数组缓冲区的长度。
*/
私有瞬态E[]元素数据;
.
.
.
}
数组列表使用数组保存数据。一旦元素的数量超过分配的数组,它就会将数据复制到另一个数组,可能是该数组大小的两倍
复制数组时会受到(较小的)性能影响,因此可以在数组列表的构造函数中设置内部数组的大小
此外,它还实现了java.util.Collection
和java.util.list
,因此可以在指定的索引处获取元素,并且可以使用iterable(就像数组一样)。ArrayList使用对象数组在内部存储数据。
初始化ArrayList时,将创建一个大小为10(默认容量)的数组,并将添加到ArrayList的元素实际添加到此数组中。10是默认大小,可以在初始化ArrayList时作为参数传递
添加新元素时,如果数组已满,则会创建一个比初始大小多50%的新数组,并将最后一个数组复制到此新数组中,以便现在有空的空间用于添加新元素
由于所使用的底层数据结构是数组,因此在将新元素添加到列表末尾时,向ArrayList添加新元素相当容易。当一个元素要添加到其他任何地方时,比如说开始,那么所有元素都必须向右移动一个位置,以便在开始处为要添加的新元素创建一个空白空间。此过程非常耗时(线性时间)。但ArrayList的优点是,在任何位置检索元素都非常快(恒定时间),因为它的底层只是使用一个对象数组。ArrayList
具有以下基本数据结构:
private transient Object[] elementData;
当我们实际创建ArrayList
时,将执行以下代码段:
this.elementData = new Object[initial capacity];
ArrayList
可以通过以下两种方式创建:
List List=new ArrayList()代码>
默认构造函数被调用,并将在内部创建一个默认大小为10的对象数组
List List=newarraylist(5)代码>
当我们以这种方式创建一个ArrayList
时,将调用带有整数参数的构造函数并
创建一个默认大小为5的对象数组
在add
方法中,检查填充元素的当前大小是否大于/等于
ArrayList
然后它将创建新的ArrayList
,大小为newArrayList=(当前ArrayList*3/2)+1
,并将数据从旧复制到新
新建数组列表。它使用对象[]。当数组已满时,它将创建一个新数组,该数组的大小将增加50%,并将当前元素复制到新数组中。它是自动发生的 据我所知
ArrayList类实现列表接口和
(作为接口仅扩展其他接口)
列表接口扩展了集合接口。
当我们在内存中初始化arraylist时,它默认保留空间10>,并创建您通常使用的整数数组。当此数组已满时,将创建另一个大于默认大小的整数数组
List List=new ArrayList();
现在在内存中为=>Integer[]列表=新整数[10]
现在假设您输入1,2,3,4,5,6,7,8,9,10数组现在已满,当您在内存中输入11时会发生什么情况?将创建另一个大于默认值的整数数组,并将旧数组中的所有元素复制到新数组中。内部arraylist用户对象[]数组
这就是arrayList的工作原理arrayList中使用的基本数据结构是——
private transient Object[] elementData;
所以,根据声明,它是一个对象数组。
当我们实际创建arrayList时,会执行以下代码-
this.elementData=new Object[initial capacity];
当我们创建ArrayList时,会调用默认构造函数,并在内部创建一个默认大小为10的对象数组。现在,我们都知道,与普通数组不同,ArrayList的大小
this.elementData=new Object[initial capacity];