我有一个方法repeatedMethod
,如下所示:
public static void repeatedMethod() {
// something else
anotherMethod("myString");
// something else
}
public static void anotherMethod(String str) {
//something that doesn't change the value of str
}
我多次拨打repeatedMethod
。
我想问一下,将myString
声称为static final
在该方法之外是否明智是这样的:
public static final String s = "myString";
public void repeatedMethod() {
anotherMethod(s);
}
我认为当我anotherMethod("myString")
时,会创建一个String
的新实例。由于我多次这样做,因此创建了许多String
个实例。
因此,最好只在String
之外创建repeatedMethod
的一个实例,并且每次只使用该实例。
答案 0 :(得分:6)
你所做的是对的,但出于错误的原因。
执行anotherMethod("myString")
时,实际上不会创建String
的新实例:它可能会重用String常量池中的String(请参阅this question)。
但是,将常见字符串值分解为常量(即private static final
)是一种很好的做法:如果需要更改该常量,则只需在源代码的一个位置更改它(例如,如果明天,"myString"
需要成为"myString2"
,则只需要进行一次修改
答案 1 :(得分:4)
同一文本的字符串文字是相同的,因为你不会有过多的对象创建。
但最好将该字符串文字放在一个静态的最终变量(常量)中,并带有描述该字符串用途的描述性名称。通常建议将字符串文字提取为具有良好名称的常量。
当相同的字符串文字出现在代码中的多个位置(“魔术字符串”)时尤其如此,在这种情况下,强烈建议将其提取为常量。
答案 2 :(得分:1)
例如,
String i="test",j="test";
只有一个常量变量实例" test"在恒定的池中。
也指 http://www.thejavageek.com/2013/06/19/the-string-constant-pool/
答案 3 :(得分:0)
在担心性能之前优化澄清。字符串文字只创建一次(除非文本被卸载)性能不仅通常不那么重要,而且在这种情况下是不敬的。
您应该定义一个常量,而不是重复相同的String以使其清楚,这些字符串不会相同,但必须相同。如果有人试图稍后维护代码必须修改一个字符串,这是否意味着它们都应该被更改。
BTW当您为了清晰度进行优化时,您通常也会优化性能。 JIT寻找常见的模式,如果你试图聪明的优化器,你更容易混淆它,导致代码不太理想。