1. 首先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的
2. 由于底层数据结构不同,他们所适用的场景也不同,ArrayList更适合随机查找, LinkedList更适合删除和添加, 查询、添加、删除的时间复杂度不同
3. 另外ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现了 Deque接口,所以LinkedList还可以当做队列来使用
ArrayLis
基于动态数组,连续内存存储,适合下标访问(随机访问)
扩 容机制:因为数组长度固定,超出长度存数据时需要新建数组,然后将老数组的数据拷贝到新数组,如果不是尾部插入数据还会涉及到元素的移动(往后复制一份,插入新元素)
使用尾插法并指定初始容量可以极大提升性能、甚至超过linkedList (需要创建大量的node对象)
LinkedList
基于链表,可以存储在分散的内存中,适合做数据插入及删除操作
不适合查询:需要逐一遍历,遍历LinkedList必须使用iterator不能使用for循环,因为每次for循环体内通过get(i)取得某一元素时都需要对list重新进行遍历,性能消耗极大。
不要试图使用indexOf等返回元素索引,并利用其进行遍历,使用indexOf f对list进行 了遍历,当结果为空时会遍历整个列表。