String s=new String("abc");

请问String s=new String("abc");
是先在栈开辟一块空间存放引用s;
然后在堆里开辟堆里开辟一块空间存放new String("abc")对象;
最后是在常量池存放abc常量吗???

如果是String s = "sbc"
先看常量池中有没有"abc" 再创建 将常量放入常量池

而String s=new String("abc");
创建的字符串不是常量 所以是直接放在在堆中追问

实现String s=new String("abc");时,不会查看常量池有没常量abc?

追答

new String("abc");是在运行期 new出来的 存放在堆中,可以有多份,所以我想没必要查看常量池吧

追问

那String s=new String("abc");创建对象new String("abc");时如果常量池没有常量abc,会不会在常量池同时创建一个常量 abc?

追答

这个我和我们群里的人也搞乱了 讨论的结果是不会添加到常量池 我也只能帮你这么多了

温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-11-29
你这里的ABC是字符串啊,就是栈开辟一块空间存放引用s;
然后在堆里开辟堆里开辟一块空间存放new String("abc")对象;
第2个回答  2011-11-29
是的追问

就是说new一个对象 就会在常量池存放String 对象的“值”---abc常量??常量池就存在常量abc?

追答

new出来的都是在堆内存里面新开辟一块空间,你可以去测试嘛,比较s=="abc",然后再String s2= new String("abc"),然后比较s==s2。

追问

这个我知道,就是不懂是不是String s=new String("abc");创建对象new String("abc");时是不是也在常量池同时创建一个常量 abc?

追答

我的理解,常量池里面应该是只有char a,char b,char c等字符型的常量,在new String("abc")的时候先由char a、b、c先组成一个新的常量,然后赋给堆内存中新开辟的空间。

相似回答