Итак, я слышал, что если я сравню 2 строки с ==, тогда я вернусь только назад, если они оба относятся к одному и тому же объекту/экземпляру. Это строки. Как насчет булевых?
Проверяет ли == для полного равенства в булевых? - Ява
Ответ 1
Проверяет ли == для полного равенства в булевых? - Java
Это зависит от того, говоришь ли вы о Boolean
(обертка объекта, обратите внимание на капитал B
) или Boolean
(примитив, обратите внимание на нижний регистр B
). Если вы говорите о Boolean
(обертка объекта), как и для всех объектов, ==
проверяет идентификатор, а не эквивалентность. Если вы говорите о Boolean
(примитивах), он проверяет эквивалентность.
Итак:
Boolean a, b;
a = new Boolean(false);
b = new Boolean(false);
System.out.println("a == b? " + (a == b)); // "a == b? false", because they're not the same instance
Но
boolean c, d;
c = false;
d = false;
System.out.println("c == d? " + (c == d)); // "c == d? true", because they're primitives with the same value
Относительно строк:
Я слышал, что если я сравню 2 строки с ==, тогда я вернусь только назад, если строки будут одинаковыми, и оба они относятся к одному и тому же объекту/экземпляру...
Это не действительно "и": ==
будет только проверять, ссылаются ли две переменные String
на один и тот же экземпляр String
. Конечно, один экземпляр String
может иметь только один набор содержимого, поэтому, если обе переменные указывают на один и тот же экземпляр, естественно, содержимое одного и того же...:-) Ключевым моментом является то, что ==
сообщит false
для разных экземпляров String
, даже если они имеют одинаковые символы в том же порядке. Поэтому мы используем equals
для них, а не ==
. Строки могут немного запутываться из-за intern
ing, который специфичен для строк (нет эквивалента для Boolean
, хотя, когда вы используете Boolean.valueOf(boolean)
, вы получите кешированный объект). Также обратите внимание, что Java не имеет примитивных строк, например примитивных Boolean
, int
и т.д.
Ответ 2
Если у вас есть значение Использования объекта, когда вы не можете запускать такие вещи. (Кэш VM для примитивов с автобоксированием)
public static void main(String[] args){
Boolean a = true;
Boolean b = true;
System.out.println(a == b);
a = new Boolean(true);
b = new Boolean(true);
System.out.println(a == b);
}
выход TRUE и FALSE
Ответ 3
Это зависит, если вы говорите о типах значений, таких как: int
, boolean
, long
или о ссылочных типах: Integer
, boolean
, long
. типы значений можно сравнить с ==
, ссылочные типы должны сравниваться с equals
.
Ответ 4
При использовании (==) с логическими значениями,
-
Если один из операндов является булевой оболочкой, то он сначала распаковывается в булев примитив и сравниваются оба.
-
Если оба являются булевыми обертками, созданными с ключевым словом "new", то их ссылки сравниваются так же, как и в случае других объектов.
new Boolean("true") == new Boolean("true")
- false -
Если оба являются логическими оболочками, созданными без ключевого слова "new",
Boolean a = false; Boolean b = Boolean.FALSE; // (a==b) return true