我知道正确的方法是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;
}
答案 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.MONDAY
与Days.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
方法确实是比较引用而不是属性。