ArrayList和LinkedList

ArrayList是一个动态扩容的数组,如果没有给初始的大小,默认是10个元素大小;给了固定大小就是固定大小长度。

动态扩容很简单,就是创建一个新的数组按原来大小的1.5倍扩容量,然后使用arrays.copyof()将旧的数据copy到新的数组中,新进来的数据添加到新的数组中,从而完成动态扩容这个过程。

LinkedList和ArrayList是Java中两种不同的数据结构,用于存储和操作集合元素。它们在以下几个方面存在区别:

1. 底层数据结构:

  - ArrayList使用数组作为底层数据结构,通过索引来访问和操作元素。

  - LinkedList使用双向链表作为底层数据结构,每个节点存储元素和指向前后节点的引用。

2. 插入和删除操作:

  - ArrayList对于插入和删除操作相对较慢。当在列表的中间位置插入或删除元素时,需要将后续元素向后或向前移动,导致时间复杂度为O(n)。

  - LinkedList在插入和删除操作上更加高效。由于它使用链表结构,插入和删除只需修改节点的引用,时间复杂度为O(1)。

3. 随机访问:

  - ArrayList支持快速的随机访问,可以通过索引直接访问元素,时间复杂度为O(1)。

  - LinkedList在随机访问上相对较慢。要访问特定位置的元素,需要从头节点或尾节点开始遍历链表,时间复杂度为O(n)。

4. 内存占用:

  - ArrayList在存储元素时,需要按照预估大小分配连续的内存空间。如果元素数量超过了分配的空间,需要重新分配更大的内存块,并将原有元素复制到新的内存块中。

  - LinkedList在存储元素时,只需要额外存储节点的引用和元素本身的值,没有连续的内存分配和复制。

5. 迭代器性能:

  - ArrayList的迭代器(Iterator)性能较好,可以通过索引直接访问元素,迭代过程效率高。

  - LinkedList的迭代器在迭代时需要从头或尾节点开始遍历链表,性能较差。



综上所述,如果需要频繁执行插入、删除操作或者对列表进行顺序访问,LinkedList可能更加适合。而如果需要频繁执行随机访问或迭代操作,ArrayList可能更合适。您可以根据具体的使用场景选择适当的数据结构。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容