4、String 内存完整流程(面试必考,纯严谨结构)

目录

String 内存完整流程(面试必考,纯严谨结构)

情况1:String s1 = "abc"; String s2 = "abc";

执行 s1 == s2

情况2:String s1 = new String("abc"); String s2 = new String("abc");

执行 s1 == s2

情况3:String s = "ab" + "c";

核心结论(背这个就够)

延伸:equals 在 String 里的原理


摘要:
String内存机制主要分三种情况:
1)字面量赋值时,相同字符串共享常量池地址(s1==s2为true);
2)new创建时,每次都在堆生成新对象(s1==s2为false);
3)编译期优化会合并字面量拼接。
关键结论:
==比较栈地址,字面量入常量池共享,new必定新建对象。
字符串内容比较必须用equals(),其实现会依次检查对象同一性、类型和字符内容。
面试重点在于理解常量池机制和对象创建方式的差异。

String 内存完整流程(面试必考,纯严谨结构)

我们分三种最典型情况,直接画内存,不绕弯。

情况1:String s1 = "abc"; String s2 = "abc";

【虚拟机栈】
s1 → 地址 0x0011
s2 → 地址 0x0011
【堆】
0x0011: String 对象,内容 "abc"
【字符串常量池】
"abc" → 指向堆中 0x0011

执行 s1 == s2

  • 比较栈中存储的地址:0x0011 == 0x0011
  • 结果:true

情况2:String s1 = new String("abc"); String s2 = new String("abc");

【虚拟机栈】
s1 → 地址 0x0011
s2 → 地址 0x0022
【堆】
0x0011: String 对象,内容 "abc"
0x0022: String 对象,内容 "abc"
【字符串常量池】
"abc" 存在,但两个 new 都会新建堆对象

执行 s1 == s2

  • 地址 0x0011 != 0x0022
  • 结果:false

情况3:String s = "ab" + "c";

编译器会直接优化为:String s = "abc";
内存同 情况1,== 比较为 true。

核心结论(背这个就够)

  1. == 永远只比较栈里存的地址
  2. 字符串字面量(双引号直接写)会进入常量池,同内容共用同一个地址
  3. new String(...) 一定会在堆上创建新对象,地址一定不同
  4. 想比较字符串内容是否一样,必须用 equals(),不能用 ==

延伸:equals 在 String 里的原理

String 类内部已经重写了 equals:
  1. 先判断是否同一对象(==)
  2. 再判断类型是否是 String
  3. 逐字符比较数组内容
所以只要内容一样,equals 就返回 true。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

被开发耽误的大厨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值