[英]Check equality of a ENUM value with a String in JAVA
我知道正確的方法是Days.MONDAY.name().equals(day)
。 但是我不知道為什么當Days.MONDAY.equals(day)
都打印MONDAY時失敗。
我知道我缺少帶有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;
}
枚舉的equals方法比較枚舉的靜態實例。 因為Enum的任何表示都指向同一對象實例。 因此,Enum的equals方法不比較Name或toString,它比較實例。
String day="MONDAY";
上一行在Constant Pool中創建Object
,其中as
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()
方法,所以它被重載了!
看看可以在Java枚舉中使用它 。 基於此,Java在Enum上的equals實現僅執行==。 由於示例中的Enum和String day
不是同一對象,因此它返回false。
Object
類的方法具有嚴格定義的協定。
這些方法之一是Object.equals()
方法-這是其文檔 。
為了能夠保持對稱性要求,幾乎不可能在equals()
任何實現中都返回true
,除非要比較的兩個對象屬於同一類。 equals()
應該表示它們的屬性之間的某種等效形式,但是不屬於同一類的對象不具有相同的屬性。
不要將Days
對象Days.MONDAY
與Days.MONDAY.toString()
返回的字符串混淆。 它的toString()
僅返回表示它的字符串,並且兩個字符串是可以相等的對象。 但是Days.MONDAY.toString()
並不是對象本身(嘗試Days.MONDAY.equals( Day.MONDAY.toString() )
,您在這里也會得到錯誤!
當您將對象發送到System.out
或任何其他PrintWriter
的print()
或println()
方法時, print()
將采用該對象的toString()
值並進行打印。 這就是為什么他們“打印相同的東西”的原因。 實際上並不是要打印的MONDAY
對象(很難定義“打印對象”),而是從其toString()
方法返回的字符串"MONDAY"
。
即使Days
不是枚舉,而是不是字符串的其他對象,所有這一切都將成立,盡管在枚舉的特定情況下,其equals()
方法實際上是引用而不是屬性的比較。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.