我可以在里面使用字符串文字进行循环吗?

时间:2012-05-03 05:24:45

标签: java string

我编码如下,

for(int i=0 ; i<n; i++){

String a = someObject.getFirstName(); //may not come same value..
doManipulationon(a);
}

在代码审核期间,人们要求我删除字符串文字a并直接使用someObject.getFirstName()进行操作。他们担心每次迭代都会在堆中创建字符串对象。

这是正确的方法吗?

我认为将getter分配给字符串变量可以使代码更具可读性。

4 个答案:

答案 0 :(得分:4)

首先,这里没有字符串文字。

字符串文字是用双引号括起来的字符串表达式,如“dog”。

您的评论者声明他们不喜欢用于保存您在下一行中操作的表达式的临时变量a

显然他们想要你说

doManipulationon(someObject.getFirstName());

删除临时变量会导致代码更紧凑。这通常是一个好主意,但并非总是如此。当“中间表达式”具有有趣的含义时,您可以使用临时变量,但在您的情况下,使用名称a没有帮助。你可以说

String firstname = someObejct.getFirstName();

在长表达式中,特别是将部分结果赋给给定有意义名称的变量确实会增加可读性。

哦,关于他们在你的例子中添加到堆中的新字符串对象的评论---不,没有。

答案 1 :(得分:2)

您是否可以将该循环写为:

for(int i=0; i < n; i++) {
    doManipulation( someObject.getFirstName() );
}

?如果是这样,绝对是的。但是,a 不是一个字符串文字 - 它只是一个变量名。使用它只会将对底层String(在堆上)的引用推送到堆栈上 - 而且无论你是否有变量a都会发生这种情况(也就是说,它会发生在我写的代码版本也是如此)。即使它没有,将引用推入堆栈也是如此便宜并不重要。但无论哪种方式,String都将在堆上,因为字符串是对象,而对象存在于堆上。

所以它只是风格,如果你发现将String赋给变量更具可读性,那么一定要做到。它还可以使调试更容易,因为您可以在doManipulation行放置断点并在进入该函数之前查看输入。 (即使没有作业,你也可以做到这一点,但它只是稍微不方便。)

答案 2 :(得分:1)

  

他们担心会在堆中创建字符串对象   迭代。

如果那是他们真正关心的问题,他们就不知道他们在谈论什么。当且仅当 someObject.getFirstName()创建新String时,才会在堆上创建新字符串。创建临时变量来保存引用不会创建新的String。

临时变量需要一个堆栈插槽。所有堆栈槽都在方法的开头分配,而不是在使用时分配。所以临时变量的空间成本是4-8个字节;时间成本是商店和负荷;并且堆成本为零。

答案 3 :(得分:0)

您可以使用以下命令检出字节码:

>javap -c -classpath /path/to/your/class/file classname

不同之处在于您的代码有两个字节码指令:

astore_2 // store a reference into local variable 2

aload_2  // load a reference onto the stack from local variable 2

所以,你的代码没问题,它的确切做法与其他人所说的不一样

  

“他们担心会在堆中创建字符串对象   迭代“。