如何获取旧字符串?我有一个字符串变量和另一个赋值给同一变量的字符串。

4
假设我有一个字符串
msg = "hello"

现在我从字符串msg中获取子串,类似于msg.substring(1,msg.length())

并将该子串存储到msg中。

所以msg引用了新的字符串。如果旧字符串仍然存在于Java缓冲区中,那么如何访问它呢?


1
哇,你为什么要这样做呢?只需使用另一个变量来分配msg不就行了吗? - kutschkem
你是对的,但我只是想知道那个旧字符串发生了什么。 - uveng
2个回答

8
请注意,在Java 7(发布版本6,如果我没记错)中,String.substring()实现和String的实际实现已经发生了改变。因此,根据你使用的Java版本:
  1. 如果是Java 7u6之后的版本,你无法这样做。 String.substring()将会给你一个全新的字符串。
  2. 如果是较旧版本的Java,则可能可以访问您的新String的私有底层字符数组,实际上这是您旧字符串的完整字符数组。
其中第二项尤其棘手,我怀疑它超出了你真正想要达到的目标。
有关substring()实现以及如何更改的更多细节,请参见这里

3
当不再有任何引用指向一个内存块(即Java对象,例如您的字符串msg)时,该内存可以被回收(收集)。这意味着旧的、未使用的对象会被垃圾收集器自动删除,因此没有任何简单的方法来实现它。更多关于垃圾收集的信息请点击这里更新。正如Brian Agnew在评论中提到的那样,这个答案适用于Java版本7u6及以上。

这并不是完全正确的。substring可能会返回一个字符串对象,该对象与原始字符串具有偏移量的关系。 - Absurd-Mind
1
根据使用的Java版本而定。有关更多详细信息,请参阅我的回答。 - Brian Agnew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接