LIST
ArrayList和LinkedList的区别
- 数据结构:
- ArrayList是基于动态数组的数据结构
- LinkedList是基于链表的数据结构。
- 内存空间:
- 在ArrayList中,元素是连续存储的,因此获取元素时速度较快,但是当需要添加或删除元素时,可能需要移动大量元素,效率较低。
- LinkedList则是非连续存储,元素间的访问需要经过链表节点的指针,所以访问元素时速度较慢,但新增和删除操作时效率较高。
- 查询效率:在进行随机访问(get和set操作)时,
- ArrayList由于内存为连续的地址,可随机访问,查询速度快
- LinkedList在这种情况下则较慢,因为它需要从前往后移动指针依次查找。
- 插入和删除效率:在进行新增和删除(add和remove操作)时,
- ArrayList操作点后边所有数据的下标索引都会造成影响,需要把后面所有的数据进行移动
- LinkedList效率更高,把链条断开重新指向即可。
ArrayList的扩容机制
ArrayList的底层实现是动态数组,其扩容机制是在需要插入新元素而当前数组容量不够时,通过创建一个新的数组,并将原数组中的元素复制到新数组中,以实现扩容。
具体来说,当在ArrayList中添加新元素时,会检查当前数组的长度。如果当前数组长度已经达到其最大容量,那么就会进行扩容。扩容的过程是创建一个新的数组,其长度是原数组长度的1.5倍(也可以理解为原数组长度加上原数组长度的一半),然后将原数组的所有元素复制到新数组中。
这种扩容机制使得在插入大量元素时,ArrayList的效率较高,因为每次扩容只需要创建一次新数组,然后进行一次元素复制,而对于元素插入的每次操作,只需要在新数组中找到合适的位置插入即可。但是,在某些情况下,如果需要频繁地插入少量元素,这种扩容机制可能会导致ArrayList的性能较低,因为每次插入都需要进行数组复制操作。
ArrayList的扩容机制在Java源码中的实现如下:
public boolean