static final String = "something";
我想知道这样的声明在Java中是否具有某种实际意义。我已经在代码中发现了数千次,但是研究并使用了字符串,据我了解,声明String
对象的次数并不重要:如果在您的类之前声明了该字符串,则将其合并并重用(谈论在没有显式构造函数调用的情况下创建的字符串)
public class StringCompare {
private void toCompare(String h) {
String x = "hello";
System.out.println( x == h);
}
public void compare() {
String h = "hello";
toCompare(h);
}
}
实际上,此代码在true
调用compare时打印,因此2个变量都引用同一对象。表示final
无法重新定义变量,在这种情况下,static
单词完全没有用。我错过了重点吗?
还有两件事:
1-为什么显式调用String
构造函数不会导致将String合并?与上面相同的代码使用new String("hello")
打印false
。
2-池行为是否保留给字符串?还有其他一些不可变的对象(例如BigInteger),但我认为这些对象没有被合并...为什么?
谢谢,卡洛
尽管您对运行时行为及其使用的字符串池的分析是正确的,但仍有一些原因使开发人员使用此模式。
至于您对问题的关注:
因为字符串池仅用于字符串文字,如JLS所述,并且调用构造函数时未归类为字符串文字。
字符串池仅用于字符串文字,但是当然还有针对不同用例的其他缓存。最容易想到的是用于优化自动装箱的int缓存。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句