arraylist扩容机制,ArrayList(20)扩容几次
arraylist扩容机制,ArrayList(20)扩容几次详细介绍
本文目录一览: ArrayList 和LinkList的区别
一、ArrayList
ArrayList在底层维护的是一个Object数组,其默认的元素个数初始设定为10。ArrayList的特点是查询速度快而增删操作相对较慢。
1. 增删操作慢的原因:当向ArrayList中添加数据时,如果当前数组的元素个数不足以容纳新数据,就需要调用数组的grow方法进行扩容。这一过程涉及创建一个新的数组,并将原数组中的所有信息复制到新数组中,这一复制过程消耗时间和内存资源。
2. 删除操作慢的原因:在ArrayList中删除某个元素时,需要将该元素之后的所有元素进行前移操作,这也需要进行一次拷贝过程,这一过程会消耗大量时间。
3. 查询速度快的原因:由于ArrayList底层维护的是数组,因此可以通过数组的下标直接定位到数组中的内容,这一过程速度非常快。
二、LinkedList
LinkedList在底层维护的是一个链表结构,因此其特点为增删操作快而查询操作慢。
1. 增删操作快的原因:LinkedList由于其链表结构的特点,在增删操作时可以直接定位到要增删的位置进行操作,无需像ArrayList那样进行复杂的数组拷贝,因此速度非常快。
2. 查询操作慢的原因:LinkedList在进行查询操作时,需要从链表的头部或尾部开始,依次遍历链表,直到找到匹配的数据为止。这一过程需要逐个节点进行查询,因此会消耗较多的时间。
总结:ArrayList和LinkedList是两种常用的动态数组结构,它们各自有着不同的特点和适用场景。在需要进行大量查询操作时,可以选择使用ArrayList;而在需要进行频繁的增删操作时,可以选择使用LinkedList。
ArrayList(20)扩容几次
当执行`List list = new ArrayList(20);`这样的语句时:
* 这是一个带有参数的构造函数调用,直接指定了初始容量为20。因此,在这个特定的情境下,没有任何扩容操作是必要的,所以可以说“扩容次数为0次”。这意味着从一开始就为列表分配了足够的空间来容纳至少20个元素,无需在将来进行扩容。
再来看不带参数的构造函数调用`ArrayList list = new ArrayList();`:
* 这种形式的构造函数调用是创建了一个新的`ArrayList`实例,其初始大小通常取决于实现和版本(尽管某些版本或框架可能有特定的默认大小,但在标准Java中通常默认不预设具体大小)。不过在某些框架或实现中,如果`ArrayList`作为特定集合的子类实现,可能有一个默认的内部大小设置(例如10),但这并不是Java标准库的通用行为。
至于扩容机制,当`ArrayList`中的元素数量超过了当前的容量时,它会自动进行扩容。扩容的典型方式是增加其容量的50%到100%(具体比例可能因实现而异),然后所有现有元素被复制到新的内部数组中。对于像`new ArrayList(20)`这样带有明确参数的构造函数调用,初始就设定了特定大小的内部数组,因此在创建时就已直接分配了空间,没有任何后续的扩容过程。因此这种情形下也是“扩容次数为0次”。
综上所述,无论哪种方式创建`ArrayList`,只要指定了初始大小作为参数,那么从一开始就为列表分配了足够的空间,因此无需任何扩容操作。如果没有指定初始大小而使用了无参构造函数,那么它的内部扩容机制会根据其自身的规则在需要时进行扩容。无论是哪种情况,其扩容次数均为“零次”。