我想将String
与Enum
进行比较。我知道如何正确地进行比较,但我不明白为什么。我的以下示例显示了我的问题:
enum Foo{
TEST1
}
String likeEnumTest1 = "TEST1";
System.out.println("Is enum equal string?: " + likeEnumTest1.equals(Foo.TEST1));
System.out.println("Is enum.toString() equal string?: " + likeEnumTest1.equals(Foo.TEST1.toString()));
System.out.println("Value of enum '" + Foo.TEST1 + "' and value of string '" + likeEnumTest1+"'");
输出结果为:
枚举是否等于字符串?:false
enum.toString()是否等于字符串?:true
枚举'TEST1'的值和字符串'TEST1'的值
我了解Enum.toString()
在System.println()
中使用时会隐式调用Enum
,但我不明白equals()
与Foo.TEST1
中使用的Integer
相比第二行。将JAVA
用作{{1}}或其他任何内容,{{1}}在内部执行什么操作?
答案 0 :(得分:8)
String#equals(Object)
方法首先检查传递的参数是否是String
的实例。这是源代码的片段:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
// Code [...]
}
return false;
}
由于Foo.TEST1
不是String
的实例,因此会返回false
。
答案 1 :(得分:3)
Q值。我想比较一个String和一个Enum
Enum提供了name()
方法。您需要使用它来将enum
对象与String
进行比较,因为equals()
方法检查参数是否为String
实例。因为它不是,它会返回false
。
likeEnumTest1.equals(Foo.TEST1.name())
这可以从source code of equals() of String class
中看出public boolean equals(Object anObject) { // It takes an object and even enum is an object, thus it doesn't call the `toString()` method.
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}