java引用类型变量存储的是堆中对象的内存地址,而非实际数据;null表示未指向任何对象;==比较地址,equals比较内容;传参传递引用副本,可修改对象状态但不能改变原引用指向。

Java中所谓的“引用数据类型”,不是某种具体类型,而是一类变量的统称:它们存储的不是实际数据,而是指向堆内存中对象的地址。
引用类型变量到底存的是什么
声明一个 String s = "hello",变量 s 本身不存字符内容,只存一个内存地址(比如 0x7f8a12b4);真正的字符串对象在堆里。这个地址就是“引用”。null 就是这个地址的特殊值——表示“没指向任何对象”。
- 所有类(
String、ArrayList、自定义Person等)的实例变量都是引用类型 - 接口、数组、枚举、注解类型变量也属于引用类型
- 基本类型(
int、boolean等)变量则直接存值,和引用无关
为什么 == 比较两个 String 常常返回 false
因为 == 比较的是引用值(即地址是否相同),不是内容。两个内容相同的字符串,只要不是来自字符串常量池或同一对象,地址就不同。
String a = new String("abc");
String b = new String("abc");
System.out.println(a == b); // false —— 两个不同对象,地址不同
System.out.println(a.equals(b)); // true —— 内容相等
- 用
.equals()比较内容(注意空指针风险,建议用Objects.equals(a, b)) -
String字面量(如"abc")会进常量池,重复字面量可能复用同一对象 -
Integer在 -128~127 范围内也有类似缓存行为,但超出范围后==同样不可靠
引用类型传参时修改对象内容会影响原对象吗
会,但仅限于通过引用调用方法修改对象内部状态(比如改 list.add()、user.setName())。但若在方法内重新赋值引用(如 s = new String("xyz")),不会影响调用方的变量指向。
立即学习“Java免费学习笔记(深入)”;
- Java 是值传递:传的是引用的副本,不是引用本身
- 副本和原引用初始指向同一对象 → 修改对象状态可见
- 但让副本指向新对象 → 原引用仍指向旧对象
真正容易被忽略的是:引用类型的“可变性”取决于它所指向的对象是否可变。比如 String 不可变,每次“修改”其实生成新对象;而 ArrayList 可变,add() 直接改变原对象内容。搞不清这点,就会误判哪些操作会影响外部状态。










