Java 字符串:私有静态与局部变量性能

2022-09-01 23:48:29

使用 java 中的 a 与使用每次访问方法时都必须“初始化”的局部字符串变量相比,是否有任何性能优势?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
  }
}

答案 1

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

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

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

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

由于 Java 使用静态编译器,因此在加载类/方法时,变量只声明一次(或编译的每个阶段声明一次),而不管调用方法的次数如何。但是,每次都可能初始化该变量。


答案 2

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