Java中ArrayList和LinkedList的区别
在Java中虽然ArrayList和LinkedList都实现了List接口,但是其底层原理不相同。
ArrayList的底层是一个数组,LinkedList的底层是链表。
ArrayList在增加和删除元素时,时间复杂度是O(N)。
LinkedList则是O(1),因为LinkedList的底层是一个双向链表,拥有头节点和尾节点,可以通过头节点和尾节点直接添加元素。也可以直接通过索引来删除元素。但是在指定位置添加元素时候,时间复杂度和ArrayList的时间复杂度相同为O(N)。
虽然LikedList在增删查改这方面优于ArrayList,但是两者的访问速度则是ArrayList比LinkedList快。因为ArrayList的底层是数组,数组的访问速度优于链表的访问速度。
ArrayList在扩容的时候需要申请新的空间,拷贝原数组的数据,释放旧空间。会有不小的消耗。
当你数组只有100的空间时,满了数组扩充到200,此时你只需要存储102个数据,就会浪费98个空间,造成空间的剩余。但是对于链表来说,我们存一个数据,才开辟一个空间给我们存储数据,就避免了空间上的浪费。
ArrayList的底层是一个数组,LinkedList的底层是链表。
ArrayList在增加和删除元素时,时间复杂度是O(N)。
LinkedList则是O(1),因为LinkedList的底层是一个双向链表,拥有头节点和尾节点,可以通过头节点和尾节点直接添加元素。也可以直接通过索引来删除元素。但是在指定位置添加元素时候,时间复杂度和ArrayList的时间复杂度相同为O(N)。
虽然LikedList在增删查改这方面优于ArrayList,但是两者的访问速度则是ArrayList比LinkedList快。因为ArrayList的底层是数组,数组的访问速度优于链表的访问速度。
ArrayList在扩容的时候需要申请新的空间,拷贝原数组的数据,释放旧空间。会有不小的消耗。
当你数组只有100的空间时,满了数组扩充到200,此时你只需要存储102个数据,就会浪费98个空间,造成空间的剩余。但是对于链表来说,我们存一个数据,才开辟一个空间给我们存储数据,就避免了空间上的浪费。