ArrayList对象的赋值
写算法题的时候发现ArrayList对象的赋值很有意思,有点像c语言中的地址。即使是形参也可以直接改变对象里的数据。
- 两个ArrayList对象直接进行赋值只是会改变地址的指向,并不会实现像其他类型变量赋值一样的效果
- 可以直接使用ArrayList的形参去改变对象中的数据。
看下面例子
package _4_9_test;
import java.util.ArrayList;
public class NightyThreeTest_Two {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
System.out.println("处理前对象a中的数据:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i) + " ");
}
System.out.println();
test1(a);
test2(a);
System.out.println("处理后对象a中的数据:");
for (int i = 0; i < a.size(); i++) {
System.out.print(a.get(i) + " ");
}
}
// 直接赋值移除数据
public static void test1(ArrayList arrayList) {
ArrayList b = arrayList;
b.remove(0);
}
// 直接用形参移除数据
public static void test2(ArrayList arrayList) {
arrayList.remove(0);
}
}
可以看到对象a中的数据被改变了
通过上面的例子可以看到下面这种赋值是错误的,这样只是将b对象的地址指向了a,而b原先的对象就被回收了
ArrayList a = new ArrayList();
ArrayList b = new ArrayList();
b= a;
正确的ArrayList赋值方法
常用的赋值方法有两种
- 利用集合自带的构造方法: ArrayList
b= new ArrayList (a); - 利用克隆的方法:ArrayList
b =(ArrayList ) a.clone();
通过一个例子看看错误赋值和正确赋值的效果
package _4_9_test;
import java.util.ArrayList;
public class NightyThreeTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList a = new ArrayList<>();
a.add(1);
a.add(2);
a.add(3);
// 输出对象a中所有的数据
System.out.print("第一次输出对象a中的数据:");
for(int i=0;i<a.size();i++) {
System.out.print(a.get(i)+" ");
}
System.out.println();
// 将a直接赋值给b
ArrayList b = a;
// 使用对象b移除一个数据
System.out.println("--------使用对象b移除一个数据--------");
b.remove(0);
// 第二次输出对象a中所有的数据
System.out.print("第二次输出对象a中的数据:");
for(int i=0;i<a.size();i++) {
System.out.print(a.get(i)+" ");
}
System.out.println();
// 将a克隆给c
ArrayList c = (ArrayList) a.clone();//方法一
// 方法二:ArrayList c = new ArrayList<>(a);
// 使用对象c移除一个数据
System.out.println("--------使用对象c移除一个数据--------");
c.remove(0);
// 第三次输出对象a中所有的数据
System.out.print("第三次输出对象a中的数据:");
for(int i=0;i<a.size();i++) {
System.out.print(a.get(i)+" ");
}
}
}
可以看到只有采用正确的赋值方法,被赋值的对象才是一个独立的对象,不会影响到原有对象中的数据