关于Java中的String对象中的堆与栈的问题

猎人-d 2012-07-19 03:11:21
String str1=new String("abc");
String str2="abc";
些两句有创建了多少个对象。正确的答案是创建了两个对象。

问题:
我对这两句的理解:
String str1=new String("abc"); 创建了两个对象,new一个对象和创建了一个字符为abc的值的对象,并把abc放在堆中。
String str2="abc"; 创建一个新的对象,并把abc放在栈中。
所以我不知道为什么只有两个对象

除非第一句中,堆也是可以共享数据的。所以String str2="abc";中的abc才在堆中找到了abc,然后str直接指向abc。

各位能不能给我解释下
...全文
354 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiangchunyan0301 2012-08-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
引用 12 楼 的回复:
String str1=new String("abc");//创建两个对象,一个在string池中,一个在堆中,而str1的引用是指向堆中的
String str2="abc";//不会创建新的对象,此语句执行时会在string池中查找是否存存值为abc的string对象,找到后直接将string池中的引用返回,即str2的引用是指向string池中的.

觉得……
[/Quote]

1.直接赋纯字符串值时,会首先检查pool池中,若有则返回pool的引用,若无则在pool池中创建后返回引用;
2.通过new赋值,会首先检查pool澉中,若有则复制一份到heap上,并返回heap上的引用;若无,则在pool中创建后再复制一份到heap上并返回heap上的引用;
3.对包含了new方式创建对象的"+"连接表达式所产生的对象未放入pool中;对于类似str=1+"AAA"+2+3这种强制类型转化形成的String对象也不会放到pool中的;
zhaoming262350 2012-08-24
  • 打赏
  • 举报
回复
字符串创建对象时,首先要看String pool里面有没有这个对象,如果没有,现在String pool里面先创建一个对象,然后要在堆里面创建一个对象,赋给引用变量。
String str1=new String("abc");说明String pool里面没有“abc”这个对象,先在String pool中创建了一个“abc”对象,然后再在堆里面创建一个“abc”的对象,并把“abc”的地址赋给str1;
String str2="abc";这时String pool里面已经有了“abc”的对象,因此,直接在堆里面创建一个“abc”的对象
并把地址赋给str2,导致str2指向了堆中创建的这个“abc”字符串对象。
因此在堆里面创建了两个对象。
gzc145 2012-08-24
  • 打赏
  • 举报
回复
2楼正解
wonkju 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
关于string池的讲解,网上文章也是相当多的。楼主不妨搜索看一看。

String str1=new String("abc");
这句之后,创建了两个对象,一个是new 出来的string对象。
另一个是在string池中的“abc”。
而执行String str2="abc";之后, 并没有创建新的对象,str2指向了第一行代码创建的那个在string池中的abc而已[/Quote]。
(楼上说的对,如果这里"abc"原来没有,才创建新的)
sffx123 2012-07-20
  • 打赏
  • 举报
回复
过来打个酱油,String对象太多了,经常不知道有多少
ZangXT 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

给跪了,下面完全在胡扯了,这不是误人子弟嘛
[/Quote]

流传多年,影响了大批人。
你看13楼回帖的ps部分“PS:String str1="abc";在网上说的是abc是放在栈中,String池也是属于栈吗??”,这里的“网上说”基本都是那个帖子或者其变种。
龙四 2012-07-20
  • 打赏
  • 举报
回复
给跪了,下面完全在胡扯了,这不是误人子弟嘛

[Quote=引用 15 楼 的回复:]

引用 14 楼 的回复:

为什么不信这个帖子呢?
http://www.iteye.com/topic/774673

写jvm的人写的帖子,此人现在在oracle,还有比他更懂的吗

原因可能是:
1.大家期待的是到底是1还是2这样的答案,而不是“It depends”。
2.太复杂,可能看不懂,或者读起来不容易接受。
而且只要写的通俗易懂,哪怕知识是错的也不重要,看一……
[/Quote]
ZangXT 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 的回复:]

为什么不信这个帖子呢?
http://www.iteye.com/topic/774673

写jvm的人写的帖子,此人现在在oracle,还有比他更懂的吗
[/Quote]
原因可能是:
1.大家期待的是到底是1还是2这样的答案,而不是“It depends”。
2.太复杂,可能看不懂,或者读起来不容易接受。
而且只要写的通俗易懂,哪怕知识是错的也不重要,看一下这种帖子http://sd.csdn.net/a/20120629/2806999.html都能广为流传就知道了。
龙四 2012-07-20
  • 打赏
  • 举报
回复
为什么不信这个帖子呢?
http://www.iteye.com/topic/774673

写jvm的人写的帖子,此人现在在oracle,还有比他更懂的吗


[Quote=引用 13 楼 的回复:]

引用 12 楼 的回复:
String str1=new String("abc");//创建两个对象,一个在string池中,一个在堆中,而str1的引用是指向堆中的
String str2="abc";//不会创建新的对象,此语句执行时会在string池中查找是否存存值为abc的string对象,找到后直接将string池中的引用返回,即str2的引用是指向string池中的.

……
[/Quote]
猎人-d 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
String str1=new String("abc");//创建两个对象,一个在string池中,一个在堆中,而str1的引用是指向堆中的
String str2="abc";//不会创建新的对象,此语句执行时会在string池中查找是否存存值为abc的string对象,找到后直接将string池中的引用返回,即str2的引用是指向string池中的.
[/Quote]
觉得12楼的说的在理。
如果换成这样:
String str1="abc"; //创建了一个对象,放在String池中,内容为abc,str1指向string池.
String str2=new String("abc"); //也创建一个对象,new一个对象,对象的内容放在堆中。
这两个语句创建了两个对象。是不是也是这样理解的。。。(PS:String str1="abc";在网上说的是abc是放在栈中,String池也是属于栈吗??)
jiangchunyan0301 2012-07-20
  • 打赏
  • 举报
回复
String str1=new String("abc");//创建两个对象,一个在string池中,一个在堆中,而str1的引用是指向堆中的
String str2="abc";//不会创建新的对象,此语句执行时会在string池中查找是否存存值为abc的string对象,找到后直接将string池中的引用返回,即str2的引用是指向string池中的.
猎人-d 2012-07-19
  • 打赏
  • 举报
回复
你们都实在太搞笑了
sdojqy1122 2012-07-19
  • 打赏
  • 举报
回复
如果有面试官问你创建几个对象,你应该这样回答,这个问题有的东西涉及比较深,您老是怎么看的?
龙四 2012-07-19
  • 打赏
  • 举报
回复
csdn这个老出问题的网站有什么不可能呢?!

[Quote=引用 6 楼 的回复:]

引用 1 楼 的回复:
http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html

我的问题是你的结贴率为啥是101.2%呢?
[/Quote]
蓝色小棉袄 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
http://topic.csdn.net/u/20120607/07/9d3a5948-ca38-4eb9-a4f8-63400b34e13a.html
[/Quote]
我的问题是你的结贴率为啥是101.2%呢?
龙四 2012-07-19
  • 打赏
  • 举报
回复
有必要再开一贴,将近期成为月经贴的内容纳入

[Quote=引用 3 楼 的回复:]

四哥的月经贴又出现啦
[/Quote]
五哥 2012-07-19
  • 打赏
  • 举报
回复
String str1=new String("abc");
这句之后,创建了两个对象,一个是new 出来的string对象 ,堆中
另一个是在string池中的“abc”。
五哥 2012-07-19
  • 打赏
  • 举报
回复
四哥的月经贴又出现啦
brightyq 2012-07-19
  • 打赏
  • 举报
回复
关于string池的讲解,网上文章也是相当多的。楼主不妨搜索看一看。

String str1=new String("abc");
这句之后,创建了两个对象,一个是new 出来的string对象。
另一个是在string池中的“abc”。
而执行String str2="abc";之后, 并没有创建新的对象,str2指向了第一行代码创建的那个在string池中的abc而已。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧