Java 中的数据类型误导点!!!

发布于:2025-05-11 ⋅ 阅读:(19) ⋅ 点赞:(0)

在 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。


网站公告

今日签到

点亮在社区的每一天
去签到