在 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 会影响 list2
System.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
}
// 深拷贝方法
@Override
public 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。