Java中基本类型存值于栈,引用类型变量存地址于栈而对象存于堆;赋值时基本类型复制值,引用类型复制地址;==比较基本类型是值比较,引用类型是比较地址;基本类型不可为null且有默认值,引用类型默认为null。

Java里“引用数据类型”和“基本数据类型”不是命名习惯不同,而是底层行为完全不一样。理解它们的区别,是写出可靠代码的第一步。
内存存放位置不同
基本类型(如int、char、boolean)的值直接存在栈里,变量名就等于那个数;引用类型(如String、ArrayList、自定义类对象)的变量本身也存栈里,但它存的只是一个地址——真正对象的数据在堆里。
- int a = 100; → 栈中直接放数字100
- String s = "ok"; → 栈中放一个地址(比如0x1a2b),堆中某处才存着字符' o ' ' k '
赋值时的行为不同
基本类型赋值是“复制一份值”,两个变量彻底独立;引用类型赋值是“复制一份地址”,多个变量可能指向同一块堆内存。
- int x = 5; int y = x; → 改y不影响x
- StringBuilder sb1 = new StringBuilder("a"); StringBuilder sb2 = sb1; → sb2.append("b")后,sb1.toString()也会变成"ab"
== 比较的含义不同
用 == 判断时:
立即学习“Java免费学习笔记(深入)”;
- 对基本类型:比的是数值是否相等(5 == 5 → true)
- 对引用类型:比的是两个变量是否指向堆中同一个对象(即地址是否相同)
- 想比内容是否一样,得用 .equals()(比如字符串比较必须用 s1.equals(s2))
null 和默认值不同
基本类型不能为 null,声明后就有默认值(int 是 0,boolean 是 false,char 是 '\u0000');引用类型默认值就是 null,可以显式赋 null,表示“当前没指向任何对象”。
- int i; → 编译通过,i 默认为 0
- String s; → 编译通过,s 默认为 null
- int j = null; → 编译报错


















