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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© yaohsieh 中级黑马   /  2014-1-15 23:37  /  975 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

单选:编译并运行以下代码的输出结果是?(  ) 答案是A,为啥选A不选D呢?两个都是"arit",不是从字符串常量池拿么?
String s1 = new String("amit");
System.out.println(s1.replace('m','r'));
System.out.println(s1);
String s3 = "arit";
String s4 = "arit";
String s2 = s1.replace('m','r');
System.out.println(s2 == s3);
System.out.println(s3 == s4);

A.        
arit
amit
false
true

B.        
arit
arit
false  
true

C.
amit
amit
false
true

D.
arit
amit
true
true

评分

参与人数 1黑马币 +1 收起 理由
黄晓鑫 + 1 很给力!

查看全部评分

4 个回复

倒序浏览
本帖最后由 高亮亮 于 2014-1-16 00:48 编辑

字符串在某些情况相当特殊.
这道题相当面熟,楼主传智的吧~
上课老师也说过这题目.

String s2 = s1.replace('m','r');
String s3 = "arit";
System.out.println(s2 == s3);
这里的s3,因为之前的代码在执行过程中,没有字符串的常量池中拼出来"arit"的字符串,所以这里的操作是在字符串常量池拼一个"arit",然后将这个字符串常量赋值给s3.
而s2,是用s1的"amit"将'm'字符,用'i'字符替换.这里的具体操作时先在字符串常量池中声明一个字符串对象,然后将"amit"进行replace操作,随后得到的"arit"结果放入这个之前声明的对象.这个过程中,jvm根本就不会找常量池中有没有跟这个结果一样的字符串常量.  因为你想,jvm又不知道你操作结果会是什么,他怎么会未卜先知的去找他不知道的东西呢?他可不是我们智慧的人类~
好了,所以,比较结果为false.

日回一帖,睡到坑爹~睡觉了

评分

参与人数 1黑马币 +1 收起 理由
yaohsieh + 1 很给力!

查看全部评分

回复 使用道具 举报
A 字符串一旦初始化值就不会被改变
回复 使用道具 举报
高亮亮 发表于 2014-1-16 00:46
字符串在某些情况相当特殊.
这道题相当面熟,楼主传智的吧~
上课老师也说过这题目.

这句“jvm又不知道你操作结果会是什么,他怎么会未卜先知的去找他不知道的东西呢?”回答给力!透彻!
哈哈,咱一个班,亮哥是真学霸。
回复 使用道具 举报
不错,s2和s3这两个引用所指向的内容都是arit,但是他们指向的地址值不同,而==这个符号比较的是对象的引用地址值
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马