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



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

使用命名常量可能更有利于维护。然而,编译时已知的常量可以作为内联使用,在这种情况下不太可能有任何区别。

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

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

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

由于Java使用静态编译器,在加载类/方法时,变量只被声明一次(或在编译的每个阶段声明一次),而不管调用了多少次方法。但是,每次都可能对变量进行初始化。

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

我想创建常量来自旧时代,因为创建静态有助于在jvm中只维护一个字符串作为类的一部分,而不是每次创建和销毁对象时创建和垃圾收集的对象。但由于spring默认作用域是singleton而不是prototype,我想这没有什么区别。所以,是的,这取决于该类将如何使用,这就是答案。

最新更新