本文正在参加「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