首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弦乐访谈

弦乐访谈
EN

Stack Overflow用户
提问于 2011-12-02 14:37:02
回答 4查看 553关注 0票数 2

如果我有下面这样的代码,它可行吗?

代码语言:javascript
复制
String b = "abc";
String c = "def";
for (int i=0;i<100000000;i++){
    String a = b + c; // i got a different object , ahhh!
}

它对系统有何影响?我们能改进它吗?如何改进?

这不符合字符串池的概念吗?因为我创建字符串时没有新的操作符,所以我用一个对象结束,结果它创建了100000000个对象(我错了),但是我并没有取消(使用==操作符检查)。

例如

代码语言:javascript
复制
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,为什么会改变不同对象或同一个对象的结果。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-12-02 14:46:28

如果bc没有标记为final,编译器可能会假设在代码的某个时候,可能会为这些变量分配不同的字符串。因此,在编写a=b+c时,编译器不能假设bc的内容(它们甚至可以来自用户),因此它必须将它们连接起来并生成一个全新的字符串。

当它们是final时,编译器可以肯定地知道b总是"abc"c总是"def",甚至可能推断出(b+c)=="abcdef",因此将其放入池中,或者在循环之前简单地进行连接。

票数 6
EN

Stack Overflow用户

发布于 2011-12-02 14:49:36

bc成为最终结果时,b + c就是常量表达式。这意味着+ operaion是在编译名称下完成的。然后这条线就等于

代码语言:javascript
复制
String a = "abcdef";

bc是非终值时,它们的值不再被视为常量表达式,字符串连接在运行时完成,并且在每次迭代时创建新字符串。

票数 1
EN

Stack Overflow用户

发布于 2011-12-02 14:40:42

它对系统有何影响?我们能改进它吗?如何改进?

字符串是不可变的,也就是说,每次连接时它都会创建(或从池中重用)一个新的String对象。如果您正在进行循环连接,则使用StringBuilder对象。

代码语言:javascript
复制
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();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8357920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档