我知道有两种方法可以在Java中创建String:
String a = "aaa";
String b = new String("bbb");
Run Code Online (Sandbox Code Playgroud)
第一种方式,Java肯定会在字符串池中创建一个String对象并a引用它.(假设"aaa"之前不在游泳池里.)
使用第二种方法,将在堆中创建一个对象,但是jvm还会在字符串池中创建一个对象吗?
在这篇关于Java字符串池的问题中,@ Jesper说:
如果你这样做:
Run Code Online (Sandbox Code Playgroud)String s = new String("abc");然后在池中将有一个String对象,一个代表文字"abc",>的对象,并且将有一个单独的String对象,而不是在池中,它包含池对象的>内容的副本.
如果这是真的,那么每次使用new String("bbb");,在池中创建一个对象"bbb",这意味着通过上面的任何一种方式,java将始终在池中创建一个字符串对象.然后intern()用于什么?在文档http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#intern()中,它说:
调用实习方法时,如果池已经包含等于此字符串对象的字符串(由equals(Object)方法确定),则返回池中的字符串.否则,将此String对象添加到池中,并返回对此String对象的引用.
这意味着有些情况下池中没有字符串,这可能吗?哪一个是真的?