黑马程序员技术交流社区

标题: String s = new String("xyz")创建了几个对象 [打印本页]

作者: a464538715    时间: 2013-6-6 15:32
标题: String s = new String("xyz")创建了几个对象
本帖最后由 a464538715 于 2013-6-6 22:12 编辑

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

作者: 刘晓    时间: 2013-6-6 15:37
创建了一个对象,String只是你创建对象的类型,一个new创建一个对象。
作者: a464538715    时间: 2013-6-6 15:38
刘晓 发表于 2013-6-6 15:37
创建了一个对象,String只是你创建对象的类型,一个new创建一个对象。

创建了两个对象
作者: 杨政    时间: 2013-6-6 15:41
如果“xyz”已经存在,就是一个,不存在就是两个。
作者: 刘晓    时间: 2013-6-6 15:42
a464538715 发表于 2013-6-6 15:38
创建了两个对象

一个new不是只创建一个对象的么?
怎么创建的两个?
作者: 萧萧北    时间: 2013-6-6 15:44
杨政 发表于 2013-6-6 15:41
如果“xyz”已经存在,就是一个,不存在就是两个。

两个对象
作者: 金辉    时间: 2013-6-6 15:48
两个,一个是字符串字面量"xyz"所对应的、在字符串常量池中的实例,另一个是通过new 创建并初始化的、内容与"xyz"相同的实例,在堆内存中
作者: 胡晓思    时间: 2013-6-6 15:49
两个对象

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

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

String s = ... 没有创建对象,只是引用了new String(...)产生的那个对象而已。
作者: 杨政    时间: 2013-6-6 15:49
萧萧北 发表于 2013-6-6 15:44
两个对象

如果"xyz"已经使用过的话,new就只会在堆内存中创建一个String对象,再将该对象指向已经存在的"xyz"而不会再去创建一个,因为String是fina类型的,以常量形式存在,这样就只创建一个对象了。
作者: 王瀛    时间: 2013-6-6 16:20
String s = new String("xyz") 在内存中创建了两个对象。

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

而通过new操作符创建的对象,可以理解成是一个副本,这个副本里装的东西和“”的相同
作者: 曾林魁    时间: 2013-6-6 16:29
本帖最后由 曾林魁 于 2013-6-6 16:31 编辑

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

还要提醒你一点;常量池是专门用于管理在编译期被确定并被保存在已经编译的.class文件中的一些数据。它包括了关于类,方法,接口中的常量,还包括了字符串常量;
作者: 王鑫    时间: 2013-6-6 16:39
String s1="xyz",是在方法区的常量池中创建了一个“xyz”对象,s1是指向它的引用。
String s2=new String("xyz")可以分成两部分看:一部分“xyz”是在常量池中创建了一个“xyz”对象,
                                                               另一部分new String()是在堆内存中创建了一个对象里面的值是“xyz”。s2是指向堆内存中该对象的引用。
s1和s2里面的字符串都是“xyz”,但是一个指向常量池,一个指向堆内存,所以s1不等于s2.
作者: 8047107    时间: 2013-6-6 17:06
哥们 你看到第几天的视频了啊?我觉得这个跟你进度应有关系的把
作者: 萧萧北    时间: 2013-6-6 17:37
杨政 发表于 2013-6-6 15:49
如果"xyz"已经使用过的话,new就只会在堆内存中创建一个String对象,再将该对象指向已经存在的"xyz"而不 ...

搞明白了,O(∩_∩)O谢谢
作者: 萧萧北    时间: 2013-6-6 17:39
王鑫 发表于 2013-6-6 16:39
String s1="xyz",是在方法区的常量池中创建了一个“xyz”对象,s1是指向它的引用。
String s2=new String(" ...

理解很深刻呀 ,哥们,以前我也有点稀里糊涂的,看了你们的解释,豁然开朗了,呵呵
作者: Sword    时间: 2013-6-6 19:00
如果问题未解决,请继续追问,如果问题解决了,请点击你的帖子下面的"编辑"重新编辑帖子,将分类改为“已解决”,谢谢合作!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2