假设我在运行时创建了以下两个字符串(例如来自用户输入):
public void someMethod(String input) {
if ( input == null ) return;
String a = input + input;
String b = input;
...
}
Java(及其编译器)是否足够聪明,可以在运行时检测到 b
包含在 a
中,因此没有必要为 b 分配内存
? b
可以只指向 a
一半的长度吗?
换句话说,Java 是否实现了 String.intern()
的动态版本?
编辑
考虑到目前所做的回答,我的例子应该是:
public void someMethod(String input) {
if ( input == null ) return;
String a = input + input + input;
String b = input + input;
...
}
最佳答案
您实际上并没有在示例中创建两个字符串:b
只是对input
的引用。因此,要执行您的要求,Java 必须以某种方式返回并在创建新字符串时更改旧字符串(例如通过说 input + input
)。
为了回答你的更广泛的问题,据我所知,两个字符串共享内存的唯一方法(除了,正如你提到的,是 intern()
'd)是创建一个或两个字符串使用 substring()
。所以如果你真的想节省内存,你可以这样做:
String a = input + input;
String b = a.substring(input.length());
(需要明确的是,只有当 b
的值存储在某处但 input
被丢弃并最终被垃圾收集时,这才会节省内存。)
编辑
新的和改进的问题的新的和改进的例子:
String a = input + input + input;
String b = a.substring(2 * input.length());
(请注意,这将总是在问题中的第二个示例上节省内存,因为我们完全避免了分配。因此前面的警告不适用。)
关于java - Java 是否在运行时优化了字符串的创建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6240186/