基本数据类型直接在栈中存储值,引用类型在栈中存储指向堆中对象的地址;前者赋值为值拷贝,后者为引用拷贝;“==”比较时前者比数值,后者比地址。

Java中基本数据类型和引用数据类型在内存中的存储方式有本质区别:基本类型直接存值,引用类型存的是指向对象的地址。
基本数据类型:值直接存在栈中
byte、short、int、long、float、double、char、boolean 这8种类型,变量声明时,JVM直接在栈内存中分配固定大小的空间(如int占4字节),并把具体数值存进去。这个值是独立的、可复制的,赋值时是“值拷贝”。
- 例如:int a = 10; int b = a; → b得到的是10的副本,修改b不影响a
- 生命周期与所在作用域一致,方法结束,栈帧弹出,变量自动销毁
- 没有null概念,未初始化会有默认值(如int为0,boolean为false)
引用数据类型:栈中存地址,堆中存对象
类、接口、数组、枚举、注解等都属于引用类型。声明变量时,JVM在栈中分配一个“引用变量”,它不存实际数据,只存一个内存地址;真正的对象实例是在堆内存中动态创建的。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- 例如:String s = new String("hello"); → 栈中s存的是堆里那个String对象的地址
- 赋值时是“引用拷贝”:s1 = s2 后,两个变量指向堆中同一个对象,改内容会影响彼此(除非对象不可变,如String)
- 对象本身由垃圾回收器(GC)管理,栈中引用消失不代表堆中对象立刻被删
一个典型对比示例
看这段代码:
int x = 5;
int y = x;
y = 10;
StringBuilder a = new StringBuilder("hi");
StringBuilder b = a;
b.append(" there");
执行后:x还是5,y变成10;而a.toString() 和 b.toString() 都是"hi there"。因为x/y是独立的值,a/b是指向同一块堆内存的两个引用。
容易忽略的关键点
- “==”比较含义不同:基本类型比值是否相等;引用类型默认比地址是否相同(即是否指向同一对象)
- 包装类(Integer、Double等)是引用类型,但Java对-128~127间的Integer做了缓存,所以Integer i1=100; Integer i2=100; i1==i2 为true,但i1=200时可能为false
- 数组是引用类型,即使元素是基本类型(如int[]),数组变量本身也在栈中存地址,整个数组对象在堆中
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










