Java中ArrayList和LinkedList的区别
底层实现:
ArrayList底层是数组结构,元素在内存中是连续存储的,默认容量是10.(在添加元素时超过容量也不会报出异常,因为会自动扩容)。
LinkedList底层是双向链表结构,元素在内存中是非连续存储,每个元素了指向前一个和后一个元素的指针。
注意:这两者线程都是不安全的,如果在多线程的环境下操作,需要外部同步。
插入/删除数据的方式:
ArrayList是需要将添加/删除元素后面的所有元素向后/前移动一位,除了要操作元素本身位置的数据,还需要对集合中的其他元素进行重新位置的排序,时间复杂度为O(n).
LinedList可以从头部进行添加也可以从尾部进行添加,只需要修改插入/删除元素前后的两个指针,时间复杂度为O(1),所以根据数据结构来讲的话,插入和删除操作LinkedList要比ArrayList效率高。
添加元素的效率:
ArrayList在不改变容量的情况下,增加元素比LinkedList要快。但如果改变容量的情况下,LinkedList要比ArrayList增加元素要快。(因为ArrayList要要扩容,所谓扩容也就是增加容量)
查询效率:
ArrayList:如果是根据角标去查询的话,是可以通过角标直接获取元素,时间复杂度为o(1)
LinkedList:需要从头部或者是尾部进行二分遍历来查找指定元素,时间复杂度为o(n)
注意:如果根据角标去查询数据的话,ArrayList要比LinkedList效率要高,如果不能根据角标去查询数据的话,两个都是通过遍历查询数据,所以效率都低。
内存占用:
ArrayList是需要预留空间,默认容量是10,所以相对于LinkedList来讲内存占用比较高。
LinkedList是不需要预留空间,所以内存占用比较低。
使用场景:
ArrayList:适用于对插入和删除操作要求不高的场景,可以进行随机访问跟修改操作。由于ArrayList是基于数组实现的,所以或需要存储大量数据时,它在内存使用上更高效。
LinkedList:适用于对随机访问要求不高的场景(即不需要通过索引访问元素),而是经常在链表头部或尾部进行操作,可以进行频繁地插入和删除操作。
(我理解的是这样的,可能有的我理解的也是错的,可以提出建议)