2、基本类型和引用类型的执行存储流程是怎样的?

目录

[一、先明确:JVM 对变量的存储规则(固定不变)](#一、先明确:JVM 对变量的存储规则(固定不变))

[二、基本类型:int a = 10; int b = 10;](#二、基本类型:int a = 10; int b = 10;)

[1. 存储流程](#1. 存储流程)

[2. 内存样子(栈中)](#2. 内存样子(栈中))

[3. a == b 底层执行](#3. a == b 底层执行)

[三、引用类型:Integer a = new Integer(10); Integer b = new Integer(10);](#三、引用类型:Integer a = new Integer(10); Integer b = new Integer(10);)

[1. 存储流程](#1. 存储流程)

[2. 内存样子](#2. 内存样子)

[3. a == b 底层执行](#3. a == b 底层执行)

[四、一句话总结 == 的底层逻辑](#四、一句话总结 == 的底层逻辑)

五、最容易混淆的点,一次性说透

[1. 为什么 new 一定是不同地址?](#1. 为什么 new 一定是不同地址?)

[2. 为什么基本类型没有地址概念?](#2. 为什么基本类型没有地址概念?)

[3. 为什么引用类型变量本身在栈?](#3. 为什么引用类型变量本身在栈?)

六、最精简记忆版


纯流程、纯内存结构讲一遍。

一、先明确:JVM 对变量的存储规则(固定不变)

  1. 方法内局部变量 :全部放在 虚拟机栈(VM Stack)
  2. new 出来的对象实例 :全部放在 堆(Heap)
  3. 引用变量本身 :存在栈里,存的是堆地址
  4. 基本类型变量 :存在栈里,存的是真实值

二、基本类型: int a = 10; int b = 10;

1. 存储流程

  1. 线程执行到 int a = 10;
  • 在当前栈帧开辟一块小空间
  • 直接把 数值 10 的二进制 存进去
  1. 执行 int b = 10;
  • 再在栈帧开另一块空间
  • 直接把 数值 10 的二进制 存进去

2. 内存样子(栈中)

a: 10
b: 10
没有堆参与, 没有对象,没有地址

3. a == b 底层执行

JVM 执行 数值比较指令(如 if_icmpne 等)
直接读取栈上两块内存的二进制 → 完全一样 → true


三、引用类型: Integer a = new Integer(10); Integer b = new Integer(10);

1. 存储流程

  1. 执行 new Integer(10)
  • 上创建一个 Integer 对象
  • 该对象内部存着值 10
  1. 这个堆对象的内存地址,存入栈上的变量 a

  2. 再次 new Integer(10)

  • 堆上另一个位置再创建一个新对象
  1. 新地址存入栈上变量 b

2. 内存样子

栈:
a = 0x11223344(堆地址1)
b = 0x55667788(堆地址2)
堆:
0x11223344: Integer{ value=10 }
0x55667788: Integer{ value=10 }

3. a == b 底层执行

JVM 不看对象内容
只比较 栈里存的两个地址值
0x11223344 != 0x55667788 → 结果 false


四、一句话总结 == 的底层逻辑

  • 基本类型 == :栈 ↔ 栈,直接比二进制值
  • 引用类型 == :栈 ↔ 栈,比的是两个引用存的堆地址 跟对象内部的值完全无关

五、最容易混淆的点,一次性说透

1. 为什么 new 一定是不同地址?

因为 new 指令的语义就是: 在堆上分配新内存
每次 new 都是一块 全新、独立的内存
所以地址一定不同 → == 一定 false

2. 为什么基本类型没有地址概念?

因为基本类型 不是对象
JVM 设计就是: 值直接存在栈上,不进堆
所以 == 只能是值比较

3. 为什么引用类型变量本身在栈?

因为引用本质是 指针/地址
很小(4或8字节),存在栈里访问极快
对象本体大,放堆里统一管理


六、最精简记忆版

  • 基本类型变量 :栈里存
  • 引用类型变量 :栈里存堆地址
  • == :永远只比较**栈里存的东西。**基本类型 → 比值。 引用类型 → 比地址
相关推荐
程序员陆业聪2 小时前
启动瓶颈定位实战:Perfetto + Macrobenchmark 一套组合拳
android
洞见前行2 小时前
Android第三代加固技术原理详解(附源码)
android
Kapaseker3 小时前
Android 开发快 3 倍!Google 说的
android
黄林晴3 小时前
Android 17 Beta4发布:四大行为变更,不改上线就崩
android
恋猫de小郭3 小时前
Flutter 3.41.7 ,小版本但 iOS 大修复,看完只想说:这是人能写出来的 bug ?
android·前端·flutter
摇滚侠3 小时前
Java Map 类型的数据可以存储到 Redis Hash 类型中
java·redis·哈希算法
麦芽糖02194 小时前
python进阶六 正则表达式
android·python·正则表达式
三少爷的鞋4 小时前
🚀天下苦阻塞久矣之DeliQueue:Android 17 无锁 MessageQueue 的架构重构
android
北漂Zachary13 小时前
四大编程语言终极对比
android·java·php·laravel