字符串访谈

lin*_*kin 2 java string

如果我有如下代码是否可行?

String b = "abc";
String c = "def";
for (int i=0;i<100000000;i++){
    String a = b + c; // i got a different object , ahhh!
}
Run Code Online (Sandbox Code Playgroud)

它如何影响系统?我们可以改进它吗?

不遵循字符串池的概念,因为我创建的字符串没有新的运算符我以1个对象结束,结果它创建了100000000个对象(我错了)但我没有unserstand如何(用==运算符检查))

例如

final String b = "abc";
final String c = "def";
for (int i=0;i<100000000;i++){
    String a = b + c; //same object referred again and again
}
Run Code Online (Sandbox Code Playgroud)

给出相同的对象,我能够用==运算符检查

这不是示例遵循字符串池概念吗?为什么我的String变量的最终结果会改变不同对象或同一对象的结果.

Vla*_*lad 6

如果bc未标记final,编译器可能会假定在代码中的某个点,可能会为这些变量分配不同的字符串.因此,当你编写时a=b+c,编译器不能假设任何内容bc(它们甚至可能来自用户)因此它必须连接它们并产生一个全新的字符串.

当他们是final,编译器可以知道肯定b是始终"abc"c永远"def",甚至可能推断出(b+c)=="abcdef",因此把它放在一个池或干脆做串联循环之前.