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相加得到的队列怎么写?