使用JAVA中的String检查ENUM值的相等性

时间:2015-04-02 12:27:01

标签: java enums equals tostring

我知道正确的方法是Days.MONDAY.name().equals(day)。但是我想知道为什么Days.MONDAY.equals(day)在打印星期一时失败了。

我知道我错过了equals()和toString()。我想清楚地知道它是什么。

String day = "MONDAY";
System.out.println("main().Days.MONDAY : " + Days.MONDAY); // Prints MONDAY
System.out.println("main().day : " + day);// Prints MONDAY

System.out.println("main().Days.MONDAY.equals(day) : " + Days.MONDAY.equals(day)); // Why is this false when below is OK.
System.out.println("main().Days.MONDAY.toString().equals(day) : " + Days.MONDAY.toString().equals(day));// This is true
System.out.println("main().Days.MONDAY.name().equals(day) : " + Days.MONDAY.name().equals(day)); // This is true and I know this is the correct way

编辑:这是枚举。

enum Days{
    MONDAY,TUESDAY,WEDENSDAY,THURSDAY,FRIDAY,SATURDAY,SUNDAY;
}

4 个答案:

答案 0 :(得分:4)

Enum的equals方法比较Enum的静态实例。因为Enum的任何表示都指向同一个对象实例。 所以Enum的equals方法不比较Name或toString它比较实例。

答案 1 :(得分:0)

String day="MONDAY";

以上行在常量池内创建Object,其中

public enum Days{
MONDAY  <-- Created in HEAP
}

现在来

Days.MONDAY.equals(day) --> Why False ?
枚举的

equals()方法将Enum的实例与data String#equals()的实例进行比较!!

Days.MONDAY.toString().equals(day) --> Why true ?

因为String#equals()方法过载了!!

答案 2 :(得分:0)

看看is-it-ok-to-use-on-enums-in-java。基于此,Java在Enum上的equals实现只执行==。由于Enum和示例中的String day不是同一个对象,因此返回false。

答案 3 :(得分:0)

班级Object的方法有严格定义的合同。

其中一种方法是Object.equals()方法 - 此处为its documentation

为了能够维持对称性要求,除非被比较的两个对象属于同一类,否则实际上不可能在true的任何实现中返回equals()equals()应该表示它们的属性之间的某种等价物,但不属于同一类的对象不具有相同的属性。

请勿将Days对象Days.MONDAYDays.MONDAY.toString()返回的字符串混淆。它的toString()只返回一个表示它的字符串,两个字符串是可以相等的对象。但Days.MONDAY.toString() 对象本身(尝试Days.MONDAY.equals( Day.MONDAY.toString() ),你也会在这里弄错!

当您将对象发送到print()println() System.out或其他任何PrintWriter方法时,print()会将该对象发送给该对象toString()值并打印出来。这就是为什么他们打印相同的东西&#34;。它实际上不是MONDAY对象被打印(很难定义&#34;打印对象&#34;),它是字符串{{1}那是从"MONDAY"方法返回的。

即使toString()不是枚举而是其他一些不是字符串的对象,所有这一切都会成立,但在枚举的特定情况下,它的Days方法确实是比较引用而不是属性。