zoukankan      html  css  js  c++  java
  • 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)+" ");
    		}
    		
    
    	}
    
    }
    
    

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

  • 相关阅读:
    前端 HTML
    python3内置函数
    内置函数的随机验证码
    线程、进程以及协程,上下文管理器
    线程池的定义方法
    python_控制台输出带颜色的文字方法
    while 循环 continue break 用法例子
    JVM 基础知识
    ios 设置状态栏文本颜色为白色
    ios 常用第三方库要加的framework,ARC的设置
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/12734741.html
Copyright © 2011-2022 走看看