在许多有关java
(例如,“Java 哲学”)的书籍中,他们写道,在编写视图构造时,String s = "some string"
实际上会创建一个新对象String
,如下所示:String s = new String("some string")
.
那我为什么要这样做System.out.println(new String("a") == new String("a"))
并得到false
. 但万一System.out.println("a" == "a")
我收到true
.
为什么在第一种情况下jvm
创建了两个不同的对象,而在第二种情况下它指的是同一个对象?
如果您使用显式调用
new
,则会创建一个新对象。但是,如果您使用隐式对象创建,那么编译器会将其放置在一个特殊的存储中 -一个字符串池,因此,在随后的隐式对象创建期间,它会从那里获取。您可以使用 方法将字符串放入池中
intern
,但不要将所有字符串排成一行,因为这不会显着提高性能并可能导致内存溢出(OutOfMemoryError)。这是一篇关于它的文章。