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

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

  • 相关阅读:
    SAS学习笔记38 SAS Comments注释语句
    SAS学习笔记37 宏程序中parmbuff选项
    SAS学习笔记36 二分类logistic回归
    SAS学习笔记34 指针控制
    SAS学习笔记33 格式修饰符
    SAS学习笔记31 SAS随机分组方法及实现
    angular的websocket使用
    angularjs 使用ui.router 去掉url中的#号
    angular全局确认框confirm
    angular 请求$http载入画面Loading
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/12734741.html
Copyright © 2020-2023  润新知