在JAVA中检查枚举值与字符串的相等性

在JAVA中检查枚举值与字符串的相等性,java,enums,equals,tostring,Java,Enums,Equals,Tostring,我知道正确的方法是Days.MONDAY.name.equalsday。但我想知道为什么Days.MONDAY.equalsday在星期一打印时失败 我知道我错过了一些关于equals和toString的东西。我想清楚地知道是什么 String day = "MONDAY"; System.out.println("main().Days.MONDAY : " + Days.MONDAY); // Prints MONDAY System.out.println("main().day : "

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

我知道我错过了一些关于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方法比较枚举的静态实例。因为枚举的任何表示都指向同一对象实例。
因此,枚举的equals方法不是比较名称或字符串,而是比较实例。

枚举的equals方法比较枚举的静态实例。因为枚举的任何表示都指向同一对象实例。
String day="MONDAY";
因此,枚举的equals方法不是比较名称,也不是比较实例的toString

String day="MONDAY";
上面的行在常量池中创建对象,其中

public enum Days{
MONDAY  <-- Created in HEAP
}
Enum的equals方法比较Enum的实例,而不是Stringequals比较数据

因为它是重载的Stringequals方法

上面的行在常量池中创建对象,其中

public enum Days{
MONDAY  <-- Created in HEAP
}
Enum的equals方法比较Enum的实例,而不是Stringequals比较数据

因为它是重载的Stringequals方法

看看。基于此,Java在Enum上的equals实现只执行==。由于示例中的Enum和String day不是同一个对象,因此返回false。

请查看。基于此,Java在Enum上的equals实现只执行==。由于示例中的Enum和String day不是同一个对象,因此返回false。

类对象的方法具有严格定义的约定

其中一个方法是Object.equals方法-如下所示

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

不要将Days对象Days.MONDAY与Days.MONDAY.toString返回的字符串混淆。它的toString只返回一个表示它的字符串,两个字符串是可以相等的对象。但是Days.MONDAY.toString不是对象本身尝试Days.MONDAY.equals Day.MONDAY.toString,您在这里也会得到false

当您将对象发送到System.out或任何其他PrintWriter的print或println方法时,print将获取该对象的toString值并打印它。这就是为什么他们打印同样的东西。实际上,打印的不是MONDAY对象很难定义打印对象,而是从toString方法返回的字符串MONDAY

即使Days不是枚举,而是不是字符串的其他对象,所有这些都是正确的,尽管在枚举的特定情况下,它的equals方法实际上是引用的比较,而不是属性的比较。

类对象的方法有一个严格定义的约定

其中一个方法是Object.equals方法-如下所示

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

不要将Days对象Days.MONDAY与Days.MONDAY.toString返回的字符串混淆。它的toString只返回一个表示它的字符串,两个字符串是可以相等的对象。但是Days.MONDAY.toString不是对象本身尝试Days.MONDAY.equals Day.MONDAY.toString,您在这里也会得到false

当您将对象发送到System.out或任何其他PrintWriter的print或println方法时,print将获取该对象的toString值并打印它。这就是为什么他们打印同样的东西。实际上,打印的不是MONDAY对象很难定义打印对象,而是从toString方法返回的字符串MONDAY


即使Days不是枚举,而是其他非字符串的对象,所有这些都是正确的,尽管在枚举的特定情况下,其equals方法实际上是引用的比较,而不是属性的比较。

您正在将字符串与枚举进行比较-它们不能相等…在System.out.printlnmain.Days.MONDAY:+Days.MONDAY;隐式调用Days.MONDAY.toString方法。您正在将字符串与枚举进行比较-它们不能相等…在System.out.printlnmain.Days.MONDAY:+Days.MONDAY;隐式调用Days.MONDAY.toString方法。