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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© cehkongfu 中级黑马   /  2012-10-2 21:08  /  1931 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于 String str = new String("abc");      能够产生两个对象,是哪两个对象?str又指向了谁?{:soso_e150:}

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
一个是new String("abc"),一个是"abc",str指向的是new String("abc")

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
柏占肖 发表于 2012-10-2 21:12
一个是new String("abc"),一个是"abc",str指向的是new String("abc")

"abc"  是String类的对象  很好理解  可是  new String("abc") 是什么类的对象呢?
回复 使用道具 举报
String str = new String("abc");

第一个对象是“abc”,每一个字符串都是一个常量,不可改变的,放在常量池里面,
而string new 出来的对象又是一个对象,他有一个实实在在的内存空间存放“abc”在常量池中的地址,而str是指向这块空间的引用,而通过这种方式的string对象中指向"abc"的值可以被改变,可以指向“bcd”,“dfefr”等等,但是str的地址不会变

这里要明白,字符串常量不完全等于字符串对象,其实上面的一条语句用了三个内存空间,“abc"的,new出来的String存放的,还有一个是Str的。而通过例如String str = “abc”创建的实例,就只有两个空间。

这么说不知道你能不能明白

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
"abc" 本身就是一个对象(所有的字符串都可以理解成对象)   是一个常量  ,放在常量池里面
你可以这样理解吧  final String s="abc";

而你 new String(s); 这又是一个对象  放在堆内存中,在这里的时候 new String()指向了  常量池 s的地址(这里可以改变,因为有参数,例如:你换了s="def" 就指向了def的常量池地址)  ,
str是在栈内存中产生的   指向的是 new String的()地址 (不会改变)  ,我画一个图吧,加强理解

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 邱成 于 2012-10-2 23:12 编辑



jvm在启动时,在内存中开辟了一块空间叫做字符串池(string pool)用于存放字符串常量。
每一个常量字符都是一个匿名String类对象。
String s1="abc" ,jvm先到字符串池中查看,有没有一个内容是"abc"的String类对象,有就让s1直接指向这个对象,没有,就新建一个,再让s1指向。
所以你如果再写一个String s2="abc"  ,字符串池中并没有新建对象,只不过让s2指向了"abc"对象,所以s1==s2;
但是当你String s3=new String("abc");后,先查看字符串池里有没有内容"abc"的对象。有,就在池中创建一个拷贝到堆(heap)中;没有,就直接在堆中创建对象。两种情况都把堆内存中的地址返回给s3.
很明显,s1,s2都不等于s3.
所以String str=new String(“abc”);能够产生两个对象,分别是常量池中的abc和堆中的abc

评分

参与人数 1技术分 +1 收起 理由
唐志兵 + 1 赞一个!

查看全部评分

回复 使用道具 举报
cehkongfu 发表于 2012-10-2 21:18
"abc"  是String类的对象  很好理解  可是  new String("abc") 是什么类的对象呢?

也是String类型的对象
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马