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

	}

}

可以看到只有采用正確的賦值方法,被賦值的對象才是一個獨立的對象,不會影響到原有對象中的數據


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM