在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
}
}
使用命名常量可能更有利于维护。然而,编译时已知的常量可以作为内联使用,在这种情况下不太可能有任何区别。
注意:如果您使用的是字符串文字,那么无论在JVM中的哪个位置使用,它都将只创建一次。
在这种情况下,唯一的区别是在堆栈上使用局部变量,该变量不太可能比用作内联的常量更昂贵。
每次访问方法时都必须声明变量,这实际上会对性能造成影响吗
由于Java使用静态编译器,在加载类/方法时,变量只被声明一次(或在编译的每个阶段声明一次),而不管调用了多少次方法。但是,每次都可能对变量进行初始化。
事实是,最终没有区别。局部变量中的常量字符串最终仍将在常量池中进行优化。所以一般来说,局部变量更快,因为它们更容易访问,但在常量字符串的情况下,这并没有什么区别。因此,在您的情况下,选择可读性更强、更直观的内容。
我想创建常量来自旧时代,因为创建静态有助于在jvm中只维护一个字符串作为类的一部分,而不是每次创建和销毁对象时创建和垃圾收集的对象。但由于spring默认作用域是singleton而不是prototype,我想这没有什么区别。所以,是的,这取决于该类将如何使用,这就是答案。