日期:2014-05-20  浏览次数:20677 次

后天笔试去,问个问题,顺便散分,祝我好运
还是老掉牙的问题 String s = new String("abc");
为什么创建的是两个对象呢
我看有人说是 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。
引用也是对象吗?这句话创建是这样的吗
1) 栈中开辟一块空间存放引用s, 
2) 堆中开辟一块空间存放一个新建的String对象"abc", 
3) 引用s指向堆中的新建的String对象"abc", 

那个引用算对象吗,算的话那任何一个new出来的岂不都是两个对象了

如果两次用String s1 = new String("s1");
  String s2 = new String("s2");
那么第二个语句也是两个对象吗?

我后天去用友在北航的宣讲会,各位前辈有什么能指点一下的吗?谢谢

------解决方案--------------------
引用当然算一个对象
------解决方案--------------------
我估计一个对象一个引用这些人全是背出来的,根本没理解原理。

这种问题要分情况讨论。

String s = new String("abc");

如果String池里没有"abc". 那么
1. jvm会在String池里开辟一个String对象存放"abc"。跟String s = "abc" 道理一样。
2. String池中创造好"abc"之后就执行new 操作,在堆内存中开辟一个空间存放new出来的String对象。其实上你new出来的String对象里维护的char数组是指向String池里的"abc"对象里的char数组。 这种情况下你创建的是两个对象。

如果String池里已经有"abc"了。
什么都不说了,直接上面的第二步。


------解决方案--------------------
String s = new String("abc");
如果只有这一句,的确是两个对象。
一个是常量池中的"abc" , 一个是堆内存中的"abc".

强调一点:引用不是对象!
具体这类问题,网上资料比较多。
我是来拿分的,嘻嘻...
------解决方案--------------------
可以看看这个!祝楼主好运!
http://topic.csdn.net/u/20120607/07/9D3A5948-CA38-4EB9-A4F8-63400B34E13A.html
------解决方案--------------------
我看有人说是 两个对象,一个是“xyx”,一个是指向“xyx”的引用对象s。

应该是

一个是“abc”,一个是指向“abc”的引用对象s。


------解决方案--------------------
探讨
如果String池里没有"abc". 那么
1. jvm会在String池里开辟一个String对象存放"abc"。跟String s = "abc" 道理一样。
2. String池中创造好"abc"之后就执行new 操作,在堆内存中开辟一个空间存放new出来的String对象。其实上你new出来的String对象里维护的char数组是指向String池里的"abc"对象里的char数组。 这种情况下你创建的是两个对象。

如果String池里已经有"abc"了。
什么都不说了,直接上面的第二步。

------解决方案--------------------
另外,祝你好运哈。~ 面试官有的很恶心。
------解决方案--------------------
哎,出来在一家公司呆了两年多了,现在想换工作,都有些迷茫了
------解决方案--------------------
的确是两个对象 一个是data区的"abc"字符串 一个是堆内存里的对象
------解决方案--------------------
当你第一次String s1 = new String("s1"); 系统为跟你分析查找在栈的String池里面有没有“s1” 这个对象,如果没有,就会创建一个, 然后再在内存堆里面创建一个String(“s1”)对象。栈里面有个指向这个对象的地址。 
当你再String s2 = new String("s1") 时,String池里面不会再创建一个新的对象 而是使用第一次在String池里面的那个“s1” 当然还有在堆内存里面个new String("s1") 对象
------解决方案--------------------
字符串abc创建了一个常量池里的对象。
new String("abc")创建了另一个对象。
一共是2个对象
------解决方案--------------------
的确是两个对象 一个是data区的"abc"字符串 一个是堆内存里的对象
------解决方案--------------------
受教育了- -~ 感谢楼主
------解决方案--------------------
好运!!!
------解决方案--------------------
good luck! 接分
------解决方案--------------------
Hava a good luck!
------解决方案--------------------
楼主加油