Сравнение элементов перечисления Java: == или equals()? Рекомендуем | Примечания по отладке Java

Java

Эта статья участвует в "Месяце тем Java - Заметки по отладке Java", подробности см.Ссылка на мероприятие

Вопрос: Сравнение элементов перечисления Java: == или equals()?

Я знаю, что перечисления Java скомпилированы как классы с частными конструкторами и кучей общедоступных статических членов. Я всегда использовал .equals() при сравнении двух членов данного перечисления, например.

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

Однако я столкнулся с кодом, в котором используется оператор равенства == вместо .equals():

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

Какой оператор мне использовать?

Высокий балл ответа:

Много очков знаний, действительно нужно написать, чтобы освоить!!! \color{purple}Много очков знаний, вам действительно нужно их записать, чтобы стать мастером!!!{~}

Может ли == использовать перечисление?

Да: перечисления имеют строгий контроль экземпляров, == можно использовать для сравнения экземпляров. Это спецификация языка

Статья переведена сАминь 2 несколько ярлыков соответственно 6 дорвей 75 колит стал 67 там-АС4 из 6, 2, 7, очевидно 2 ай-переполнение стека-ком.перевод.о боже/вопросы/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 использует равенство.

Между [-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 и сохраните соответствующую ссылку в массиве кеша, чтобы в области методов было открыто пространство для хранения этих статических переменных Integer, а также статический массив кеша хранится здесь для использования потоком, который также называется статическим кеш. Мы знаем, что объекты в Java являются ссылками, поэтому при использовании Integer для объявления переменной инициализации он сначала определит, находится ли назначенный размер в диапазоне от -128 до 127. Если это так, используйте пространство в статическом кеше и верните соответствующий массив кеша. Соответствующая ссылка сохраняется в работающем стеке без повторного открытия памяти.

		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, я буду выбирать качественные вопросы и ответы и часто брать интервью!!!{~}

Есть новейшие и элегантные методы реализации, и я также напишу свое мнение по этому Q&A в конце статьи.\color{red} имеет самую последнюю и элегантную реализацию, и я также напишу свое мнение об этом вопросе и ответе в конце статьи{~}

Искренне благодарю красивых и красивых девушек за то, что смогли это увидеть.Если эта статья будет хорошо написана, если вы почувствуете, что есть что-то

Ставьте лайк 👍 Подписывайтесь ❤️ Делитесь 👥 Мне очень полезно с 8 пакетами пресса! ! !

Если в этом блоге есть какие-либо ошибки, пожалуйста, критикуйте и советуйте, это очень ценится! ❤️❤️❤️❤️