“执行语句 String str = new String("abc") 时,不管字符串池中是否存在"abc" ,直接新建一个字符串"abc"(注意:新建的字符串"abc" 不是在字符串池中),然后将其赋给str。”
百度上看到这段,有几个疑问:
1、之前认为new创建String对象时,会先判断常量池中是否存在"abc",如果有就不在常量池中创建"abc",没有就创建并返回给堆中的new String(),自己理解的和上端叙述有点出入,不知道哪个是对的。
2、“(注意:新建的字符串"abc" 不是在字符串池中)”,如果他是正确的,那么新建的"abc",是存在堆中的么?
字符串池中会创建,只是说new String()也同时会在堆中创建一个对象。
这个可以看jvm指令能说明的。
String s = new String("abc");
String s1 = new String("abc");
String s2 = new String("abc2");
上面这三句话如果用javap转成jvm指令,s和s1会从同一个地址的常量池中取abc,而s2因为不是同一个字符串,地址和s和s1不同。侧面证明了不同常量值的地址不同,但是同一个字符串都是从同一个常量池中取值的
所以不再字符串池中创建这个说法目前来看站不住脚
1.你的理解是错的,你说的“如果有就不在常量池中创建"abc"”,答案是:即使池中有,这时候仍然要在堆中创建一个,你看一下String的构造函数;
你说的“没有就创建并返回给堆中的new String()”,答案是:没有的话,创建一个字符串放入池中,接着在堆中新建一个,最后在栈中添加一个堆中Hello的引用;
详情见:
http://blog.csdn.net/jintao_ma/article/details/51042900