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

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

  • 相关阅读:
    查看eclipse的安装路径
    js中Number()、parseInt()和parseFloat()的区别进行详细介绍
    JSON 基础学习1
    Jquery Math ceil()、floor()、round()比较与用法
    easyui获取当前点击对象tabs的title和Index
    java中String,int,Integer,char、double类型转换
    DNA排序
    The Peanuts
    牛的选举——取最大k个数
    数据筛选——第k小的数
  • 原文地址:https://www.cnblogs.com/lyd447113735/p/12734741.html
Copyright © 2011-2022 走看看