Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ArrayList是如何工作的?_Java_Arraylist - Fatal编程技术网

Java ArrayList是如何工作的?

Java ArrayList是如何工作的?,java,arraylist,Java,Arraylist,ArrayList内部使用什么数据结构?内部ArrayList使用对象[] 当您向阵列列表添加项目时,列表将检查备份阵列是否还有空间。如果有空间,新项目只会添加到下一个空白处。如果没有空间,将创建一个更大的新阵列,并将旧阵列复制到新阵列中 现在,还有更多的空间,新元素将添加到下一个空白空间中 因为人们非常喜欢源代码: /** * The array buffer into which the elements of the ArrayList are stored. * The capaci

ArrayList内部使用什么数据结构?

内部
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
    ,大小为new
    ArrayList=(当前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];