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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 周星星 注册黑马   /  2012-6-19 09:06  /  2079 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

String s=new String("abc");问:该语句有几个String Object?
我写的是:有两个,一个是s,另一个是"abc"
不知道写的是否正确

7 个回复

倒序浏览
首先说明String是不可变类。一次创建将不能再修改,由于String是非可变的,所以每次对string的改变都要重新建立String对象,为了string对象的可利用性和jvm运行的高效。如果是s="abc",将直接在strings pool中进行查找是否存在相等的String,如果存在则直接利用,就不在创建。如果不存在则直接在strings pool中创建对象。如果用new创建对象,则和其他对象的创建一样在heap中创建。
对于此问题来说,则创建了两个string,第一个“abc”创建一个String在strings pool中,第二个是new 出来的String,将和其他对象new出来的对象一样创建在堆中。  str则指向堆中的对象。
回复 使用道具 举报
正确.
s是引用,存放在栈内存中
abc是常量,存放在常量池
回复 使用道具 举报
String s=new String("abc");  只有这一句吗,问创建了几个对象?
如果只有这一句话问创建了几个对象,那么是2个 没错.
回复 使用道具 举报
2个,一个是"abc",另一个是new string.
s只是指向了new string,而 new string又指向了"abc".
回复 使用道具 举报
把创建一个String分成两步,就更容易理解些,如下:String s;s = new String("abc");
以上两步第一步创建了一个对象S(第一个Object),第二步给对象S赋值为“abc”(第二个Object)。
回复 使用道具 举报
刘笑 中级黑马 2012-6-19 11:02:27
7#
当new一个对象并赋值时候,假设赋值为abc,则JVM先从StringPool中查找有没有abc,如果没有,则创建一个。如果没有,则令s指向它。然后再到堆中创建一个对象。所以一共有两个对象。楼主切记:只要出现一个new,肯定在堆中创建一个对象
回复 使用道具 举报
String s是在栈中建立一个引用。
new String("abc");是在堆里建立一个String对象"abc"
然后通过赋值符号=,把对象的地址赋给引用。

有俩Object,栈中有个基础型String,堆里有个对象String
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马