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.add(list1); list1作为一个对象被传入(这时list2中只有一个值),当list1所包含的被clear,list1还在list2中,只是为空而已(list2中有个空的list1,list1为空)
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吧

追答

呵呵..
但是也没错阿 这解释.....

参考技术D 对象的引用在list1.clear();也被清空了追问

你以为就你想到了对象的引用被清空了。

零基础学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 集合问题的主要内容,如果未能解决你的问题,请参考以下文章

零基础学Java—List集合(三十九)

JAVA-基础(List及其子类)

Java基础_List集合

[Java基础]List集合

Java基础——集合源码解析 List List 接口

java基础笔记----集合之list集合