如果我多次使用它,将String声明为final是否明智?

时间:2015-10-31 12:13:16

标签: java string performance

我有一个方法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的一个实例,并且每次只使用该实例。

4 个答案:

答案 0 :(得分:6)

你所做的是对的,但出于错误的原因。

执行anotherMethod("myString")时,实际上不会创建String的新实例:它可能会重用String常量池中的String(请参阅this question)。

但是,将常见字符串值分解为常量(即private static final)是一种很好的做法:如果需要更改该常量,则只需在源代码的一个位置更改它(例如,如果明天,"myString"需要成为"myString2",则只需要进行一次修改

答案 1 :(得分:4)

同一文本的字符串文字是相同的,因为你不会有过多的对象创建。

但最好将该字符串文字放在一个静态的最终变量(常量)中,并带有描述该字符串用途的描述性名称。通常建议将字符串文字提取为具有良好名称的常量。

当相同的字符串文字出现在代码中的多个位置(“魔术字符串”)时尤其如此,在这种情况下,强烈建议将其提取为常量。

答案 2 :(得分:1)

不,你不需要这样做,有一个"常数池"在JVM中,对于每个内联字符串(例如:" myString"),它将被隐式地视为一个常量变量,并且每个相同的内联字符串只会被置于常量池中一次。

例如,

    String i="test",j="test";

只有一个常量变量实例" test"在恒定的池中。

也指 http://www.thejavageek.com/2013/06/19/the-string-constant-pool/

答案 3 :(得分:0)

在担心性能之前优化澄清。字符串文字只创建一次(除非文本被卸载)性能不仅通常不那么重要,而且在这种情况下是不敬的。

您应该定义一个常量,而不是重复相同的String以使其清楚,这些字符串不会相同,但必须相同。如果有人试图稍后维护代码必须修改一个字符串,这是否意味着它们都应该被更改。

BTW当您为了清晰度进行优化时,您通常也会优化性能。 JIT寻找常见的模式,如果你试图聪明的优化器,你更容易混淆它,导致代码不太理想。