Java字符串:私有静态与本地变量性能

时间:2016-03-23 18:05:46

标签: java string performance string-pool

使用java中的private final static String与使用每次访问方法时必须“初始化”的本地字符串变量相比,是否有任何性能优势?

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

鉴于java具有String interning,并且实际上使用引号(String s = "some string")声明的每个字符串的单个副本保留了一个池,是否会因为必须声明/初始化/分配而导致性能损失每次访问方法时使用静态字符串变量?

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

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
  }
}

2 个答案:

答案 0 :(得分:8)

使用命名常量可能更好的可维护性。但是,编译时已知的常量可以内联,在这种情况下不太可能存在任何差异。

注意:如果您使用的是字符串文字,则只需创建一次,无论JVM在何处使用。

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

  

每次访问方法时都必须声明变量才会导致性能下降

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

答案 1 :(得分:3)

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