You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java substring返回对象创建位置及字符串对象差异技术咨询

嘿,我来给你把这个Java substring的问题讲明白!咱们分两部分来唠:

一、Java中substring方法的返回对象创建位置

这个得分Java版本来说,毕竟不同版本的实现逻辑不一样:

  • 在Java 6及更早版本:substring返回的String对象会复用原字符串的char数组(只是调整了offset和count属性),但这个新的String对象本身还是创建在堆内存里的,只是底层数组和原字符串共享。
  • 从Java 7开始:substring方法会直接创建一个新的char数组,复制原字符串中对应范围的内容,然后基于这个新数组创建新的String对象,这个对象同样是在堆内存里生成的,不再和原字符串共享底层数组了。
二、代码中str2和str3不是同一对象的原因及str2的创建位置

先把你的代码贴出来方便分析:

String str1 = "SachinTendulkar";
String str2 = str1.substring(6, str1.length());
String str3 = "Tendulkar";

咱们拆解一下:

  1. str3的创建逻辑:"Tendulkar"是字符串字面量,Java会把它存入字符串常量池(属于堆的一部分,但有专门的存储区域),如果常量池里已经有这个字符串,就直接复用引用。
  2. str2的创建逻辑:substring方法不管哪个Java版本,返回的都是全新的String对象——哪怕Java 6里共享了原数组,对象本身也是新的。这个新对象是直接创建在堆内存的普通区域,不会自动进入字符串常量池。
  3. 为什么不是同一对象:str3指向常量池里的"Tendulkar",str2指向堆里新创建的"Tendulkar"对象,两者的引用地址不同,所以不是同一个对象。如果想让它们指向同一对象,可以给str2调用intern()方法,这样str2会去常量池找有没有相同值的字符串,有的话就返回常量池里的引用。

内容的提问来源于stack exchange,提问作者user1718009

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:25:20