ArrayList 创建方式详细分析|Java刷题打卡

本文正在参加「Java主题月 – Java 刷题打卡」,详情查看 活动链接

一、题目 ArrayList 详细分析

觉得自己对ArrayList很了解嘛? 来看一下下一段代码

public static void main(String[] args) {
    List<String> list = new ArrayList<String>(10);
    list.add(2, "1");
    System.out.println(list.get(0));
}
复制代码

没错,下标越界了

Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 0
	at java.util.ArrayList.rangeCheckForAdd(ArrayList.java:643)
	at java.util.ArrayList.add(ArrayList.java:455)
复制代码

Array + List = 数组 + 列表 = ArrayList = 数组列

ArrayList 的数据结构是基于数组实现的,只不过这个数组不像我们普通定义的数组,它可以在 ArrayList 的管理下插入数据时按需动态扩容、数据拷贝等操作。

二、源码分析

private int size;

/**
 * Constructs an empty list with the specified initial capacity.
 *
 * @param  initialCapacity  the initial capacity of the list
 * @throws IllegalArgumentException if the specified initial capacity
 *         is negative
 */
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+
                                           initialCapacity);
    }
}
复制代码

通常情况空构造函数初始化 ArrayList 更常用,这种方式数组的长度会在第一次插
入数据时候进行设置。

当我们已经知道要填充多少个元素到 ArrayList 中,比如 500 个、1000 个,那么为
了提供性能,减少 ArrayList 中的拷贝操作,这个时候会直接初始化一个预先设定
好的长度。

另外,EMPTY_ELEMENTDATA 是一个定义好的空对象;private static final Object[] EMPTY_ELEMENTDATA = {}

方式 01;普通方式
ArrayList<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
复制代码
方式 02;内部类方式
ArrayList<String> list = new ArrayList<String>() \\{
add("aaa");
add("bbb");
add("ccc");
\\};
复制代码
方式 03;Arrays.asList
ArrayList<String> list = new ArrayList<String>(Arrays.asList("aaa", "bbb", "ccc"));
复制代码

以上是通过 Arrays.asList 传递给 ArrayList 构造函数的方式进行初始化,这篇的详解可以看一下我的这篇文章

方式 04;Collections.ncopies

Collections.nCopies 是集合方法中用于生成多少份某个指定元素的方法,接下来就用它来初始化 ArrayList,如下;
这会初始化一个由 10 个 0 组成的集合

    ArrayList<Integer> list = new ArrayList<Integer>(Collections.nCopies(10, 0));
复制代码
© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享