比较Java枚举成员:==或equals()?推荐| Java Debug 笔记

3,608 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看活动链接

提问:比较Java枚举成员:==或equals()?

我知道Java枚举被编译为具有私有构造函数和一堆公共静态成员的类。比较给定枚举的两个成员时,我一直使用.equals(),例如

public useEnums(SomeEnum a)
{
    if(a.equals(SomeEnum.SOME_ENUM_VALUE))
    {
        ...
    }
    ...
}

但是,我遇到了一些使用equals运算符==而不是.equals()的代码:

public useEnums2(SomeEnum a)
{
    if(a == SomeEnum.SOME_ENUM_VALUE)
    {
        ...
    }
    ...
}

我应该使用哪个运算符?

高分回答:

很多的知识点,真的需要写出来才会掌握!!! \color{purple}很多的知识点,真的需要写出来才会掌握!!!{~}

可以==使用enum吗?

是的:枚举具有严格的实例控件,可==用于比较实例。这是语言规范

文章翻译自 am2dgbqfb6mk75jcyanzabc67y-ac4c6men2g7xr2a-stackoverflow-com.translate.goog/questions/1…

作者建议:相同的枚举值作比较是都可以的,但是需要注意==与equals的区别

因为很多同学问,我这里贴一份嵌套枚举的代码:如何从Java中的字符串值获取枚举值?

public enum SaasApiEnum {

    /**
     * 企业创建
     */
    ORG_CREATE("企业创建", SaasApi.ORG_CREATE),

    ;
    SaasApiEnum(String name, String api) {
        this.name = name;
        this.api = api;
    }

    /**
     * 接口名
     */
    private final String name;
    /**
     * 接口地址
     */
    private final String api;

    /**
     * 枚举映射,快速解析用,key为枚举name()
     */
    private static final Map<String, SaasApiEnum> MAPPINGS = new HashMap<>(64);

    static {
        for (SaasApiEnum anEnum : values()) {
            MAPPINGS.put(anEnum.api, anEnum);
        }
    }

    /**
     * 解析给定的接口地址为当前枚举类型
     *
     * @param api 接口地址
     * @return 对应的枚举,or null if not found
     */
    public static SaasApiEnum resolve(String api) {
        return (api != null ? MAPPINGS.get(api) : null);
    }

    public String getName() {
        return name;
    }

    public String getApi() {
        return api;
    }
}

在枚举中我们可以设置属性,如果属性是Interger的,那么我们在使用==可能就会出现问题。

Integer正确的比较方法用equals.

[-128,127]之间,用==符号来比较Integer的值,是相等的


private static class IntegerCache {
       static final int low = -128;
       static final int high;
       static final Integer cache[];

       static {
           // high value may be configured by property
           int h = 127;
           String integerCacheHighPropValue =
               sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
           if (integerCacheHighPropValue != null) {
               try {
                   int i = parseInt(integerCacheHighPropValue);
                   i = Math.max(i, 127);
                   // Maximum array size is Integer.MAX_VALUE
                   h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
               } catch( NumberFormatException nfe) {
                   // If the property cannot be parsed into an int, ignore it.
               }
           }
           high = h;

           cache = new Integer[(high - low) + 1];
           int j = low;
           for(int k = 0; k < cache.length; k++)
               cache[k] = new Integer(j++);

           // range [-128, 127] must be interned (JLS7 5.1.7)
           assert IntegerCache.high >= 127;
       }

       private IntegerCache() {}
   }

这是Integer的静态内部类,在Integer类装入内存中时,会执行其内部类中静态代码块进行其初始化工作,做的主要工作就是把 [-128,127]之间的数包装成Integer类并把其对应的引用存入到cache数组中,这样在方法区中开辟空间存放这些静态Integer变量,同时静态cache数组也存放在这里,供线程享用,这也称静态缓存。我们知道在Java的对象是引用的,所以当用Integer 声明初始化变量时,会先判断所赋值的大小是否在-128到127之间,若在,则利用静态缓存中的空间并且返回对应cache数组中对应引用,存放到运行栈中,而不再重新开辟内存。

		Integer a =127;
		Integer b =127;
		System.out.println(a==b);  // true
		a=128;
		b=128;
		System.out.println(a==b); // false

作者常用: equals.

欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!! \color{red}欢迎关注我的专栏StackOverFlow,我会筛选优质的问答,面试常考!!!{~}

有最新、优雅的实现方式,我也会在文末写出我对本问答的见解 \color{red}有最新、优雅的实现方式,我也会在文末写出我对本问答的见解{~}

真心感谢帅逼靓女们能看到这里,如果这个文章写得还不错,觉得有点东西的话

求点赞👍 求关注❤️ 求分享👥 对8块腹肌的我来说真的 非常有用!!!

如果本篇博客有任何错误,请批评指教,不胜感激 !❤️❤️❤️❤️