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

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。

http://www.xdnf.cn/news/5396.html

相关文章:

  • windows 环境下 python环境安装与配置
  • Redis-x64-3.0.500
  • React文档-State数据扁平化
  • Vue3响应式原理源码解析(通俗易懂版)
  • Qt中在子线程中刷新UI的方法
  • llama.cpp无法使用gpu的问题
  • 【TypeScript】索引签名类型(Index Signatures)
  • 字符串---StringBuilder的使用
  • Kubernetes生产实战(一):多容器Pod协同实践
  • 超详细Kokoro-82M本地部署教程
  • JavaScript基础-switch分支流程控制
  • 3498. 字符串的反转度
  • MATLAB安装常见问题及解决方案详解(含代码示例)
  • 抖音app 抓包分析
  • 日语学习-日语知识点小记-构建基础-JLPT-N4阶段(18):条件形 文法
  • AI编程: 使用Trae1小时做成的音视频工具,提取音频并识别文本
  • 【python】json解析:invalid literal for int() with base 10: ‘\“\“‘“
  • 模型 启动效应
  • python如何提取Chrome中的保存的网站登录用户名密码?
  • 【日撸 Java 三百行】综合任务 1
  • Spark流水线在线演示
  • 小程序初始化加载时间优化 步骤思考与总结
  • (二)Linux下基本指令 2
  • 碰一碰发视频源码搭建的定制化开发指南,支持OEM
  • Vue v-model 深度解析:实现原理与高级用法
  • 【c++】多态详解
  • 【MySQL】数据表插入数据
  • 基于python的少儿兴趣班推荐系统的设计与实现
  • 微服务6大拆分原则
  • C++修炼:stack和queue