Java中ArrayList的addAll()方法问题

addAll()方法复制的是被添加列表的元素引用,本质上是只复制了元素的引用,并没有复制元素本身,要深刻理解这一点。

以调用L1.addAll(L2)为例,当列表里元素为不可变元素(例如String)类型时,对L2列表内元素进行更改不会影响到L1,因为String类型本身并不能被修改,对元素的修改本质上都是修该元素引用,而引用是互不影响的。

如果列表内元素为可变元素(例如List、Map)类型,对列表L2内引用的元素的修改是会影响到L1的,因为只复制了引用,而引用指向的是同样的元素。

		List<String> l1 = new ArrayList<String>();// l1为内部存储String类型的列表
		l1.add("1-1");
		l1.add("1-2");
		l1.add("1-3");
		l1.add("1-4");
		l1.add("1-5");
		List<List<String>> l2 = new ArrayList<List<String>>();// l2为内部存储ArrayList类型的列表
		List<String> l_t1 = new ArrayList<String>();
		l_t1.add("l_t1_1");
		List<String> l_t2 = new ArrayList<String>();
		l_t2.add("l_t1_2");
		List<String> l_t3 = new ArrayList<String>();
		l_t3.add("l_t1_3");
		l2.add(l_t1);
		l2.add(l_t2);
		l2.add(l_t3);
		
		List<String> l3 = new ArrayList<String>();// 创建空l3列表
		l3.addAll(l1);// l3列表内添加l1列表
		l1.set(3, "test");// 修改l1列表内元素的引用
		System.out.println("l1---" + l1);
		System.out.println("l3---" + l3);// 二者互不影响
		
		List<List<String>> l4 = new ArrayList<List<String>>();// 创建空l4列表
		l4.addAll(l2);// l4列表内添加l2列表
		l2.get(1).set(0, "update");
		l2.get(1).add("add");// 对l2列表内的元素进行修改

		List<String> l_t = new ArrayList<String>();
		l_t.add("test");
		l2.set(1, l_t);// 对l2列表内元素的引用进行修改
		System.out.println("l2---" + l2);
		System.out.println("l4---" + l4);// 如果修改l2列表内元素,互相影响,如果修改l2列表内元素的引用,互不影响。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: ArrayListaddAll方法是将另一个集合的所有元素添加到当前集合。具体用法如下: ```java ArrayList<String> list1 = new ArrayList<>(); list1.add("A"); list1.add("B"); list1.add("C"); ArrayList<String> list2 = new ArrayList<>(); list2.add("D"); list2.add("E"); list1.addAll(list2); // 将list2的元素添加到list1 System.out.println(list1); // 输出 [A, B, C, D, E] ``` 在上面的例子,我们创建了两个ArrayList对象list1和list2,然后使用addAll方法将list2的元素添加到list1。最后输出list1的内容,可以看到list1已经包含了list2的元素。 ### 回答2: JavaArrayList是一个非常常用的集合类,它是一个可变长的数组,能够快速地进行插入、删除、查找等操作。ArrayListadd方法可以向列表末尾添加一个元素,而addAll方法则可以添加一个集合的所有元素。 具体来说,addAll方法有两个重载版本: public boolean addAll(Collection<? extends E> c):将指定集合的所有元素追加到列表末尾。 public boolean addAll(int index, Collection<? extends E> c):将指定集合的所有元素插入到指定位置。 其,第一个版本会将所有元素直接添加到列表末尾,而第二个版本会将元素插入到指定位置之后,接着的元素会自动往后移动。如果index参数超出了当前列表的范围,则会抛出IndexOutOfBoundsException。 需要注意的是,addAll方法只能将集合的元素添加到列表,而不能添加一个单独的元素。如果想要添加一个单独的元素,可以使用add方法或者在新建一个列表来存储该元素。 另外需要注意的是,在addaddAll方法,如果向列表添加了一个null元素,则会抛出NullPointerException异常。 总的来说,JavaArrayListaddAll方法非常实用,能够快速地将一个集合的所有元素添加到列表,避免了逐个添加的繁琐过程。如果想要在指定位置插入元素,则可以使用addAll方法的重载版本。但是需要注意添加的元素类型必须与列表元素类型兼容。 ### 回答3: ArrayListJava非常常用的集合类,它提供了操作数组的常用方法,并且动态地调整数组大小。在实际开发,我们经常需要将一个ArrayList的数据添加到另一个ArrayList,这时就可以使用addall()方法来实现。下面就来详细介绍一下Javaarraylistaddall方法addall()方法的作用是将指定的集合的所有元素都添加到ArrayList的末尾。语法如下: ```java public boolean addAll(Collection<? extends E> c) ``` 在这个方法,参数c是一个Collection类型的集合,它可以是List、Set、Queue等集合的实现类。如果指定的集合c包含任何null元素,addall()方法将会抛出NullPointerException。如果ArrayList的容量不足以容纳指定集合的所有元素,将会自动调整ArrayList的容量。 下面给出一个实例,来说明addall()方法的使用: ```java import java.util.ArrayList; public class ArrayListAddAllDemo { public static void main(String[] args) { ArrayList<String> list1 = new ArrayList<String>(); list1.add("apple"); list1.add("orange"); list1.add("banana"); System.out.println("list1: " + list1.toString()); ArrayList<String> list2 = new ArrayList<String>(); list2.add("cherry"); list2.add("grape"); System.out.println("list2: " + list2.toString()); list1.addAll(list2); System.out.println("After addAll, list1: " + list1.toString()); } } ``` 输出结果为: ``` list1: [apple, orange, banana] list2: [cherry, grape] After addAll, list1: [apple, orange, banana, cherry, grape] ``` 在这个例子,首先创建了两个ArrayList集合list1和list2,分别存储了水果的名称。然后调用了list1的addAll()方法,将list2的元素全部添加到list1。最后输出list1的所有元素,结果为[apple, orange, banana, cherry, grape]。可以看到,使用addAll()方法可以非常方便地将一个集合的所有元素添加到另一个集合。 总之,在Javaaddall()方法ArrayList这个非常重要的集合类非常实用的方法之一,能够帮助我们高效、精准地操作集合的元素。希望这篇文章能够对大家深入理解Javaarraylistaddall方法有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值