当前位置:   article > 正文

Java自学日记之List,Array,Arrays,ArrayList的区别_java arraylist array list

java arraylist array list

系列文章目录

暂无,没准以后会有后续。。



前言

最近在看Java容器的源码,看到了Arrays类,结合之前所学一时间有些迷惑List,Array,Arrays,ArrayList这几个类的区别,百度了一下,都是两两比较,就在这里整合记录一下吧
PS:因为我自己也是边学边写的,所以文章逻辑性可能不太强,就是想到哪记到哪


一、List接口

List是一个接口
jdk8中他的函数声明是这样的

public interface List<E> extends Collection<E>
  • 1

很简单的继承,感觉java容器里,除了map下面那几个都挺省心的

不能实例化一个对象,但我们可以为List创建一个创建一个指向自己的对象引用,用它的子类实现实例化

//正确的用法
List list = new ArrayList();
List list1 = new LinkedList();
//错误的用法
List list = new List();
  • 1
  • 2
  • 3
  • 4
  • 5

二、数组类Array

这个声明比List还干净

public final class Array
  • 1

这里啥也没有不妨往上看看注释
The Array class provides static methods to dynamically create and access Java arrays.

这里能看出来Array类只是提供静态方法来动态创建和访问Java数组,它的结构里也是清一色的static,在网上查了一下,很多人把它当作一种Java最基本的一个存储结构,姑且先这么理解吧。。

在这里插入图片描述
这里的构造方法权限是private,说明这个类是没办法实例化的,只能算是一个工具箱

/**
* Constructor.  Class Array is not instantiable.
*/
private Array() {}
  • 1
  • 2
  • 3
  • 4

另外有一点需要注意的是,因为Array本质上是数组,所以它的容量是固定的且无法动态改变


三、静态类Arrays

函数声明依然没啥

public class Arrays
  • 1

这里获取不到信息就往上看注释
This class contains various methods for manipulating arrays (such as sorting and searching). This class also contains a static factory that allows arrays to be viewed as lists.

该类包含用于操作数组(例如排序和搜索)的各种方法。这个类还包含一个静态函数,它允许数组作为列表查看。
简单来说又是数组的一个工具类

话说这个数组转列表的函数以前好像看到过,往下翻了一下果然找到了

    /**
     * Returns a fixed-size list backed by the specified array.  (Changes to
     * the returned list "write through" to the array.)  This method acts
     * as bridge between array-based and collection-based APIs, in
     * combination with {@link Collection#toArray}.  The returned list is
     * serializable and implements {@link RandomAccess}.
     *
     * <p>This method also provides a convenient way to create a fixed-size
     * list initialized to contain several elements:
     * <pre>
     *     List&lt;String&gt; stooges = Arrays.asList("Larry", "Moe", "Curly");
     * </pre>
     *
     * @param <T> the class of the objects in the array
     * @param a the array by which the list will be backed
     * @return a list view of the specified array
     */
    @SafeVarargs
    @SuppressWarnings("varargs")
    public static <T> List<T> asList(T... a) {
        return new ArrayList<>(a);
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

嗯,,应该就这个,,吧 。。||
这里需要注意的一点是,Arrays.asList确实会返回一个ArrayList对象,但是该类是Arrays类中一个私有静态内部类(java.util.Arrays.ArrayList),而不是常见的java.util.ArrayList类,这个内部类中不具有任何添加或移除元素的方法
在这里插入图片描述
不过我们可以注意到ArrayList类的构造方法可以接受Collection类及其子类的类型

public ArrayList(Collection<? extends E> c) {
  • 1

所以如果我们需要把Array转换成ArrayList可以这样

String[] str = new String[] {"a", "b", "x"};
List<String> list = new ArrayList<>(Arrays.asList(str));
  • 1
  • 2

四、ArrayList类

public class ArrayList<E> extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  • 1
  • 2

ArrayList是动态数组,也就是数组的复杂版本,它可以动态的添加和删除元素,从函数声明中可以看到ArrayList实现了java.util.Collections.Collection.List接口

ArrayList的底层是一个Object型的数组

    /**
     * The array buffer into which the elements of the ArrayList are stored.
     * The capacity of the ArrayList is the length of this array buffer. Any
     * empty ArrayList with elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA
     * will be expanded to DEFAULT_CAPACITY when the first element is added.
     */
    transient Object[] elementData; // non-private to simplify nested class access
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

再看一下插入函数的声明

public boolean add(E e)
  • 1

可以看到,在不使用泛型的情况下,这个ArrayList是可以添加进不同类型的元素的,而且ArrayList是可以不用指定长度的。

ArrayList算是List的一种具体实现,所以没必要和List比较,和Array比的话,有以下几点:

  1. 长度
    Array的长度是不可变的
    ArrayList的长度是可以改变的(空间不够时会自动扩容一倍)
  2. 存储的数据类型
    ArrayList可以存储异构对象,而Array只能存储相同数据类型的数据。
  3. 效率
    往ArrayList里面添加和修改元素,会引起装箱和拆箱的操作,频繁的操作可能会影响一部分效率,效率方面不如定长的Array

先这些吧,太晚了,明天再写总结
写博客是有点费时间==,一个晚上就看了个数组

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/525133
推荐阅读
相关标签
  

闽ICP备14008679号