【问题标题】:Enum <-> String comparison in JAVAJAVA中的枚举<->字符串比较
【发布时间】:2014-03-11 09:52:35
【问题描述】:

我想将StringEnum 进行比较。我知道如何正确进行比较,但我不明白为什么。我的以下示例显示了我的问题:

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+"'");

输出是:

枚举是否等于字符串?:假
enum.toString() 是否等于字符串?:true
枚举“TEST1”的值和字符串“TEST1”的值

我知道在System.println() 中使用Enum.toString() 时,它被称为隐式,但与第二行中的equals() 相比,我不明白Enum 用作值是什么。 Foo.TEST1 是用作Integer 还是其他什么,JAVA 在内部做什么?

【问题讨论】:

    标签: java string enums compare


    【解决方案1】:

    String#equals(Object) 方法首先检查传递的参数是否是String 的实例。这是源代码的sn-p:

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            // Code [...]
        }
        return false;
    }
    

    由于Foo.TEST1 不是String 的实例,它返回false

    【讨论】:

    • 谢谢你的解释,现在我明白了我的情况的平等方法
    【解决方案2】:

    问。我想比较一个字符串和一个枚举

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多