文章目录
本文章由公号【开发小鸽】发布!欢迎关注!!!
老规矩–妹妹镇楼:
一、ArrayList的初始化
(一)直接初始化
这是ArrayList最常用的初始化方式,初始化一个空的List,并通过ArrayList的add()方法不断添加元素,如下所示:
//初始化,不填充
ArrayList<Integer> integers1 = new ArrayList<Integer>();
integers1.add(1);
(二)Arrays.asList
在日常开发中,我们可能会需要初始化一个List,并向其中同时添加多个同类型的值,在这种情况下如果只是通过add()方法添加则会显得非常笨拙,因此尝试采用其他的方式来初始化ArrayList。Arrays.asList是其中的一种方法,可以将数组转换为List集合,可以同时添加多个值,但是这种方法有些坑需要提前说明。
首先,用该方法得到的List长度是无法改变的,当尝试向该List中添加或删除一个元素时,就会抛出异常(java.lang.UnsupportedOperationException),我们通过asList()方法的实现细节来探究原因,如下是asList()方法的实现代码:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
这里的ArrayList不是java.util包下的,而是java.util.Arrays.ArrayList,这是Arrays类中的一个静态内部类,没有实现add()、remove()方法,而是直接使用它的父类AbstractList的相应方法,因此会抛出上述的异常。因此,对于Arrays.asList()方法的使用要十分谨慎,如果只是用来遍历List可以放心使用,但是如果需要修改其中的元素,就不要直接使用。
那么,如果既想要快速生成一个List,又想要修改List中的元素,应该怎么做呢?ArrayList可以将其他的List中的所有元素一起添加到末尾,因此我们可以使用Arrays.asList()初始化一个多元素的List,然后通过addAll()添加到ArrayList中,如下所示:
//初始化一次填充多个值,asList有很多坑,直接生成List则无法使用add(),remove()等方法
//如下的方式为ArrayList赋值,可使用add()、remove()等方法
ArrayList<Integer> integers2 = new ArrayList<Integer>();
List<Integer> list = Arrays.asList(1, 2, 3);
integers2.addAll(list);
同时,我们需要注意如果是通过数组来转变为List,则要区分清楚引用类型和基本数据类型的数组,对于引用类型元素的数组,转换后可以直接遍历,而对于基本数据类型的数组,转换后得到的可能就是数组首地址的单元素List,而不是多元素的List,如下所示:
String[] strings = {"aa", "bb", "cc"};
List<String> stringList = Arrays.asList(strings);
System.out.print("1、String类型数组使用asList(),正常: ");
for(String str : stringList){
System.out.print(str + " ");
}
System.out.println();
int[] ints = new int[]{1, 2, 3};
List intList = Arrays.asList(ints);
System.out.print("3、基本数据类型的数组使用asList(),出错(输出的是一个引用,把ints当成一个元素了):");
for(Object o : intList){
System.out.print(o.toString());
}
System.out.println();
System.out.print(" " + "这样遍历才能正确输出:");
int[] ints1 = (int[]) intList.get(0);
for(int i : ints1){
System.out.print(i + " ");
}
System.out.println();
同时,还需要注意,该方法将数组和List连接起来了,当更新其中一种时,另一个则会自动更新。这一点也需要牢记!!!
(三)Collections.ncopies
当需要初始化一个多元素List,而这些元素都是相同的值时,可以通过Collections.ncopies()来初始化,用法如下所示,即将element元素复制count次填入ArrayList中。
ArrayList<T> obj = new ArrayList<T>(Collections.nCopies(count,element));
//多次重复填充相同的值
ArrayList<Integer> integers3 = new ArrayList<Integer>(Collections.nCopies(2, 5));
二、ArrayList的元素改动
ArrayList常用的几种方法,包括add添加元素、get获取指定index的元素、remove删除指定index的元素等。
public boolean add(E e): 向集合中添加元素,参数的类型和泛型一致
public E get(int index): 从集合中获取元素,参数书索引编号,返回值是对应位置的元素
public E set(int index, E element):修改指定index索引位置的元素
public E remove(int index): 从集合中删除元素,参数是索引编号,返回值就是被删除的元素
public int size(): 获取集合尺寸的长度,返回值是集合中包含元素的个数。
public boolean contains(Object o):判断集合中是否存在指定的Object
由于过于简单,具体的例子就不进行展示了。
三、ArrayList的遍历
(一)for循环
普通的for循环,通过index索引位置来遍历ArrayList:
//1, for循环
for (int i = 0; i < integers1.size(); i++) {
System.out.println(integers1.get(i));
}
(二)增强for循环
增强for循环,直接获取ArrayList中的元素,并遍历:
//2. 增强for循环
for (Integer integer : integers1) {
System.out.println(integer);
}
(三)forEach循环
通过forEach循环,用法如下所示:
public void forEach(Consumer<? super E> action)
可以看到的是,其中的参数是Consumer,可以可以简洁地处理ArrayList中的每个元素,下面将元素直接输出,如下所示:
//3. forEach
integers1.forEach( s -> {
System.out.println(s);
});