在 Java 中,數據類型分為兩大類:基本類型(Primitive Types) 和 引用類型(Reference Types)。它們的存儲方式和行為完全不同。
1. 基本類型
Java 有 8 種基本數據類型,它們直接存儲值(而不是引用),存放在 棧內存(Stack) 中:
? 直接存儲值,而不是引用。
? 賦值時是值拷貝
,修改一個變量不會影響另一個!!!!!!
。
int a = 10;
int b = a; // b 是 a 的副本
b = 20; // 修改 b 不會影響 a
System.out.println(a); // 10
System.out.println(b); // 20
2.引用類型
除了基本類型,其他所有類型都是引用類型,包括:
1.類(String、ArrayList、自定義類等)
2.接口
3.數組(int[]、String[] 等)
4.枚舉(enum)
? 變量存儲的是對象的引用(內存地址),而不是對象本身。
? 對象本身存儲在堆內存(Heap),變量只是指向它。
? 賦值(=
)時是引用拷貝,修改一個變量的值會影響另一個(因為它們指向同一個對象)
。
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);List<Integer> list2 = list1; // list2 和 list1 指向堆中同一個對象
list1.clear(); // 修改 list1 會影響 list2System.out.println(list1); // []
System.out.println(list2); // []
3.引用類型的應用
因為Java的List是引用類型,所以可以直接取出子List直接刪除對應值,母mBeanList 中的值也是同步對應值也會刪除!
private List<List<Bean>> mBeanList = new ArrayList<>();;
List<Bean> beans = mBeanList.get(Position);
beans.remove(tean);這時候mBeanList中也沒有tean!!!!!!
4.淺拷貝和深拷貝
淺拷貝(Shallow Copy)只是=進行賦值!!!!!!
只復制對象本身
新對象和原對象共享內部引用(如 List、Array、自定義類等)。
class Person {String name;List<String> hobbies;public Person(String name, List<String> hobbies) {this.name = name;this.hobbies = hobbies;}
}// 原始對象
List<String> hobbies = new ArrayList<>(Arrays.asList("Reading", "Gaming"));
Person person1 = new Person("Alice", hobbies);// 淺拷貝(直接賦值)
Person person2 = person1;
person2.name = "Bob"; // 修改基本類型(不影響 person1)
person2.hobbies.add("Music"); // 修改引用類型(會影響 person1)System.out.println(person1.hobbies); // [Reading, Gaming, Music](被修改)
System.out.println(person2.hobbies); // [Reading, Gaming, Music]
關鍵點:
person2 = person1 是淺拷貝,person2 和 person1 共享 hobbies。 修改 person2.hobbies 會影響 person1.hobbies。
深拷貝(Deep Copy)就是創建了個新對象!!!!!!!
完全復制對象及其內部的所有引用類型數據,生成一個 完全獨立的新對象!!!
新對象和原對象不共享任何引用。
class Person implements Cloneable {String name;List<String> hobbies;public Person(String name, List<String> hobbies) {this.name = name;this.hobbies = new ArrayList<>(hobbies); // 深拷貝 hobbies}// 深拷貝方法@Overridepublic Person clone() {return new Person(this.name, new ArrayList<>(this.hobbies));}
}// 原始對象
List<String> hobbies = new ArrayList<>(Arrays.asList("Reading", "Gaming"));
Person person1 = new Person("Alice", hobbies);// 深拷貝
Person person2 = person1.clone();
person2.name = "Bob"; // 修改基本類型(不影響 person1)
person2.hobbies.add("Music"); // 修改引用類型(不影響 person1)System.out.println(person1.hobbies); // [Reading, Gaming](未被修改)
System.out.println(person2.hobbies); // [Reading, Gaming, Music]
關鍵點:
clone() 方法創建了一個新對象,并 深拷貝了 hobbies。修改 person2.hobbies 不會影響 person1.hobbies。