String.substring在Java中究竟做了什么?

Jac*_*ale 9 java string

我一直以为如果我这样做String s = "Hello World".substring(0, 5),那么我就得到一个新的字符串s = "Hello".Java API文档中也记录了这一点:"返回一个新字符串,它是该字符串的子字符串".

但当我看到以下两个链接时,我开始怀疑.

Java中表达"new String(...)"的目的是什么?

毕竟被认为无用的字符串构造函数证明是有用的

基本上,他们说如果我使用String s = "Hello World".subString(0, 5),我仍然得到一个String,其中包含"Hello World"的char数组.

为什么?Java是否真的以这种方式实现了子串?为什么这样?为什么不返回一个全新的更短的子串?

Sea*_*wen 5

转过来,为什么char[]在不需要时分配新的?这是一个有效的实现,因为它String是不可变的。它可以节省分配和内存。

  • 换句话说,返回全新的较短子字符串需要线性的额外内存和时间。将视图返回到相同的“ char []”仅需要恒定的内存和恒定的时间。(此外,您可以从子字符串视图中获取真实副本,但不能以其他方式使用-因此,此选项通常更灵活。) (2认同)

Bri*_*new 4

这应该是一种效率措施。即,当您获取子字符串时,您不会创建新的字符数组,而只是在现有的字符数组上创建一个窗口。

这值得吗?或许。缺点是它会引起一些混乱(例如,参见这个SO问题),而且每个String对象都需要将偏移信息携带到数组中,即使它没有被使用。

编辑:从 Java 7 开始,这种行为已发生变化。有关更多信息,请参阅链接的答案

  • 在 Java 7 中,情况不再如此:它复制特定字符串的 char 数组的切片。 (4认同)