字符串也是静态的:在方法中创建字符串

时间:2011-01-24 15:39:25

标签: java string static

我知道在创建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()而不是在循环的每次迭代中创建字符串。

除非我遗失了什么?

3 个答案:

答案 0 :(得分:7)

String实例是编译时常量表达式的结果时,它们将被共享。因此,在下面的示例中,ac将指向同一个实例,但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()函数多次。