22

private final static String在 java 中使用 a 与使用每次访问方法时都必须“初始化”的本地字符串变量有什么性能优势?

我确实认为,private static final对于在类的不同部分重用的常量来说,使用字符串是一种很好的做法,但是如果一个字符串仅用于一种方法,在一个位置,出于一个非常具体的原因,不考虑其他方法关于,我实际上更喜欢用更少的私有成员来保持类的内部接口干净,并且只使用一个局部变量。

鉴于 java 具有 String interning,并且实际上保留了一个池,其中包含使用引号 ( String s = "some string") 声明的每个字符串的单个副本,那么每次访问方法时都必须声明/初始化/分配变量实际上会影响性能吗vs 使用静态字符串?

SS为了更清楚一点,使用or之间会有什么区别LS吗?

class c {
private final static String SS = "myString";

  private void method(){
     //do something with SS
  }

  private void OtherMethod(){
     String LS = "myOtherString"
     //do same thing with LS
  }
}
4

2 回答 2

9

使用命名常量可能更好地提高可维护性。然而,在编译时已知的常量可以被内联,在这种情况下不太可能有任何差异。

注意:如果您使用的是字符串文字,则无论在 JVM 中的哪个位置使用它,都只会创建一次。

在这种情况下,唯一的区别是在堆栈上使用局部变量,它不太可能比已内联的常量更昂贵。

每次访问方法时都必须声明变量实际上会影响性能吗

由于 Java 使用静态编译器,因此在加载类/方法时,变量只声明一次(或每个编译阶段声明一次),无论方法被调用多少次。然而,变量可能每次都被初始化。

于 2016-03-23T18:20:46.657 回答
4

事实是,最终没有区别。局部变量中的常量字符串仍将在常量池中结束并进行优化。所以一般来说,局部变量更快,因为它们更容易访问,但在常量字符串的情况下,它并没有什么区别。因此,在您的情况下选择更具可读性和直观性的任何内容。

于 2016-03-23T18:10:47.273 回答