我知道在创建String
的编译时,该String将是该特定签名的任何对象使用的字符串。
String s = "foo";
< - 任何其他相同的字符串只是对此对象的引用。
这是否适用于在运行时方法期间创建的字符串?我有一些代码,其中一个对象包含一段字符串数据。原始代码类似于
for(datum :data){
String a = datum.getD(); //getD is not doing anything but returning a field
StringBuffer toAppend = new StringBuffer(a).append(stuff).toString();
someData = someObject.getMethod(a);
//do stuff
}
由于String
已在data
中创建,因此最好只调用datum.getD()
而不是在循环的每次迭代中创建字符串。
除非我遗失了什么?
答案 0 :(得分:7)
String
实例是编译时常量表达式的结果时,它们将被共享。因此,在下面的示例中,a
和c
将指向同一个实例,但b
将是一个不同的实例,即使它们都代表相同的值:
String a = "hello";
String b = hell() + o();
String c = "hell" + "o";
public String hell() {
return "hell";
}
public String o() {
return "o";
}
可以明确地实习String:
String b = (hell() + o()).intern();
在这种情况下,他们都指向同一个对象。
答案 1 :(得分:3)
该行
String a = datum.getD();
表示将评估datum.getD()
的结果分配给参考a
。它不会创建新的String。
答案 2 :(得分:-2)
字符串是不可变的是正确的,因此对同一字符串值的所有引用都使用相同的对象。
至于静态,我不认为字符串在你描述的方式上是静态的。 Class
类就是这样,但我认为它是唯一能够做到这一点的对象。
我认为最好只调用datum.getD()
,因为没有任何东西可以将它拉到自己的刺痛对象中。
如果你在循环中多次使用datum.getD()
,那么将值拉入String对象可能是有意义的,因为创建一次字符串对象的成本可能低于调用的成本getD()
函数多次。