如果我有如下代码是否可行?
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变量的最终结果会改变不同对象或同一对象的结果.
如果b
和c
未标记final
,编译器可能会假定在代码中的某个点,可能会为这些变量分配不同的字符串.因此,当你编写时a=b+c
,编译器不能假设任何内容b
和c
(它们甚至可能来自用户)因此它必须连接它们并产生一个全新的字符串.
当他们是final
,编译器可以知道肯定b
是始终"abc"
和c
永远"def"
,甚至可能推断出(b+c)=="abcdef"
,因此把它放在一个池或干脆做串联循环之前.