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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 罗广伟 中级黑马   /  2013-5-14 22:36  /  1637 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 罗广伟 于 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");
请问这段代码创建了几个对象?请详细说明步骤和知识点。

评分

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

查看全部评分

6 个回复

倒序浏览
在常量池中的对象有:
s1=“ja”;  s2="va"  s3 ,s4,s5 指向的是同一个对象="java"
在堆中:
new String("java")  有一个 值=“java”

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

评分

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

查看全部评分

回复 使用道具 举报
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创建,直接引用常量池中的定义即可,不用创建对象

评分

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

查看全部评分

回复 使用道具 举报
韩秀山 发表于 2013-5-14 22:50
在常量池中的对象有:
s1=“ja”;  s2="va"  s3 ,s4,s5 指向的是同一个对象="java"
在堆中:

如果s3.s4指向同一对象,那为什么s3==s4为false?
回复 使用道具 举报
张迁 发表于 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的引用呢?
回复 使用道具 举报

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下来

评分

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

查看全部评分

回复 使用道具 举报
JinnyZh 发表于 2013-5-15 00:36
String s1 = "ja";                        //在常量池中创建一个对象"ja"
String s2 = "va";             ...

太详细了,十分感谢。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马