错误修订:SCJP认证套题解析之二第40题

王朝java/jsp·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

40:

String s= "hello";

String t = "hello";

char c[] = {'h','e','l','l','o'} ;

Which return true?

A. s.equals(t);

B. t.equals(c);

C. s==t;

D. t.equals(new String("hello"));

E. t==c.

(acd)

题目:哪些返回true。

这个在前面第10题的equals()方法和==操作符的讨论中论述过。==操作符比较的是操作符两端的操作数是否是同一个对象,而String的equals()方法比较的是两个String对象的内容是否一样,其参数是一个String对象时才有可能返回true,其它对象都返回假。需要指出的是由于s和t并非使用new创建的,他们指向内存池中的同一个字符串常量,因此其地址实际上是相同的(这个可以从反编译一个简单的测试程序的结果得到,限于篇幅不列出测试代码和反编译的分析),因此答案c也是正确的。

(文章原来漏选答案C,现在增加并修改分析),以下是测试代码和反编译分析:

public class Tests

{

public static void main(String[] args)

{

String s= "hello";

String t = "hello";

if (s.equals(t)) {

System.out.println("Hello World!");

}

}

}

反编译的关键摘录:

Method void main(java.lang.String[])

0 ldc #2 <String "hello">

2 astore_1

3 ldc #2 <String "hello">

5 astore_2

6 aload_1

从标记为0和3的两条可以看出s和t指向的内存地址相同,程序运行结果也证明此结论。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有  導航