15.21 Операторы равенства
Операторы равенства синтаксически левоассоциативны (они группируются слева направоверно), но этот факт по сути никогда не бывает полезным;например, a == b == c анализируется как (a == b) == c.Тип результата a == b всегда логический, и поэтому c должен иметь тип логический, иначе произойдет ошибка времени компиляции.Таким образом, a == b == c не проверяет, равны ли все a, b и c.
EqualityExpression: RelationalExpression EqualityExpression == RelationalExpression EqualityExpression! = RelationalExpression The == (равно) иоператоры! = (не равные) аналогичны операторам отношений, за исключением их более низкого приоритета.Таким образом, a
Во всех случаях a! = B дает тот же результат, что и! (A == b).Операторы равенства являются коммутативными, если выражения операндов не имеют побочных эффектов.
15.21.1 Операторы числового равенства == и! =
Если оба операнда оператора равенства имеют числовой тип,или один имеет числовой тип, а другой может быть преобразован (§5.1.8) в числовой тип, двоичные числовые преобразования выполняются над операндами (§5.6.2).Если повышенный тип операндов - int или long, то выполняется тест на целочисленное равенство;если повышенный тип является float или double, то выполняется тест на равенство с плавающей точкой.Обратите внимание, что двоичное числовое продвижение выполняет преобразование набора значений (§5.1.13) и преобразование распаковки (§5.1.8).Сравнение выполняется точно по значениям с плавающей точкой, независимо от того, из каких наборов значений были получены их представляющие значения.
Тестирование на равенство с плавающей точкой выполняется в соответствии с правилами стандарта IEEE 754:
Если любой из операндов равен NaN, то результат == равен false, а результат! = Равен true.Действительно, тест x! = X верен тогда и только тогда, когда значение x равно NaN.(Методы Float.isNaN и Double.isNaN также могут использоваться для проверки, является ли значение NaN.) Положительный ноль и отрицательный ноль считаются равными.Следовательно, -0.0 == 0.0 верно, например.В противном случае два различных значения с плавающей точкой считаются неравными операторами равенства.В частности, есть одно значение, представляющее положительную бесконечность, и одно значение, представляющее отрицательную бесконечность;каждый сравнивает равный только сам по себе, и каждый сравнивает неравный со всеми другими значениями.С учетом этих соображений для чисел с плавающей запятой следующие правила сохраняются для целочисленных операндов или для операндов с плавающей запятой, отличных от NaN: значение, создаваемое оператором ==, равно true, если значение левого операнда равнозначение правого операнда;в противном случае результат ложен.Значение, созданное оператором! =, Равно true, если значение левого операнда не равно значению правого операнда;в противном случае результат ложен.15.21.2 Булевы операторы равенства == и! =
Если оба операнда оператора равенства имеют тип boolean, или если один операнд имеет тип boolean, а другой - тип Boolean, то операция выполняетсябулево равенство.Операторы булевого равенства ассоциативны.Если один из операндов имеет тип Boolean, он подвергается преобразованию без распаковки (§5.1.8).
Результат == равен true, если операнды (после любого требуемого преобразования без распаковки) оба имеют значение true или обаложный;в противном случае результат равен false.
Результат! = равен false, если оба операнда имеют значение true или оба имеют значение false;в противном случае результат верен.Таким образом! = Ведет себя так же, как ^ (§15.22.2), когда применяется к булевым операндам.
15.21.3 Справочные операторы равенства == и! =
Если операнды оператора равенстваоба имеют либо ссылочный тип, либо нулевой тип, тогда операция является объектным равенством.КомпОшибка времени простоя возникает, если невозможно преобразовать тип одного операнда в тип другого путем преобразования приведения (§5.5).Значения времени выполнения этих двух операндов обязательно будут неравными.
Во время выполнения результат == равен true, если значения обоих операндов равны нулю или оба ссылаются на один и тот же объект или массив;в противном случае результат равен false.
Результат! = равен false, если оба значения операнда равны нулю или оба ссылаются на один и тот же объект или массив;в противном случае результат равен true.
Хотя == может использоваться для сравнения ссылок типа String, такой тест на равенство определяет, ссылаются ли два операнда на один и тот же объект String.Результат равен false, если операнды являются различными объектами String, даже если они содержат одинаковую последовательность символов.Содержимое двух строк s и t можно проверить на равенство с помощью вызова метода s.equals (t).См. Также §3.10.5.