和风细雨

世上本无难事,心以为难,斯乃真难。苟不存一难之见于心,则运用之术自出。

字符串比较 ==与equals辨析

字符串比较

字符串比较是java程序常遇到的问题,新手常用==进行两个字符串比较,实际上这时进行的地址比较,不一定会返回正确结果.在java中,正确的进行字符串比较的函数String类的equals()函数,这才是真正的值比较.

==的真正意义

Java中,==用来比较两个引用是否指向同一个内存对象.对于String的实例,运行时JVM会尽可能的确保任何两个具有相同字符串信息的String实例指向同一个内部对象,此过程称为”驻留”(interning),但它不助于每个String实例的比较.一个原因是垃圾收集器删除了驻留值,另一个原因是String所在的位置可能被别的String实例所取代.这样的话,==将不会返回预想的结果.
下页的示例说明了这个问题:

==和equals比较的示例


String str1,str2,str3;

str1
="Andy";

str2
=str1;

if(str1==str2){
System.out.println(
"str1,str2地址相等");
}

if(str1.equals(str2)){
System.out.println(
"str1,str2值相等");
}


str2
=“Andy”;
if(str1==str2){
System.out.println(
"str1,str2通常地址相等");
}

if(str1.equals(str2)){
System.out.println(
"str1,str2值一定相等");
}


str3
=new String("Andy");
if(str1==str3){
System.out.println(
"str1,str3地址相等");
}

else{
System.out.println(
"str1,str3地址不相等");
}


if(str1.equals(str3)){
System.out.println(
"str1,str3值一定相等");
}




结论

从上面的例子可以看出,==比较的是地址,在驻留机制的作用下,也许返回正确的结果,但并不可靠,这种不确定性会隐藏在阴暗的角落里,在你以为万事大吉时给你致命一击.
而equal始终进行值比较,它一定会返回正确的结果,无论在什么情况下.

我们应该记住:为了保证程序的正确,进行字符串比较时一定要使用equals,而一定不能使用==.

posted on 2008-03-03 22:38 和风细雨 阅读(752) 评论(0)  编辑  收藏 所属分类: J2SE


只有注册用户登录后才能发表评论。


网站导航: