这很经典,但写给谷歌没有给我点击。
我的代码:
Integer i = ..; // Sth is put from database.
if (i != 1) {
// do sth
} else {
// do not.
}
案例:
我知道这种比较不正确java
我应该比较一下:
if (i.intValue != 1) {}
或
if(!i.equals(1)) {}
但我的代码有第一个,我似乎从某个地方得到了真实,Integer
不是1,当它为1时,就会出现错误。
问题:
周围发生了什么?
答案 0 :(得分:3)
但是我的代码有第一个,我似乎从某个地方得到了真实,其中整数不是1而当它是1则出现错误。
如果我正确理解您的问题,以下内容可能会解释这种行为:
Integer i = 1;
Integer j = new Integer(1);
Integer k = Integer.valueOf(1);
System.out.println(i == j); // false
System.out.println(i == k); // true
换句话说,根据1
的构造方式,与Integer
进行比较时,您可以得到真或假。 Integer.valueOf
将重用对象,new Integer
则不会。
如果你确实与整数文字(或int
)进行了比较,那么任何Integer
都应该被编译器自动取消装箱,你永远不会有任何意外。
答案 1 :(得分:1)
编译器更改:
if (i != 1)
到
if(i.intValue()!=1)
答案 2 :(得分:1)
Autoboxing是Java编译器在基元类型和相应的对象包装类之间进行的自动转换。例如,将int转换为Integer,将double转换为Double,依此类推。如果转换采用另一种方式,则称为拆箱。
答案 3 :(得分:1)
if (i != 1)
,if (i.intValue != 1)
和if(!i.equals(1))
都相等,并返回相同的值。编译器将自动取消装箱i
,将其转换为原始int
。