【发布时间】:2011-01-28 16:09:43
【问题描述】:
我遇到了一个包含多个使用字符串文字“foo”的类。
我想知道的是,使用这种方法而不是将 String 声明为 final 并用 final 变量替换所有文字有什么好处和影响(在对象创建、内存使用和速度方面) ?
例如(虽然显然不是真正的单词用法):
private static final String FINAL_STRING = "foo";
public void stringPrinter(){
for(int i=0;i<10;i++){
System.out.println(FINAL_STRING);
}
}
对比:
public void stringPrinter(){
for(int i=0;i<10;i++){
System.out.println("foo");
}
}
哪个更可取,为什么(假设字符串值保持不变)?
上面的(第二个)示例会导致创建 10 个 String 对象,还是 JVM 会意识到实际上只使用了一个文字,并创建一个引用。如果是这样,将 String 声明为 final 有什么好处(如第一个示例中所示)?
如果解释的代码确实用单个引用替换了字符串文字,那么如果相同的文字出现在多个地方,这是否仍然适用:
public void stringPrinter(){
for(int i=0;i<5;i++){
System.out.println("foo"); // first occurence
System.out.println("foo"); // second occurence
}
}
【问题讨论】:
-
我不会假设以前的开发人员选择重复文字而不是使用常量,这看起来像是懒惰。
-
奇怪的是,他们实际上声明了常量但没有使用它。因此,为什么我对可能的原因感兴趣。但同意,我认为这只是懒惰。