【Java学习笔记(一百二十四)】之ArrayList用法

本文章由公号【开发小鸽】发布!欢迎关注!!!


老规矩–妹妹镇楼:

一、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);
});
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值