黑马程序员技术交流社区

标题: 关于String创建对象的问题 [打印本页]

作者: 罗广伟    时间: 2013-5-14 22:36
标题: 关于String创建对象的问题
本帖最后由 罗广伟 于 2013-5-15 19:32 编辑

String s1 = "ja";
String s2 = "va";
String s4 = s1+s2;//这里具体是什么情况?
String s3 = "ja"+"va";
String s5 = "java";
String s6 = new String("java");
请问这段代码创建了几个对象?请详细说明步骤和知识点。
作者: 韩秀山    时间: 2013-5-14 22:50
在常量池中的对象有:
s1=“ja”;  s2="va"  s3 ,s4,s5 指向的是同一个对象="java"
在堆中:
new String("java")  有一个 值=“java”

这个挺重要的,建议楼主一定要弄明白了。。。

作者: 张迁    时间: 2013-5-14 22:51
String s1 = "ja";   在常量池中建立一个对象
String s2 = "va"; 在常量池中建立一个对象
String s4 = s1+s2; 建立一个对象,对象内容是“java”;
String s3 = "ja"+"va"; 没有建立对象,s3指向s4
String s5 = "java";没有建立对象,s5指向s4;
String s6 = new String("java");在堆中建立一个对象。


另外,单单是 String str = new String("asas");来讲,建立了两个对象,先在堆空间创建一个,后再常量池中创建一个,以后再有同样内容的String创建,直接引用常量池中的定义即可,不用创建对象
作者: 罗广伟    时间: 2013-5-14 22:58
韩秀山 发表于 2013-5-14 22:50
在常量池中的对象有:
s1=“ja”;  s2="va"  s3 ,s4,s5 指向的是同一个对象="java"
在堆中:

如果s3.s4指向同一对象,那为什么s3==s4为false?
作者: 罗广伟    时间: 2013-5-14 23:03
张迁 发表于 2013-5-14 22:51
String s1 = "ja";   在常量池中建立一个对象
String s2 = "va"; 在常量池中建立一个对象
String s4 = s1 ...

1.那为什么s3==s4是false呢?
2.String str = new String(“asas”);是不是str指向堆内存中对象,堆内存对象再指向常量池的asas
也就是说此时内存中是不是就常量池中一个asas,堆内存中的对象只是存着一个asas的引用呢?
作者: JinnyZh    时间: 2013-5-15 00:36

String s1 = "ja";                        //在常量池中创建一个对象"ja"
String s2 = "va";                       //在常量池中创建一个对象"va"
String s4 = s1+s2;//这里具体是什么情况?  // 在常量池中创建一个对象"java"
String s3 = "ja"+"va";                     //仅做相连接运算,常量池中创建一个对象"java"与s4内存地址不同,但内容相同
String s5 = "java";                        //没有创建对象指向常量池中的"java",既s3 == s5
String s6 = new String("java");          //常量池中有java,克隆给堆内存,创建一个对象
请问这段代码创建了几个对象?请详细说明步骤和知识点
//所以一共创建了5个对象,

1.那为什么s3==s4是false呢?
//因为 == 在字符串中比较的是内存地址值,不同,而如果用equals()就相等,在字符串中比较内容

2.String str = new String(“asas”);是不是str指向堆内存中对象,堆内存对象再指向常量池的asas
也就是说此时内存中是不是就常量池中一个asas,堆内存中的对象只是存着一个asas的引用呢?
//不是引用而是由于asas是字符串类型,所以在常量池中查找,没有就创建"asas",然后再对内存中copy下来
作者: 罗广伟    时间: 2013-5-15 19:29
JinnyZh 发表于 2013-5-15 00:36
String s1 = "ja";                        //在常量池中创建一个对象"ja"
String s2 = "va";             ...

太详细了,十分感谢。




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