Java中的equals方法

3

我已经阅读了有关Java中equals()方法的相关信息。我听说它只是基于值进行比较。但是,为什么在下面这个例子中,值相同但类型不同时,它返回false呢?

public class test {
    public static void main(String[] args) 
    {
        String s1="compare";
        StringBuffer s2=new StringBuffer("compare");
        System.out.println(s1.equals(s2));  //false 
    }
}

8
你的实际问题是询问你的苹果S1是否等同于香蕉S2。 - Dragondraikk
4个回答

11

一个 String 实例不能等于一个 StringBuffer 实例。

看一下实现:

public boolean equals(Object anObject) {
if (this == anObject) {
    return true;
}
if (anObject instanceof String) { // this condition will be false in your case
    String anotherString = (String)anObject;
    int n = count;
    if (n == anotherString.count) {
    char v1[] = value;
    char v2[] = anotherString.value;
    int i = offset;
    int j = anotherString.offset;
    while (n-- != 0) {
        if (v1[i++] != v2[j++])
        return false;
    }
    return true;
    }
}
return false;
}

理论上,您可以有一个equals实现,当比较两个不属于相同类别的对象时(不适用于String类),它可能返回true,但我无法想象这样的实现在什么情况下是有意义的。


3

StringStringBuffer不同。使用toString()将其转换为String

String s1="compare";
StringBuffer s2=new StringBuffer("compare");
System.out.println(s1.equals(s2.toString())); 

0

equals()方法属于Object

来自Java docs for Object

指示某个对象是否“等于”此对象。

基本上:

类Object的equals方法实现了对象上最具有区别性的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一个对象(x == y的值为true)时,此方法返回true。

如果你有一个String和一个StringBuffer,它们彼此不相等。

它们可能具有相同的值,但它们并不相等,请查看instanceOf()方法。


好的,那么为什么它返回true。字符串str="compare";字符串str1=new String("compare");System.out.println(str.equals(str1)); - Yashwant Singh
因为它们都是“String”,所以“StringBuffer”是一个不同的类。 - MrHaze

0

是的,Eran是正确的,你不能使用equals比较两个不同的对象。如果你真的想这样做,那么就在StringBuffer上使用toString()

System.out.println(s1.equals(s2.toString()));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接