參考
how-to-properly-compare-two-integers-in-java
示例
public static void main(String[] args) {
// (1)
Integer integer1 = 1;
Integer integer2 = 1;
// true
System.out.println(integer1 == integer2);
// (2)
integer1 = 256;
integer2 = 256;
// !!!false
// If the value p being boxed is an integer literal of type int
// between -128 and 127 inclusive (§3.10.1),
// or the boolean literal true or false (§3.10.3),
// or a character literal between '\u0000' and '\u007f' inclusive (§3.10.4),
// then let a and b be the results of any two boxing conversions of p.
// It is always the case that a == b.
System.out.println(integer1 == integer2);
// (3)
// true
System.out.println(integer1 == 256);
// (4)
integer1 = new Integer(1);
integer2 = new Integer(1);
// false
System.out.println(integer1 == integer2);
// (5)
// false
// 重載了運(yùn)算符
System.out.println(integer1 < integer2);
// (6)
Boolean b1 = new Boolean(false);
Boolean b2 = new Boolean(false);
// false
System.out.println(b1 == b2);
// (7)
b1 = false;
b2 = false;
// true
System.out.println(b1 == b2);
}
要特別注意第(2)個(gè)例子那種情況, 解釋在注釋中!來(lái)源: 文檔
從源碼也可以看出原因, Integer i = 10
實(shí)際上是調(diào)用了 Integer i = Integer.valueOf(10)
, 所以在一些范圍內(nèi)的常量, 會(huì)導(dǎo)致引用指向同一個(gè)對(duì)象.
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
第(3)個(gè)例子又是true
了, 因?yàn)?56實(shí)際上被重用了, 大概是常量池的原因.
==
運(yùn)算符并沒(méi)有對(duì)Integer, Long這些類(lèi)型做重載, 所以它就是比較兩個(gè)引用
是否指向了同一個(gè)對(duì)象. 即便對(duì)于Boolean
也是一樣.