2015-04-02 162 views
0

我知道正确的方法是Days.MONDAY.name().equals(day)。但我想知道为什么Days.MONDAY.equals(day)都打印MONDAY时失败。使用JAVA中的字符串检查ENUM值的相等性

我知道我错过了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; 
} 
+2

你正在比较一个字符串与一个枚举 - 它们不能相等... – assylias 2015-04-02 12:30:05

+1

On'System.out.println(“main()。Days.MONDAY:”+ Days.MONDAY);'隐式'调用Days.MONDAY.toString()方法。 – SubOptimal 2015-04-02 12:30:19

回答

4

Enum的equals方法比较Enum的Static实例。因为Enum的任何表示都指向同一个对象实例。 因此,Enum的equals方法不会比较Name或toString,它会比较实例。

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()超载的方法!!

0

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

0

Object类的方法有一个严格定义的合同。

其中一种方法是Object.equals()方法 - 这里是its documentation

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

请勿混淆Days对象Days.MONDAY与从Days.MONDAY.toString()返回的字符串。它的toString()只是返回一个表示它的字符串,而两个字符串是可以相等的对象。但是Days.MONDAY.toString()对象本身(尝试Days.MONDAY.equals(Day.MONDAY.toString()),你就会得到假这里呢!

当发送对象的System.outprint()println()方法或任何其他PrintWriterprint()将这个对象的toString()价值和打印它,这就是他们“打印相同的东西”的原因。它实际上并不是正在打印的MONDAY对象(很难定义“打印对象”),而是从其toString()方法返回的字符串"MONDAY"

即使Days不是一个枚举,但其他一些对象不是一个字符串,尽管在枚举的特定情况下,它的equals()方法实际上是引用而不是属性的比较,所有这些都将保持为真。