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可能更合适。您可以根据具体的使用场景选择适当的数据结构。