黑马程序员技术交流社区

标题: 字符串问题 [打印本页]

作者: yaohsieh    时间: 2014-1-15 23:37
标题: 字符串问题
单选:编译并运行以下代码的输出结果是?(  ) 答案是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

作者: 高亮亮    时间: 2014-1-16 00:46
本帖最后由 高亮亮 于 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.

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


作者: 黄晓鑫    时间: 2014-1-16 00:53
A 字符串一旦初始化值就不会被改变
作者: yaohsieh    时间: 2014-1-16 01:16
高亮亮 发表于 2014-1-16 00:46
字符串在某些情况相当特殊.
这道题相当面熟,楼主传智的吧~
上课老师也说过这题目.

这句“jvm又不知道你操作结果会是什么,他怎么会未卜先知的去找他不知道的东西呢?”回答给力!透彻!
哈哈,咱一个班,亮哥是真学霸。
作者: mrwise1991    时间: 2014-1-16 10:47
不错,s2和s3这两个引用所指向的内容都是arit,但是他们指向的地址值不同,而==这个符号比较的是对象的引用地址值




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