A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 象牙 中级黑马   /  2014-8-13 23:03  /  1536 人查看  /  4 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

在这里总结一下总是遇到的关于产生几个对象的问题,希望高手前来指教

String s = "Hello";与String s = new String("Hello");两者有什么不同呢,我们都很熟悉的结论是前者只创建了一个对象,而后者则创建了两个对象;
分析其具体原因不外是它们分别在什么位置,代表了什么关系,如String s = "Hello";由于没有new关键字所以它不可能在堆内存中出现,s仅仅是与一个对象被引用的关系,在说一说它的位置s是放在栈内存中的,而“Hello”这一个对象则被放在字符串pool中,在创建这一个引用的时候,虚拟机会先到pool中查找是否存在,如果不存在才会创建一个对象来使用,如果存在则不需要再创建对象,只是创建了一个引用;
String s = new String("Hello");由于使用了new关键字则在堆内存中会创建一个对象,而另一对象则放在了pool中,这时候s指向的是堆内存中对象的地址。


String  s = "Hello"+"world";创建了一个对象,那就是”Helloworld“在进行编译的时候右侧是两个字符串常量的相加,而s指向的是字符串相加后的引用;
而如果 变成 String s1="Hello";String s2="world ";String s=s1+s2;则会产生三个对象;
String s1="Hello";String s2=" world ";String s=s1+" world " ;也会产生三个对象;
String s1="Hello"+" world ";String s2="Hello"String s3="world ";String s=s2+ s3;则会产生四个对象;


同样 像  《String s = "a" + "b" + "c" + "d" + "e"; 》这样的问题就会只创建一个对象。













4 个回复

正序浏览
字符串的操作一直很迷惑
回复 使用道具 举报
为什么String s1="Hello"+" world ";String s2="Hello";String s3="world ";String s=s2+ s3;会产生四个对象,是因为 String s = s2+s3; 直接将s2和s3所指向的字符串直接相加,合成一个新字符串,而不再判断它是否前面已经存在的字符串相同吗?

点评

你不能只看最后字符串是否相同,你要看它们产生的过程,这里是关于变量和常量的讨论,常量可以直接用+链接进行操作,但是同样的操作用于变量....  发表于 2014-8-14 20:11
回复 使用道具 举报
说的不错,证明你学的很认真,我之前的都快忘的差不多了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马