java 基础关于 list 集合问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 基础关于 list 集合问题相关的知识,希望对你有一定的参考价值。
List list1 = new ArrayList();
list1.add("1");
list1.add("2");
List list2 = new ArrayList();
list2.add(list1); //如果下面执行list1.clear()后 list2里面添加的list1的数据会清空
list2.addAll(list1); //如果下面执行list1.clear()后 list2里面添加的list1数据不会清空
list1.clear();
System.out.println(list2.toString());
谁能说说这是为什么 ?
下面竟有人看不懂,就是想问下 add(Object o) 和 addAll(Collection c ); 的区别。
list2.addAll(list1); 把list1中的包含元素做为list2自己的元素add ,你加了两个,自然传入的是两个值,这时clear list1,只是切断list1和两个元素之间的关系,并没有改变list2(这时list2有两个值,list1为空)
“就是想问下 add(Object o) 和 addAll(Collection c ); 的区别。”
这参数不同,还不是明显的区别么? 参考技术A 你可以这样理解:add方法是将list1的内存地址加给了list2的一个item,并不是把list1中的每个元素作为item加到list2中,是作为整体,list1就是其一个item,这样list1清空后,内存中list1存放的元素的地址丢失,但其元素实际还在。而addAll是把list1的每个元素作为item加到list2中。里面的存放元素指向原来list1每个元素的内存地址。即使list1清空啦,也不会影响到list2。 参考技术B 输出一下就明白了,list2.addAll之后的值为[ [1,2],1,2],list1.clear之后的值为[[],1,2]现在的list2长度为3,因为第一个元素是一个list对象,当list1.clear()之后list1的值为空,也就是[],addALL相当于把list1的值取出之后在add到list2中也就相当于list2.add("1"),list2.add("2"),总的来说就是相当于list2.add(list1),list2.add("1"),list2.add("2")
区别就是add添加的是什么就是什么,addALL会把添加的List的值先取出来然后在add到list中本回答被提问者采纳 参考技术C add是将传入的参数作为当前List中的一个Item存储,即使你传入一个List也只会另当前的List增加1个元素
addAll是传入一个List,将此List中的所有元素加入到当前List中,也就是当前List会增加的元素个数为传入的List追问
再继续copy吧
追答呵呵..
但是也没错阿 这解释.....
你以为就你想到了对象的引用被清空了。
零基础学Java—List集合(三十九)
【零基础学Java】—List集合(三十九)
java.util.list
接口 extends Collection
接口
list接口的特点:
1、有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出321)
2、有索引,包含了一些带索引的方法
3、允许重复的元素
list接口中带索引的方法有:
public void add(int index,E element)
:指定的元素,添加到该集合的指定位置上public E get(int index)
:返回集合指定位置的元素public E remove(int index)
:移除列表中指定的元素,返回的是被移除的元素public E set(int index,E element)
:用指定的元素替换集合中指定位置的元素,返回值是更新前的元素
注意:操作索引的时候,一定要防止索引越界异常
IndexOutOfBoundsException
:索引越界异常 集合会报
ArrayIndexOutOfBoundsException
:数组越界异常
StringIndexOutOfBoundsException
:字符串索引越界异常
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author :CaiCai
* @date : 2022/4/13 11:02
*/
/*
java.util.list接口 extends Collection接口
list接口的特点:
1、有序的集合,存储元素和取出元素的顺序是一致的(存储123 取出321)
2、有索引,包含了一些带索引的方法
3、允许重复的元素
list接口中带索引的方法有:
public void add(int index,E element):指定的元素,添加到该集合的指定位置上
public E get(int index):返回集合指定位置的元素
public E remove(int index):移除列表中指定的元素,返回的是被移除的元素
public E set(int index,E element):用指定的元素替换集合中指定位置的元素,返回值是更新前的元素
注意:操作索引的时候,一定要防止索引越界异常
IndexOutOfBoundsException :索引越界异常 集合会报
ArrayIndexOutOfBoundsExceptionL:数组越界异常
StringIndexOutOfBoundsException:字符串索引越界异常
*/
public class demo01
public static void main(String[] args)
//创建一个list集合对象 多态
List<String> list=new ArrayList<>();
//使用add向集合中添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("a");
System.out.println(list);//[a, b, c, a]
//public void add(int index,E element):指定的元素,添加到该集合的指定位置上
list.add(3,"lily");
System.out.println(list);
//public E remove(int index):移除列表中指定的元素,返回的是被移除的元素
String removeE=list.remove(2);
System.out.println("被移除的元素:"+removeE);//c
System.out.println(list);//[a, b, lily, a]
//public E set(int index,E element):用指定的元素替换集合中指定位置的元素,返回值是更新前的元素
//把最后一个a替换成为大写的A
String setRemove= list.set(3,"A");
System.out.println("被替换的元素是:"+setRemove);
System.out.println(list);//[a, b, lily, A]
//list集合遍历的三种方式
for (int i = 0; i <list.size() ; i++)
//public E get(int index);返回集合中指定位置的元素
String s =list.get(i);
System.out.println(s);
System.out.println("===============");
//使用迭代器
Iterator<String> it=list.iterator();
while(it.hasNext())
String s=it.next();
System.out.println(s);
System.out.println("============");
//使用增强for
for (String s : list)
System.out.println(s);
以上是关于java 基础关于 list 集合问题的主要内容,如果未能解决你的问题,请参考以下文章