java - 字符串池行为

标签 java string pool

我读了这个Questions about Java's String pool 并了解字符串池的基本概念,但仍然不了解其行为。

首先:如果你直接赋值并且 s1 和 s2 都引用池中的同一个对象,它就有效

String s1 = "a" + "bc";
String s2 = "ab" + "c";
System.out.println("s1 == s2? " + (s1 == s2));

但是如果我更改字符串 s1+="d",那么池中应该有一个字符串对象“abcd”?那么当我更改 s2+="d"时,它应该在池中找到字符串对象“abcd”并将该对象分配给 s2?但事实并非如此,它们也不是指同一个对象。这是为什么?

String s1 = "abc";
String s2 = "abc";
System.out.println("s1 == s2? " + (s1 == s2));

s1 += "d";                  
s2 += "d";
System.out.println("s1 == s2? " + (s1 == s2));

最佳答案

当您在字符串上调用 String.intern() 时,字符串保证被合并。

String s1 = "abcd".intern();
String s2 = "abc";
s2 += "d";
s2 = s2.intern();
s1 == s2 // returns true

当编译器看到一个常量时,它会足够聪明地优化和合并字符串文字,即:

String s1 = "abcd";
String s2 = "abcd";
s1 == s2 // returns true

Java Language Specification状态:

Each string literal is a reference (§4.3) to an instance (§4.3.1, §12.5) of class String (§4.3.3). String objects have a constant value. String literals-or, more generally, strings that are the values of constant expressions (§15.28)-are "interned" so as to share unique instances, using the method String.intern.

所以在 s2 += "d" 的情况下,编译器没有你那么聪明,只是汇集了 "d"

关于java - 字符串池行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14490043/

相关文章:

java - 该命令的含义是什么以及执行什么功能?

python - 在 python 2.7 中将参数和 manager.dict 传递给多处理池

java - 如何使用 StackMob 查询列表填充 listView

string - Matlab,根据第一个字符串对字符串单元进行排序

java - 如何在java中生成自定义长度的随机字母数字字符串?

ruby - 如何在 ruby​​ 中针对正则表达式测试整个字符串?

python - 多处理池中的全局变量

python - 如何在保存数据的同时在 for 循环中使用多处理池?

java - GC(垃圾收集器)如何标记一个对象进行垃圾收集?

java - Spring Boot 。如何创建带注解的 TaskExecutor?