当前位置: 首页 > news >正文

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

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

相关文章:

  • [Spring AOP 7] 动态通知调用
  • OSCP - Proving Grounds - EvilBox-One
  • 《深入理解Linux网络》笔记
  • 基于语言模型的依存关系分句 和 主题变换检测(基于词频和句段得分)的 意思
  • JavaScript基础-全局作用域
  • 内存、磁盘、CPU区别,Hadoop/Spark与哪个联系密切
  • Hadoop 2.x设计理念解析
  • hot100-子串-JS
  • 17.Excel:实用的 VBA 自动化程序
  • 嵌入式Web服务器lighttpd交叉编译详解
  • 8.2.CICD自动化
  • 青藏高原七大河流源区径流深、蒸散发数据集(TPRED)
  • 远程调试---在电脑上devtools调试运行在手机上的应用
  • 在 Excel 中有效筛选重复元素
  • 365打卡第R8周: RNN实现阿尔茨海默病诊断
  • Jmeter中的Json提取器如何使用?
  • CH579 CH573 CH582 CH592 蓝牙主机(Central)实例应用讲解
  • 生产级AI/ML特征存储平台:Feast全面使用指南 — Use Cases Third party integrations FAQ
  • TransmittableThreadLocal:穿透线程边界的上下文传递艺术
  • PostgreSQL 的 pg_advisory_lock_shared 函数
  • 山西忻州市人大常委会副主任郭建平接受审查调查
  • 鄂州:锁死中小学教师编制总量,核减小学编制五百名增至初中
  • “拼好假”的年轻人,今年有哪些旅游新玩法?
  • 2025年4月份CPI环比由降转涨,核心CPI涨幅稳定
  • 北京2025年住房发展计划:供应商品住房用地240-300公顷,建设筹集保租房5万套
  • 匈牙利外长称匈方已驱逐两名乌克兰外交官