2011-08-04 153 views
-3

可能重复:
Java String.equals versus ==比较Java字符串用==

是否有可能使用==操作符来比较Java字符串?

为什么我经常看到用equals()方法代替?

是因为当与字面字符串(如“你好”)比较使用==并不意味着调用equals()?

+5

http://stackoverflow.com/questions/767372/java-string-equals-versus – Johan

+0

只要注意,有时==可能成功为两个不同的字符串变量,这是因为实习方法导致他们都参考相同的实际对象的内存。 – Steven

+1

如果你的谷歌“java字符串比较”,你会发现任何数量的明确解释,包括在这个网站上的一些。 – NPE

回答

5

没有定制运营商在java中过载。 [所以不能过载它来调用的equals()]

了equals()确保你检查2个对象是相同的,而==检查这是否是完全相同的对象。 [所以不,使用==不会调用equals()]。

+0

有没有**自定义**运算符重载。 Java语言重载了一些运算符('+'可以表示数字加法或字符串连接,'|'可以表示按位OR或逻辑非快捷键OR)。 –

+0

@Joachim:同意,我认为OP对自定义运算符重载感兴趣,所以我没有明确提及它。感谢您的评论。我编辑了我的答案。 – amit

2

==检查两个对象是否引用同一个对象实例,而equals()检查这两个对象是否实际上等价,即使它们不是相同的实例。

2

不,这是不可能的,因为==你比较对象引用,而不是字符串(您需要使用等于)的内容。

1

要在@ Amit的答案扩大,操作符==只应在值类型(int,double等)的字符串是一个引用类型,因此,应与.equals()方法相比,使用。在引用类型检查在Java引用平等使用==操作符(意思是两个对象引用指向同一个内存位置。)

1

String是一个class.So如果您尝试比较其对象的字符串抱着你不能使用==,因为它是寻找一个object.For比较,你必须使用对象的内容的字符串值等于

1

==操作符比较字符串对象引用,而String.equals方法检查用于对象引用+对象值。而且,String.equals方法inturn在其实现中使用==运算符。

1

从我所知道的'=='运算符是用来检查对象是否相同。
可能的比较字符串可能具有相同的值(字符等),但事实上是两个完全不同的对象,因此会导致比较错误。

2

在Java中,您不能重载运算符。 ==运算符确保身份相等。另一方面,equals(...)方法可以被覆盖以进行类型特定的比较。

这里的代码片段演示:

String a = "abcdef"; 
String b = a; 
String c = new String(a); 

println(a == b); // true 
println(a.equals(b)); // true 

println(a == c); // false 
println(a.equals(c)); // true 

的一个复杂因素是你需要关心空,也equals(...)。所以,正确的空安全的成语是:

(a == null ? b == null : a.equals(b)) 

这是一个循环,你不必通过跳跃中说C#

0

正如阿米特已经说过,==检查是相同的对象,而equals()检查相同的内容(好的,基本实现等于==,但String覆盖此内容)。

注:

"Hello" == "Hello" //most probably would be true 
"Hello".equals("Hello") //will be true 

String s1, s2; //initialize with something different than a literal, e.g. loading from a file, both should contain the same string 
s1 == s2 //most probably will NOT be true 
s1.equals(s2) //will be true, if both contain the same string, e.g. "Hello" 

除此之外,同样适用于原语的对象封装,例如真

Long l1 = 1L; 
Long l2 = 1L; 
l1 == l2 //will most likely be true for small numbers, since those literals map to cached instances 
l1.equals(l2) //will be true 

new Long(1) == new Long(1) //will NOT be true 
new Long(1).equals(new Long(1)) //will be true 
+0

-1:'1L'是原始'long',1L.equals(1L)是无效的Java语法(对基本类型的方法调用没有装箱)[好吧,如果我达到125的声望,我会投下它:P] – pmnt

+0

@pmnt你是对的,更新了答案。 – Thomas

1

==如果内存地址在两侧都相等,除基本类型外,则返回true。

等于应该用在不是原语的所有东西上。主要部分的类。

0

==运算符检查对象的位模式而不是这些对象的内容,但等于函数比较对象的内容。

String str1=new String("abc"); 
String str2=new String("abc"); 

System.out.println(str1 == str2);将返回false,因为str1和str2是用“new”创建的不同对象。 System.out.println(str1.equals(str2))将返回true,因为equals()会检查对象的内容。