Я новичок в JAVA и проходил через оператора равенства. Попробовав несколько комбинаций операндов, я немного смущен относительно того, что именно является определением совместимых операндов для оператора равенства (==) в Java.
int x = 23;
if (x == 23.3f) { // compiler accepts it. (may be because both are primitives)
int x = 23;
Double d = new Double(23.3);
if (x == d) { // compiler accepts it. (may be compatible pair of primitive and object reference)
int x = 23;
String s = "hello";
if (x == s) // compiler throws error - incompatible operands for == operator.
Итак, мне кажется, должно быть какое-то формальное определение совместимых операндов для оператора равенства. Пожалуйста, помогите мне в разъяснении этого сомнения.
Компилятор принимает его, потому что x
и 23.3f
имеют примитивные числовые типы. И сравнение вернет false
.
Компилятор принимает это, потому что java unboxes Double
object для double
примитива при сравнении.
Компилятор не может принять его, потому что x
является примитивным числовым типом, а s
является ссылкой на экземпляр класса String
. Невозможно сопоставить номер примитива и ссылку на объект.
Autoboxing (and unboxing) is the automatic conversion that the Java compiler makes between the primitive types and their corresponding object wrapper classes.
примеры типов примитивов и соответствующих классов-оболочек объектов: int
и Integer
, double
и Double
и т. д. Для сравнения, если один операнд является экземпляром класса-оболочки, а другой операнд является примитивным типом, то происходит распаковка. Более того, если оба операнда являются экземплярами класса-оболочки, то есть Integer, тогда java сравнивает значения этих объектов, а не ссылок.
Для
int x = 23;
if (x == 23.3f)
Если вы посмотрите на байтовый код с помощью javap -v
, int
будет преобразован в float
. т.е. i2f
будет вызываться, а затем они будут сравниваться как 2 значения float с использованием fcmpl
.
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 23
2: istore_1
3: iload_1
4: i2f // The line of interest. Converts int to float.
5: ldc #16; //float 23.3f
7: fcmpl // compare two floats
8: ifne 11
11: return
В третьем случае вы сравниваете примитив с объектом (String), что невозможно.
Строки - это объекты. ==
сравнивает объекты по ссылке, а не по их внутреннему значению. Все остальные (int, double)
сравниваются в ==
помощью ссылок на объекты, поэтому в случае строки они не соответствуют так для строки, мы должны .equals
u .equals
java чувствителен к регистру, поэтому, сравнивая строку u, необходимо позаботиться о Case of strings
string
.equals
. и в вашем последнем,if
ясно, что они несовместимы, потому что вы пытаетесь сравнить Object (String) с примитивным типом (int, long, double ...)