java - Java 是否在运行时优化了字符串的创建?

标签 java string optimization runtime

假设我在运行时创建了以下两个字符串(例如来自用户输入):

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/

相关文章:

java - 如何将 .jar 文件添加到 .java 文件的编译中

c - C 中带有字符串的函数的头文件

c - 在 CS50 库中使用字符串

python - 将字符串转换为列表并将元素转换为整数

mysql - 性能优化 : Null allowed/not allowed vs Performance, 如果不是关键

java - Gmail 不会发送从应用程序推送的电子邮件附件

java - 如何提取字母数字字符串中的前四位连续数字?

java - 使用第三方jar在命令行中执行jar文件

python - Scipy.optimize 最小化花费的时间太长

r - R中的快速并行二分距离计算