2 scabc5501 scabc5501 于 2016.04.29 20:57 提问

java String类创建对象相关

“执行语句 String str = new String("abc") 时,不管字符串池中是否存在"abc" ,直接新建一个字符串"abc"(注意:新建的字符串"abc" 不是在字符串池中),然后将其赋给str。”
百度上看到这段,有几个疑问:
1、之前认为new创建String对象时,会先判断常量池中是否存在"abc",如果有就不在常量池中创建"abc",没有就创建并返回给堆中的new String(),自己理解的和上端叙述有点出入,不知道哪个是对的。
2、“(注意:新建的字符串"abc" 不是在字符串池中)”,如果他是正确的,那么新建的"abc",是存在堆中的么?

2个回答

danielinbiti
danielinbiti   Ds   Rxr 2016.04.29 22:08
 字符串池中会创建,只是说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不同。侧面证明了不同常量值的地址不同,但是同一个字符串都是从同一个常量池中取值的
 所以不再字符串池中创建这个说法目前来看站不住脚
Jintao_Ma
Jintao_Ma   2016.05.01 10:34

1.你的理解是错的,你说的“如果有就不在常量池中创建"abc"”,答案是:即使池中有,这时候仍然要在堆中创建一个,你看一下String的构造函数;
你说的“没有就创建并返回给堆中的new String()”,答案是:没有的话,创建一个字符串放入池中,接着在堆中新建一个,最后在栈中添加一个堆中Hello的引用;
详情见:
http://blog.csdn.net/jintao_ma/article/details/51042900

Jintao_Ma
Jintao_Ma 2.还有一点就是我要说的, String a= "abc"和String a = new String(“abc”)处理方式是不一样的;后者其实执行了两个步骤,你看下String的构造函数
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!