Enum< - > JAVA中的字符串比较

时间:2014-03-11 09:52:35

标签: java string enums compare

我想将StringEnum进行比较。我知道如何正确地进行比较,但我不明白为什么。我的以下示例显示了我的问题:

enum Foo{
    TEST1
}

String likeEnumTest1 = "TEST1";
System.out.println("Is enum equal string?: " + likeEnumTest1.equals(Foo.TEST1));
System.out.println("Is enum.toString() equal string?: " + likeEnumTest1.equals(Foo.TEST1.toString()));
System.out.println("Value of enum '" + Foo.TEST1 + "' and value of string '" + likeEnumTest1+"'");

输出结果为:

  

枚举是否等于字符串?:false
  enum.toString()是否等于字符串?:true
  枚举'TEST1'的值和字符串'TEST1'的值

我了解Enum.toString()System.println()中使用时会隐式调用Enum,但我不明白equals()Foo.TEST1中使用的Integer相比第二行。将JAVA用作{{1}}或其他任何内容,{{1}}在内部执行什么操作?

2 个答案:

答案 0 :(得分:8)

String#equals(Object)方法首先检查传递的参数是否是String的实例。这是源代码的片段:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        // Code [...]
    }
    return false;
}

由于Foo.TEST1不是String的实例,因此会返回false

答案 1 :(得分:3)

  

Q值。我想比较一个String和一个Enum

Enum提供了name()方法。您需要使用它来将enum对象与String进行比较,因为equals()方法检查参数是否为String实例。因为它不是,它会返回false

likeEnumTest1.equals(Foo.TEST1.name())

这可以从source code of equals() of String class

中看出
public boolean equals(Object anObject) { // It takes an object and even enum is an object, thus it doesn't call the `toString()` method.
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        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;
}