本帖最后由 王玮 于 2013-1-1 15:09 编辑
我的理解是:new String(); 直接在对内存创建一个对象,然后再字符串常量池里面去寻找 是否有“xyz”,有就把值赋给 刚在内存创建的那个对象。最后把地址赋给s
=====================================================================================================
这是一点总结:第一:对于 String s2 = new String("abc") ,只要是用new()来新建对象的,都会在堆中创建,而且其字符串是单独存值的,即使与栈中的数据相同,也不会与栈中的数据共享。new创建字符串时首先查看池中是否有相同值的字符串,如果有,则拷贝一份到堆中,然后返回堆中的地址;如果池中没有,则在堆中创建一份,然后返回堆中的地址
第二:对于 String s1 = "abc ";先定义一个名为s1的对String类的对象引用变量:String s1;,然后,在栈中(字符串常量池)查找有没有存放值为 "abc "的地址,如果没有,则开辟一个存放字面值为 "abc "的地址,接着创建一个新的String类的对象s,并将s 的字符串值指向这个地址,而且在栈中这个地址旁边记下这个引用的对象s。如果已经有了值为 "abc "的地址,则查找对象s,并返回s的地址。最后,将s1指向对象s的地址。
|