导航
  • 全部
...

【向ZangXT等大侠提问】关于创建String新对象问题的8种情况

bigbro001 2008-12-22 03:11:22
加精
仔细阅读了以往ZangXT大侠关于这个问题的几个回复,总结了8种情况,不知理解是否正确,恳请ZangXT大侠指正:

1. String str1 = "abc";
System.out.println(str1 == "abc");

步骤:
1) 棧中开辟一块空间存放引用str1,
2) String池中开辟一块空间,存放String常量"abc",
3) 引用str1指向池中String常量"abc",
4) str1所指代的地址即常量"abc"所在地址,输出为true


2. String str2 = new String("abc");
System.out.println(str2 == "abc");

步骤:
1) 棧中开辟一块空间存放引用str2,
2) 堆中开辟一块空间存放一个新建的String对象"abc",
3) 引用str2指向堆中的新建的String对象"abc",
4) str2所指代的对象地址为堆中地址,而常量"abc"地址在池中,输出为false


3. String str3 = new String("abc");
System.out.println(str3 == str2);

步骤:
1) 棧中开辟一块空间存放引用str3,
2) 堆中开辟一块新空间存放另外一个(不同于str2所指)新建的String对象,
3) 引用str3指向另外新建的那个String对象
4) str3和str2指向堆中不同的String对象,地址也不相同,输出为false


4. String str4 = "a" + "b";
System.out.println(str4 == "ab");

步骤:
1) 棧中开辟一块空间存放引用str4,
2) 根据编译器合并已知量的优化功能,池中开辟一块空间,存放合并后的String常量"ab",
3) 引用str4指向池中常量"ab",
4) str4所指即池中常量"ab",输出为true


5. final String s = "a";
String str5 = s + "b";
System.out.println(str5 == "ab");

步骤:
同4


6. String s1 = "a";
String s2 = "b";
String str6 = s1 + s2;
System.out.println(str6 == "ab");

步骤:
1) 棧中开辟一块中间存放引用s1,s1指向池中String常量"a",
2) 棧中开辟一块中间存放引用s2,s2指向池中String常量"b",
3) 棧中开辟一块中间存放引用str5,
4) s1 + s2通过StringBuilder的最后一步toString()方法还原一个新的String对象"ab",因此堆中开辟一块空间存放此对象,
5) 引用str6指向堆中(s1 + s2)所还原的新String对象,
6) str6指向的对象在堆中,而常量"ab"在池中,输出为false


7. String str7 = "abc".substring(0, 2);

步骤:
1) 棧中开辟一块空间存放引用str7,
2) substring()方法还原一个新的String对象"ab"(不同于str6所指),堆中开辟一块空间存放此对象,
3) 引用str7指向堆中的新String对象,


8. String str8 = "abc".toUpperCase();

步骤:
1) 棧中开辟一块空间存放引用str6,
2) toUpperCase()方法还原一个新的String对象"ABC",池中并未开辟新的空间存放String常量"ABC",
3) 引用str8指向堆中的新String对象
...全文
给本帖投票
1557 84 打赏 收藏 转发到动态 举报
写回复
用AI写文章
84 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigbro001 2012-09-04
  • 打赏
  • 举报
回复
4年过去了,重新翻出ZangXT大侠的帖子,温故而知新。。。
无名猪 2010-04-21
  • 打赏
  • 举报
回复
学习,谢谢
innerspace0616 2010-04-19
  • 打赏
  • 举报
回复
搜藏看看
zlyymxl 2009-02-27
  • 打赏
  • 举报
回复
孔明读书,观其大略矣
qing14 2009-01-05
  • 打赏
  • 举报
回复
饿。。。String的讨论大结局了
Miracle1216 2009-01-04
  • 打赏
  • 举报
回复
操,又说了这么多,都不知道谁说得对了,我顶你个肺啊!
derelictangel 2009-01-04
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]
学习,学习,能总结出这么多啊
[/Quote]

PS:
我的目标是 ---->

^_^
success000 2009-01-04
  • 打赏
  • 举报
回复
up
phoenixLotus 2009-01-04
  • 打赏
  • 举报
回复
mark!
Influence 2009-01-04
  • 打赏
  • 举报
回复
mark
dingpin 2009-01-04
  • 打赏
  • 举报
回复
学习了
daomin5832 2009-01-02
  • 打赏
  • 举报
回复
ddddddddddddddddddddddddd
jxjjymx 2009-01-02
  • 打赏
  • 举报
回复
mark
funnybunny 2009-01-02
  • 打赏
  • 举报
回复
收下了~每门语言都是一门艺术,慢慢品味吧~C+++VA两手抓两手都要硬!呵呵~
ashe888668 2009-01-02
  • 打赏
  • 举报
回复
我也来帮你啊
jetlan2007 2009-01-02
  • 打赏
  • 举报
回复
上面这段代码,字符串池中有一个常量String对象"abc",堆中也有一个String对象"abc",那么堆中的这个对象是不是指向池中的那个对象呢?
lbqxl0122 2009-01-02
  • 打赏
  • 举报
回复
学习了!谢谢
z119273835 2009-01-02
  • 打赏
  • 举报
回复
先收藏了 再看
「已注销」 2009-01-01
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 bao110908 的回复:]
学习,学习,能总结出这么多啊
[/Quote]
顶了,像这种问题,不想打字也得打
Sunny_kaka 2009-01-01
  • 打赏
  • 举报
回复
牛人真多..
mark加膜拜
加载更多回复(63)

62,636

社区成员

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

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

手机看
关注公众号

关注公众号

客服 返回
顶部