Array 与 ArrayList ,LinkedList之间的区别,优缺点,以及使用场景

本文深入探讨了Array与ArrayList的区别,包括存储空间大小、存储内容类型、使用方法、效率对比及应用场景。同时,对比了ArrayList与LinkedList在数据操作及查询性能上的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. Array 与 ArrayList 的区别,以及应用场景的不同之处

ArrayList 可以理解为能够自动扩容的 array ,也就是两者的第一个区别:
1. 存储空间大小的区别

  • Array 的空间大小是固定的,空间不够时也不能再次申请,所以需要使用之前确定合适的空间大小。
  • ArrayList 的空间是可以动态增长的,当空间不够时,ArrayList 的底层会生成一个新的数组,长度为原数组的 1.5 倍 + 1 ,也就是源码中 newLength = oldarrayLength + (oldarrayLengt >> 1) + 1 。
2. 存储内容的比较:
  • Array 数组可以包含基本类型和对象类型,而且存放是的时候一定是同种类型的元素(除非类型是 Object ),
  • String [] list ={“a”,“b”}
    那么此数组只能存储 String 类型的,而 ArrayList 存放的是对象类型,所以可以存储 Object,可以有所区别。
  • ArrayList 数组 只能存放对象类型,比如
    ArrayList list = new ArratList<>();
3.使用方法方面的比较
  • ArrayList 是Array 的增强版,但是是有所取舍的增强,基本上 Array 的方法 ArrayList 也能用,继而增加了 addAll(),removeAll(),返回迭代器 iteratorAll()等,Array 是没有的。
4.效率方面的
  • Array > Arraylist ,原因自然在于 ArrayList 的动态扩容造成的效率损耗。
  • 二者在内存中都是连续存储的,所以通过索引查找元素的速度都非常快,赋值元素也比较简单。
  • 但是,数组在插入/删除数据是很麻烦的,因为插入数据后,数组的其他元素要进行相对位置的移动,时间复杂度就是O(n),而LinkedList 是O(1)。
5.使用场景
  • 如果想保存一些在整个程序 运行期间都会存在而且不变的数据,我们就可以适应 Array
    ,但是如果我们单纯只是想要以数组的形式保存数据,而不对数据及逆行增加等操作(因为插入删除元素,ArrayList 的效率并不高 O(n),此处考虑选用LinkedList),只是方便查找的话,我们可以用 ArrayList。
6.Array 与 ArrayList 的相互转化

Array —> ArrayList

String [] list = {"a","b"};
List alist = Arrays.asList(list);

ArrayList --> Array

List list=new ArrayList();  
        list.add("a");  
        list.add("b");  
        list.add("c");  
        int len=list.size();  
        String[] array = (String[])list.toArray(new String[len]);  
        for(int i=0;i<array.length;i++){  
            System.out.println(array[i]);  
        }

注 :Array 的对象类型是 Obect 时,类型可不同

Object [] list = new Object[5];
list[0] = new Animal();
arr[1] = 2;
arr[2] = "ok?"

增加 List 相关知识点

  • List 是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,继承自 Collection 。
  • List 是一个接口,ArrayList 是一个类,ListArray 继承并实现了 List, List 是不能被构造,但可以为 List 创建一个引用,而 ListArray 可以被构造,举例如下:
 List list = new List(); //错误的用法
 List list; //只是构建引用,list = null,正确用法
 List list = new ArrayList();
/**构建了一个ArrayList 对象后上溯到了List。
此时它是一个List 对象了,
有些ArrayList 有的但是 List 没有的方法,它就不能使用了。
而 ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
**/
二 .ArrayList 与 LinkedList 的区别,以及应用场景的不同
  • ArrayList 和 LinkedList 都是实现了 List
    的接口,用于存储一系列的对象引用,都可以对元素的增删改查进行操作。

  • 对于 ArrayList
    ,它在集合的末尾删除和添加元素的所用时间是一样的,但是在列表中间添加或删除元素所用时间就会大大增加,但是根据索引查找元素的时候速度很快。

  • 对于 LinkedList 则相反,它在插入删除集合中任何位置的元素的所花费的时间是一样的,但是它根据索引查询一个元素的时候却比较慢。

ArrayList 与 LinkedList 二者的区别
  1. 构成结构的不同
    ArrayList 基于动态数据的数据结构,而 LinkedList 是基于链表结构。
  2. 对于随机访问 get 和 set 方法,ArrayList 是优于 LinkedList,因为LinkedList 要移动指针。
  3. 对于新增/删除数据add /remove,优先选择 LinkedList,因为 ArrayList 操作后要移动数据。
性能上的缺点
  1. 对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。

  2. 在ArrayList集合中添加或者删除一个元素时,当前的列表所所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。

  3. LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。

  4. ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间

    参考文章

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值