有这样一个问题,List list1=new ArrayList();List list2=new ArrayList(); list2=list1;其实是把list2的地址值指向list1,list2原来的地址值垃圾回收。如果改变list2,list1也会改变,也就是两者指向了同一个内存区域,改变其中一个,另一个也会改变———这就是引用传递。
那么怎么能进行值传递呢?即我想达到这样的效果: 把list1里面的元素赋给list2;但是list2的改变并不影响list1。
网上百度了下,有两个方法:
方法一:ArrayList<Integer> num2 = new ArrayList<Integer>(num1);//利用集合自带的构造方法 方法二:ArrayList<Integer> num2 =(ArrayList<Integer>) num1.clone();//利用克隆的方法进行赋值
这两个方法可行么?实际验证了下,答案是不可行!!!!!依旧是引用传递。
第一种方法的实际代码验证:
import java.util.*;
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
List<List<String>> v2 = new ArrayList<List<String>>();
List<List<String>> v1;
List<String> temp1 = new ArrayList<String>();
temp1.add("001a");
temp1.add("002a");
temp1.add("003a");
v2.add(temp1);
List<String> temp2 = new ArrayList<String>();
temp2.add("001b");
temp2.add("002b");
v2.add(temp2);
for (List<String> t1 : v2) {
System.out.println("v2 "+t1);
}
v1 = new ArrayList<List<String>>(v2);
v1.get(v1.size() - 1).add("hello");
for (List<String> t1 : v2) {
System.out.println("v2 "+t1);
}
}
}
输出:
v2 [001a, 002a, 003a]
v2 [001b, 002b]
v2 [001a, 002a, 003a]
v2 [001b, 002b, hello]
我用v1 = new ArrayList<List<String>>(v2); 把v2赋值给v1,然后改变v1:v1.get(v1.size() - 1).add("hello");结果输出v2发现v2也变了!!!
方法二的代码验证:发现myeclipse6.5环境下,发现我们刚刚定义的v2根本就不支持clone方法!!!Vector支持,所以就用Vector
实验了下
import java.util.*;
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
Vector<Vector<String>> v2 = new Vector<Vector<String>>();
Vector<Vector<String>> v1;
Vector<String> temp1 = new Vector<String>();
temp1.add("001a");
temp1.add("002a");
temp1.add("003a");
v2.add(temp1);
Vector<String> temp2 = new Vector<String>();
temp2.add("001b");
temp2.add("002b");
v2.add(temp2);
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
v1 = (Vector<Vector<String>>) v2.clone();
v1.get(v1.size() - 1).add("hello");
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
}
}
结果如下:
v2 [001a, 002a, 003a]
v2 [001b, 002b]
v2 [001a, 002a, 003a]
v2 [001b, 002b, hello]
依旧还是引用传递!!!!!!改变v1,v2也变了
所以我试了其他的方法,比如挨个赋值:
import java.util.*;
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
Vector<Vector<String>> v2 = new Vector<Vector<String>>();
Vector<Vector<String>> v1=new Vector<Vector<String>>();
Vector<String> temp1 = new Vector<String>();
temp1.add("001a");
temp1.add("002a");
temp1.add("003a");
v2.add(temp1);
Vector<String> temp2 = new Vector<String>();
temp2.add("001b");
temp2.add("002b");
v2.add(temp2);
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
for(Vector<String> temp:v2)
{
v1.add(temp);
}
v1.get(v1.size() - 1).add("hello");
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
}
}
结果如下:
v2 [001a, 002a, 003a]
v2 [001b, 002b]
v2 [001a, 002a, 003a]
v2 [001b, 002b, hello]
还是引用传递!!!!
最后试了这种方法,终于变成了值传递:
import java.util.*;
public class Test10 {
/**
* @param args
*/
public static void main(String[] args) {
Vector<Vector<String>> v2 = new Vector<Vector<String>>();
Vector<Vector<String>> v1=new Vector<Vector<String>>();
Vector<String> temp1 = new Vector<String>();
temp1.add("001a");
temp1.add("002a");
temp1.add("003a");
v2.add(temp1);
Vector<String> temp2 = new Vector<String>();
temp2.add("001b");
temp2.add("002b");
v2.add(temp2);
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
for(int i=0;i<v2.size();i++)
{
Vector<String> temp=new Vector<String>();
for(int j=0;j<v2.get(i).size();j++)
{
temp.add(v2.get(i).get(j));
}
v1.add(temp);
}
v1.get(v1.size() - 1).add("hello");
for (Vector<String> t1 : v2) {
System.out.println("v2 " + t1);
}
}
}
结果如下:
v2 [001a, 002a, 003a]
v2 [001b, 002b]
v2 [001a, 002a, 003a]
v2 [001b, 002b]
终于是值传递了,一个的改变不会影响原来的那个。这个方法很笨,如果哪位读者知道其他的方法,请告诉我,欢迎指正。