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";
咱们拆解一下:
- str3的创建逻辑:
"Tendulkar"是字符串字面量,Java会把它存入字符串常量池(属于堆的一部分,但有专门的存储区域),如果常量池里已经有这个字符串,就直接复用引用。 - str2的创建逻辑:
substring方法不管哪个Java版本,返回的都是全新的String对象——哪怕Java 6里共享了原数组,对象本身也是新的。这个新对象是直接创建在堆内存的普通区域,不会自动进入字符串常量池。 - 为什么不是同一对象:str3指向常量池里的"Tendulkar",str2指向堆里新创建的"Tendulkar"对象,两者的引用地址不同,所以不是同一个对象。如果想让它们指向同一对象,可以给str2调用
intern()方法,这样str2会去常量池找有没有相同值的字符串,有的话就返回常量池里的引用。
内容的提问来源于stack exchange,提问作者user1718009
相关产品推荐
相关产品推荐

