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)+" ");
}
}
}
可以看到只有采用正確的賦值方法,被賦值的對象才是一個獨立的對象,不會影響到原有對象中的數據