面试题: ArrayList、LinkedList. Vector三者的异同?

本文详细解析了ArrayList和LinkedList在Java中的实现,讨论了它们的相似之处(实现List接口,可重复存储),以及各自在效率、线程安全和底层结构上的区别。重点介绍了ArrayList的扩容机制变化和LinkedList的链表设计。
摘要由CSDN通过智能技术生成

相同点:三个类都实现了List接口,数据存储特点相同:存储有序,可重复的数据

不同点:

  1. ArrayList:作为List接口的主要实现类,线程不安全,效率高,底层采用Object[]数组存储
  2. LinkedList:对于频繁的插入,删除操作适用,效率比ArrayList高。底层使用双向链表存储
  3. Vector:List接口的古老实现类,线程安全,效率略低,底层使用Object[]存储
.ArrayList的源码分析

jdk7情况下

ArrayList list = new ArrayList();//底层创建了长度是10的object[].数组eLementData
list.add(123); //eLementData[e] = new Integer(123);
...
list.add(11);//如果此次的添加导致底层eLementData数组容量不够,则扩容。

默认情况下,扩容为原来的容量的1.5倍,同时需要将原有数组中的数据复制到新的数组中。
结论:建议开发中使用带参的构造器: ArrayList list = new ArrayList(int capacity)

jdk1.8情况下

ArrayList list = new ArrayList();  // 底层Object[] eLementData初始化为{},并没有创建长度为10的数组
list.add(123);  // 第一次调用add()时,才会创建长度为10的数组,并将数据加入到数组中
...
list.add(11);//如果此次的添加导致底层eLementData数组容量不够,则扩容。扩容机制和jdk1.7一样

小结:jdk1.7中的ArrayList的对象创建类似于单例模式的饿汉式,1.8中的类似于懒汉式,其优点是延迟了数组的创建,节省内存。

LinkedList源码分析

LinkedList:双向链表,内部没有声明数组,而是定义了Node类型的first和last,用于记录首末元素。同时,定义内部类Node,作为LinkedList中保存数据的基本结构。Node除了保存数据,还定义了两个变量:

  1. prev变量记录前一个元素的位置
  2. next变量记录下一个元素的位置
  3. 在这里插入图片描述
List接口的方法

List除了从Collection集合继承的方法外,List集合里添加了一些根据索引来操作集合元素的方法。

  • void add(int index, Object ele):在index位置插入ele元素
  • boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来
  • Object get(int index):获取指定index位置的元素
  • int indexOf(Object obj):返回obj在集合中首次出现的位置
  • int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置
  • Object remove(int index):移除指定index位置的元素,并返回此元素、
  • Object set(int index, Object ele):设置指定index位置的元素为ele
  • List subList(int fromIndex, int tolndex):返回从fromIndex到tolndex位置的子集合
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值