Java 字符串:私有静态 vs 局部变量性能
Java Strings: private static vs local variable performance
在 java 中使用 private final static String
与使用每次访问该方法时必须获取 "initialized" 的本地字符串变量相比,是否有任何性能优势?
我确实认为使用 private static final
字符串对于在 class 的不同部分重复使用的常量是一种很好的做法,但是如果一个字符串仅在一个方法中使用,则一个位置,出于一个没有其他方法关心的非常具体的原因,我实际上更喜欢保持 class' 内部接口干净,使用较少的私有成员,并且只使用局部变量。
鉴于 java 有字符串实习,并且实际上保留了一个池,其中包含每个使用引号 (String s = "some string"
) 声明的字符串的单个副本,实际上是否会有性能损失每次访问方法时声明/初始化/分配变量还是使用静态字符串?
为了更清楚一点,使用 SS
或 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
}
}
事实是,最终没有区别。局部变量中的常量字符串仍将在常量池中结束并进行优化。所以一般来说,局部变量更快,因为它们更容易访问,但在常量字符串的情况下,它没有什么区别。因此,请根据您的情况选择更具可读性和直观性的内容。
使用命名常量可能更利于维护。然而,在编译时已知的常量可以被内联,在这种情况下不太可能有任何差异。
注意:如果您使用的是字符串文字,则无论在 JVM 中的哪个位置使用它,都只会创建一次。
在这种情况下,唯一的区别是在堆栈上使用局部变量,它不太可能比内联的常量更昂贵。
would there actually be a performance hit from having to declare the variable each time the method is accessed
由于Java使用静态编译器,在加载class/method时,变量仅声明一次(或每个编译阶段一次) ,无论方法被调用了多少次。但是,变量可能每次都被初始化。
在 java 中使用 private final static String
与使用每次访问该方法时必须获取 "initialized" 的本地字符串变量相比,是否有任何性能优势?
我确实认为使用 private static final
字符串对于在 class 的不同部分重复使用的常量是一种很好的做法,但是如果一个字符串仅在一个方法中使用,则一个位置,出于一个没有其他方法关心的非常具体的原因,我实际上更喜欢保持 class' 内部接口干净,使用较少的私有成员,并且只使用局部变量。
鉴于 java 有字符串实习,并且实际上保留了一个池,其中包含每个使用引号 (String s = "some string"
) 声明的字符串的单个副本,实际上是否会有性能损失每次访问方法时声明/初始化/分配变量还是使用静态字符串?
为了更清楚一点,使用 SS
或 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
}
}
事实是,最终没有区别。局部变量中的常量字符串仍将在常量池中结束并进行优化。所以一般来说,局部变量更快,因为它们更容易访问,但在常量字符串的情况下,它没有什么区别。因此,请根据您的情况选择更具可读性和直观性的内容。
使用命名常量可能更利于维护。然而,在编译时已知的常量可以被内联,在这种情况下不太可能有任何差异。
注意:如果您使用的是字符串文字,则无论在 JVM 中的哪个位置使用它,都只会创建一次。
在这种情况下,唯一的区别是在堆栈上使用局部变量,它不太可能比内联的常量更昂贵。
would there actually be a performance hit from having to declare the variable each time the method is accessed
由于Java使用静态编译器,在加载class/method时,变量仅声明一次(或每个编译阶段一次) ,无论方法被调用了多少次。但是,变量可能每次都被初始化。