说⼀下ArrayList和LinkedList区别

  1. 具体区别  
1.1. ⾸先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现的
1.2. 由于底层数据结构不同,他们所适⽤的场景也不同,ArrayList更适合随机查找,
LinkedList更适合删除和添加,查询、添加、删除的时间复杂度不同
1.3. 另外ArrayList和LinkedList都实现了List接⼝,但是LinkedList还额外实现了Deque接⼝,所以
LinkedList还可以当做队列来使⽤

  2.类结构

 2.1.ArrayList实现了List接口
public class ArrayList<E> extends AbstractList<E> implements List<E>{...}

2.2.LinkedList实现了List和Deque接口,所以LinkedList可以当做双端队列来进行使用:因为Deque接口中有addFirst/addLast/getFirst/getLast等操作
public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>{...}

  3.效率问题

    3.1 查询:arrayList的速率会更快,因为arrayList底层是基于数组,所以获取是通过数组下标进行获取!

        但是linkedList.getFirst()/getLast()速率也是很快的,因为linkedList会有两个属性专门标注第一个元素和最后一个元素
1.arrayList.get(1);
底层代码:基于下标获取
public E get(int index) {
rangeCheck(index);
return elementData(index);
}
2.linkedList.get(1);
底层代码:基于链表的操作,所以获取在底层是进行循环获取的!
public E get(int index) {
...
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
...
}

    

  3.2 添加操作
1.arrayList的添加
1.1添加元素:需要考虑底层数组的扩容,效率较慢
arrayList.add(1);
1.2:在指定的位置1,添加元素1:底层涉及到数组的移动,因为1位置后的数据都得往后移动,效率较慢
arrayList.add(1,1);
2.linkedList的添加
2.1添加元素:在末尾添加元素,因为底层是链表,所以添加速度较快
linkedList.add(1);
2.2:在指定的位置1,添加元素1:因为底层是链表,需要先循环找到要添加的位置,
如果下标数字过大,等于循环次数越多,效率就会越慢
下标数字小,循环次数小,效率快!所以此处的效率是决定于插入位置的数字大小
linkedList.add(1,1);
总结:
 1.arrayList:查询速率较快,但是增删效率一般!
 2.linkedList:查询速率较慢,但是增删效率比arrayList快!
 
 

最新文章

  1. makfile
  2. ddl dml dcl
  3. linux常用命令:4文件压缩和解压命令
  4. POI实现word文档转html文件
  5. Cortex-M3 Context Switching
  6. Delphi的IDHTTP的基本用法
  7. php 验证身份证有效性,根据国家标准GB 11643-1999 15位和18位通用
  8. redhat7 常用命令
  9. h5、jq 移动端评论点攒功能
  10. css设置兼容的透明样式
  11. WinForm的.Designer.cs代码内抛反射异常
  12. 编译Uboot——错误记录
  13. Android5.0通知变化浅析
  14. HDFS 操作命令总结
  15. Asp.net core 2.0.1 Razor 的使用学习笔记(六)
  16. scala中获取Map中key和value的方法
  17. 13个实用的Linux find命令示例
  18. cygwin完全安装步骤方法(组图)
  19. java资料——顺序存储结构和链式存储结构(转)
  20. HDU1102 最小生成树prim算法

热门文章

  1. Mybatis mapper文件占位符设置默认值
  2. 如果一个表有一列定义为 TIMESTAMP,将发生什么?
  3. 构造器constructor是否可被重写override?
  4. 是否可以继承 String 类?
  5. 学习Squid(一)
  6. 模拟web服务器http请求应答
  7. 第一天&#183;浏览器内核及Web标准
  8. java中为什么把Checked Exception翻译成受检的异常?
  9. Native方法的使用
  10. 小程序checkbox调整大小(checkbox样式修改)