Java list1=list2;list2=null ? list1=list2;list2.clear()?

Posted 二十六画生的博客

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java list1=list2;list2=null ? list1=list2;list2.clear()?相关的知识,希望对你有一定的参考价值。

jdk1.8:

1

list1=list2;list2=null;

结果:list2把集合赋值给list1, list2指向null,list1指向原来list2的集合(集合无变化)

2

list1=list2;list1=null;

结果:list2把集合赋值给list1, list1指向null,list2依然指向原集合(集合无变化)

3

list1=list2;list2.clear();

结果:list2把集合赋值给list1, list2执行clear后,list1、list2均指向null

 

4

        List<String> list2 = new ArrayList();
        //list1加入数据
        list2.add("a");
        list2.add("b");
        list2.add("c");

        List<String> list1 = new ArrayList();
        list1 = list2;//list1也是abc
        list2 = null;//list1还是abc,list=null

        List<String> list3 = new ArrayList();
        //list1加入数据
        list3.add("a1");
        list2 = list3;//list1还是abc,lis2:a,list3:a

5

list1=list2;list2=null; 改变了list2的指针,list2对象不存在了,list2.size()报错NPE;list1正常。

list1=list2;list2.clear();把集合的元素都设置为了null,list1、list2对象依然存在,list1.size()=0,list2.size()=0

ArrayList.java源码:


    /**
     * Removes all of the elements from this list.  The list will
     * be empty after this call returns.
     */
    public void clear() 
        modCount++;

        // clear to let GC do its work
        for (int i = 0; i < size; i++)
            elementData[i] = null;

        size = 0;
    

6

Java中 "="的作用有两个:

1.赋值

2.指向地址

那么这两个作用具体什么情况下起什么作用呢?答案如下:

当对基本数据类型进行赋值时 "="的作用就是单纯的赋值,例如:int i=1,int j=2;

而当对引用数据类型进行赋值时"="的作用就是将被赋值对象的地址指向赋值对象的地址,例如:

List<String> A =new ArrayList<>();
List<String> B =new ArrayList<>();
A=B;

这里插入讲一下Java堆、栈、常量池的区别:

栈:一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配,但对象本身不存放在栈中,而是存放在堆(new出来的对象)或者常量池中(对象可能在常量池里)(字符串常量对象存放在常量池中。)
堆:存放new 出来的对象。
常量池:存放字符串常量和基本类型常量(public static final)。

对于栈和常量池中的对象可以共享,对于堆中的对象不可以共享。

注意看上面对栈的描述,当我们定义两个List集合A,B的时候,集合A,B是引用数据类型,那么他们的引用先是在栈内存中分配,而对象本身是在进行new操作的时候存放在堆内存中,由堆进行内存分配。所以我们用B=A这种方式对集合B进行赋值时其实是将A的引用赋值给B,也就是说B指向了A的地址。当对A或是对B进行数据clear,add等操作时相应的B或A中的数据也会发生对应的变化。

最后,如果要将一个List集合赋值给另一个List集合,并且操作其中一个集合不会影响另一个集合时,可以用以下几种方法:

//方法一
ArrayList B = new ArrayList<> (A);
 
//方法二
B.addAll(A);
 
//方法三
B = A.clone();
 
//方法四
for(String s: A)
 B.add(s);

以上是关于Java list1=list2;list2=null ? list1=list2;list2.clear()?的主要内容,如果未能解决你的问题,请参考以下文章

Java list1=list2;list2=null ? list1=list2;list2.clear()?

java进行list1.addall(list2)之后,list2是保留还是清空了?

java中 两个list怎么合并啊?有list,list1,list2。想要list等于list1和list2相加得到的队列怎么写?

java怎么比较两个list是不是相同?

java 怎么比较两个list是不是相同

java 基础关于 list 集合问题