其他一些答案是有道理的,但是string呢?
String s = "HI";
对于string文字,当一个.java文件被编译成一个.class文件时,任何string都以特殊的方式logging下来,就像所有的常量一样。 当一个类被加载时(注意加载发生在初始化之前),JVM通过类的代码并查找string文字。
当它find一个时,它会检查是否已经从堆中引用了等价的string。 如果不是,则在堆上创build一个String实例,并将该对象的引用存储在常量表中
一旦对该string对象进行了引用,则在整个程序中对该string文本的任何引用都将简单地replace为对string文字池引用的对象的引用。
因此,应该有四个Java对象,尽pipe当同一个方法被一次又一次地调用,那么只有三个对象,如应用程序中string文字池包含文字“HI”。
另外,关于为什么在执行上述方法块时创build新对象的更多信息,我们还可以检查不同string的哈希码( String是不可变的)。
public static void main(String[] args) { NumberOfString str = new NumberOfString(); String s = str.makeStrings(); System.out.println(s.hashCode()); } public String makeStrings() { String s = "HI"; System.out.println(s.hashCode()); s = s + "5"; System.out.println(s.hashCode()); s = s.substring(0, 1); System.out.println(s.hashCode()); s = s.toLowerCase(); System.out.println(s.hashCode()); return s.toString(); }
你得到以下输出:
2305 71508 72 104 104
我们不应该在上面的例子中的string字面值对吗?