jlearning.cn

Java中Integer类的三种初始化方式和在逻辑运算上的区别

最近两次遇到Integer对象比较的问题,记录一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public static void main(String[] args) {
Integer a = new Integer(1200);
Integer b = new Integer(1200);
int c = 1200;
int d = 1200;
Integer e = 1200;
Integer f = 1200;
Integer g = 120;
Integer h = 120;
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
System.out.println(c==d); //true
//System.out.println(c.equals(d));
System.out.println(a==d); //true
System.out.println(a.equals(d)); //true
System.out.println(e==f); //false
System.out.println(e.equals(f)); //true
System.out.println(g==h); //true
System.out.println(g.equals(h)); //true
}

几个知识点:

  1. == 运算符在比较两个对象时,是在比较两个对象引用。所以ab是两个对象,第一个是false
  2. .equals()方法需要在类中重写,以比较类中的值,在Integer类中,很显然比较的就是int类型的值,所以第二个是true
  3. 使用基本类型时,会在内存中产生重用,所以当两次使用int初始化cd时,实际上使用的是相同的地址。第三个true
  4. 使用==比较intInteger时,会自动拆箱,所以第四是true。第五个也是对的。
  5. 比较6和8的不同,这里要知道Integer e = 1200等价于Integer e = Integer.valueOf(1200),看JDK的源码:
1
2
3
4
5
6
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}

对于-128-127之间的数,会进行缓存,下次再初始化时会从缓存中取,而不是new一个。

  1. 另外再补充一个,用==比较Integernew Integer的时候,也不会自动拆箱,所以比较的是两个对象引用,所以是false。