使用java中的private final static String
与使用每次访问方法时必须“初始化”的本地字符串变量相比,是否有任何性能优势?
我认为使用private static final
字符串对于在类的不同部分中重用的常量来说是一个很好的做法,但是如果字符串仅在一个方法中使用,在一个位置中使用没有其他方法关注的具体原因,我实际上更喜欢用较少的私有成员保持类的内部接口清洁,并且只使用局部变量。
鉴于java具有String interning,并且实际上使用引号(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
}
}
答案 0 :(得分:8)
使用命名常量可能更好的可维护性。但是,编译时已知的常量可以内联,在这种情况下不太可能存在任何差异。
注意:如果您使用的是字符串文字,则只需创建一次,无论JVM在何处使用。
在这种情况下,唯一的区别是在堆栈上使用局部变量,它不可能比内联的常量更昂贵。
每次访问方法时都必须声明变量才会导致性能下降
由于Java使用静态编译器,因此在加载类/方法时,无论方法被调用多少次,变量只能声明一次(或者每个编译阶段一次)。但是,每次都可以初始化变量。
答案 1 :(得分:3)
事实是,最后,没有区别。局部变量中的常量字符串仍将在常量池中结束并进行优化。所以一般来说,局部变量更快,因为它们更容易访问,但在常量字符串的情况下,它没有什么区别。因此,在您的案例中选择更具可读性和直观性的内容。