如果我有下面这样的代码,它可行吗?
String b = "abc";
String c = "def";
for (int i=0;i<100000000;i++){
String a = b + c; // i got a different object , ahhh!
}它对系统有何影响?我们能改进它吗?如何改进?
这不符合字符串池的概念吗?因为我创建字符串时没有新的操作符,所以我用一个对象结束,结果它创建了100000000个对象(我错了),但是我并没有取消(使用==操作符检查)。
例如
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
}提供相同的对象,我可以使用==运算符进行检查。
这两个例子不都遵循字符串池的概念吗?如果我的字符串变量有final,为什么会改变不同对象或同一个对象的结果。
发布于 2011-12-02 14:46:28
如果b和c没有标记为final,编译器可能会假设在代码的某个时候,可能会为这些变量分配不同的字符串。因此,在编写a=b+c时,编译器不能假设b和c的内容(它们甚至可以来自用户),因此它必须将它们连接起来并生成一个全新的字符串。
当它们是final时,编译器可以肯定地知道b总是"abc",c总是"def",甚至可能推断出(b+c)=="abcdef",因此将其放入池中,或者在循环之前简单地进行连接。
发布于 2011-12-02 14:49:36
当b和c成为最终结果时,b + c就是常量表达式。这意味着+ operaion是在编译名称下完成的。然后这条线就等于
String a = "abcdef";当b和c是非终值时,它们的值不再被视为常量表达式,字符串连接在运行时完成,并且在每次迭代时创建新字符串。
发布于 2011-12-02 14:40:42
它对系统有何影响?我们能改进它吗?如何改进?
字符串是不可变的,也就是说,每次连接时它都会创建(或从池中重用)一个新的String对象。如果您正在进行循环连接,则使用StringBuilder对象。
String b = "abc";
String c = "def";
StringBuilder sb = new StringBuilder();
for (int i=0;i<100000000;i++){
sb.append(b);
sb.append(c);
}
result = sb.toString();https://stackoverflow.com/questions/8357920
复制相似问题