ArrayList对象赋值的问题

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)+" ");
		}
		

	}

}

可以看到只有采用正确的赋值方法,被赋值的对象才是一个独立的对象,不会影响到原有对象中的数据

猜你喜欢

转载自www.cnblogs.com/lyd447113735/p/12734741.html