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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© a464538715 中级黑马   /  2013-6-6 15:32  /  3777 人查看  /  15 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 a464538715 于 2013-6-6 22:12 编辑

String s = new String("xyz")创建了几个对象,请详细解释

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

15 个回复

倒序浏览
创建了一个对象,String只是你创建对象的类型,一个new创建一个对象。
回复 使用道具 举报
刘晓 发表于 2013-6-6 15:37
创建了一个对象,String只是你创建对象的类型,一个new创建一个对象。

创建了两个对象
回复 使用道具 举报
如果“xyz”已经存在,就是一个,不存在就是两个。
回复 使用道具 举报

一个new不是只创建一个对象的么?
怎么创建的两个?
回复 使用道具 举报
杨政 发表于 2013-6-6 15:41
如果“xyz”已经存在,就是一个,不存在就是两个。

两个对象
回复 使用道具 举报
两个,一个是字符串字面量"xyz"所对应的、在字符串常量池中的实例,另一个是通过new 创建并初始化的、内容与"xyz"相同的实例,在堆内存中
回复 使用道具 举报
两个对象

"xyz"是一个内建对象。说"xyz"不是对象的可以试试"xyz".xxxx,所有String的方法都可以用。

new String(...)创建了第二个对象,用的是构造String(String)

String s = ... 没有创建对象,只是引用了new String(...)产生的那个对象而已。

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报

如果"xyz"已经使用过的话,new就只会在堆内存中创建一个String对象,再将该对象指向已经存在的"xyz"而不会再去创建一个,因为String是fina类型的,以常量形式存在,这样就只创建一个对象了。
回复 使用道具 举报
String s = new String("xyz") 在内存中创建了两个对象。

java中引号引起来的都是字符串对象,一旦被创建就不可被改变,存于常量池中

而通过new操作符创建的对象,可以理解成是一个副本,这个副本里装的东西和“”的相同

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
本帖最后由 曾林魁 于 2013-6-6 16:31 编辑

你要理解这个问题,首先你要去了解一下Java的内存管理机制;对于Java像形如“abc”这样的直接量他在初始化的时候就会将他们放入常量池;由常量池来管理这写字符串;所以你在new(“xyz”)的时候;JVM首先是会使用常量池来管理“xyz”;在调用String的构造器来创建一个String对象,新创建的String对象被保存在堆内存中。所以当常量池中以前没有“xyz”字符串的时候,执行new String("xyz");会创建两个对象;

还要提醒你一点;常量池是专门用于管理在编译期被确定并被保存在已经编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,还包括了字符串常量;

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
String s1="xyz",是在方法区的常量池中创建了一个“xyz”对象,s1是指向它的引用。
String s2=new String("xyz")可以分成两部分看:一部分“xyz”是在常量池中创建了一个“xyz”对象,
                                                               另一部分new String()是在堆内存中创建了一个对象里面的值是“xyz”。s2是指向堆内存中该对象的引用。
s1和s2里面的字符串都是“xyz”,但是一个指向常量池,一个指向堆内存,所以s1不等于s2.

评分

参与人数 1技术分 +1 收起 理由
Sword + 1

查看全部评分

回复 使用道具 举报
哥们 你看到第几天的视频了啊?我觉得这个跟你进度应有关系的把
回复 使用道具 举报
杨政 发表于 2013-6-6 15:49
如果"xyz"已经使用过的话,new就只会在堆内存中创建一个String对象,再将该对象指向已经存在的"xyz"而不 ...

搞明白了,O(∩_∩)O谢谢
回复 使用道具 举报
王鑫 发表于 2013-6-6 16:39
String s1="xyz",是在方法区的常量池中创建了一个“xyz”对象,s1是指向它的引用。
String s2=new String(" ...

理解很深刻呀 ,哥们,以前我也有点稀里糊涂的,看了你们的解释,豁然开朗了,呵呵
回复 使用道具 举报
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马