创建对象的问题,看到很多总说法,求一个权威解释!!!
1.String a="b",Stirng b="b";创建了几个对象??
2.String a=new String("a"+"b");创建了几个对象??
判断的规律是什么??菜鸟求解释!!!
http://zhidao.baidu.com/question/213275087.html
------解决方案--------------------String a="b" 创建了一个对象"b",Stirng b="b",在栈中找到"b",不创建对象。这里是1个对象。
如果开始存在"b",不创建对象。0个对象。
String a=new String("a"+"b");
new 会在堆中开辟一块内存,算是创建对象 a(一个名字,引用算不算对象呢?)然后去栈中找有没有"ab",如果没有在字符串pool创建"ab",如果有不创建。所以应该是1-2个对象。
------解决方案--------------------1、共创建了两个对象,分别为常量池中的,a与b
2、在上面的基础上新创建了两个对象:堆区的new String 和常量池中字符串ab:
解释:String通常为人们称之为不变模式,字符串常量都放在内存的池区,供反复利用,1中声明变量时之间将变量的引用指向了池中的两个常量:a和b,如果池中没有a和b那么就要创建两个对象,2则是通过创建堆区对象的形式指向了池中的常量ab,两个字符串拼接成新串,2中的声明方式相当与引用指向了堆区的new String对象,而堆区的对象又指向了池中的常量ab
------解决方案--------------------看这个吧:http://www.iteye.com/topic/774673
此文章作者就是开发jvm的,没有人比他更清楚了
------解决方案--------------------
------解决方案--------------------第一个问题是创建了一个对象,字符常量存在于datasgment中,不是在栈和堆空间中。当第一个String a="b"执行时。datasgment中就会有个空间里包含“b”,第二个String b="b"只会用引用指向第一个创建"b"的位置。
第二个问题也只是创建了一个对象,栈空间指向堆空间的对象。+号时字符串连接符。
------解决方案--------------------
------解决方案--------------------String a = "b";
这个大概的意思是,现在字符串常量池中寻找"b",如果找到了,就把地址赋值给引用a,如果没找到则在字符串常量池中建立常量"b",然后再把常量"b"的地址给引用a;
所以1.String a="b",Stirng b="b";创建了几个对象??可能最多建立一个"b"的字符串常量,和2个引用
2.String a=new String("a"+"b");创建了几个对象??最多可能建立3个字符串常量"a","b", "ab",然后会在堆里面建立一个对象“ab”,然后把堆中的对象引用赋值给a