java中包装类和基本类型使用==比较详解

案例1

1
2
3
4
5
6
int a = 10;
Integer it1 = new Integer(10);
System.out.println(a == it1); // ture
// 通过方法进行类型转换
Integer it2 = Integer.valueOf(a);
int i = it1.intValue();

分析:
当Integer与int进行==比较时,Integer就会拆箱成一个int类型,所以还是相当于两个int类型进行比较,这里的Integer,不管是直接赋值,还是new创建的对象,只要跟int比较就会拆箱为int类型,所以就是相等的

案例2

1
2
3
4
5
6
7
8
9
10
int b = -128; // 将-128赋值给b
Integer i1 = -128; // 1.基本类型int -128的变量 2.自动装箱int->Integer
Integer i2 = -128;
Integer i3 = 128;
Integer i4 = 128;
System.out.println(b == i1); // true
System.out.println(i1 == i2); // true
System.out.println(i3 == i4); // false
Integer integer1 = new Integer(-128);
System.out.println(i1 == integer1); // false

分析:
两个Integer==比较,由于都是对象类型,所以不会拆箱比较。
Integer i1 = -128;的第二步自动装箱时,要调用valueOf(),Integer作为常量时,对于-128到127之间的数,会进行缓存。第二次创建i2的时候,直接取出缓存,所以相等。而超出范围就是new了新对象了,所以不等。
valueOf()源码如下:

1
2
3
4
5
6
7
public static Integer valueOf(int i) {
// i在[-128,127]之间,直接返回cache,是相同的对象
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
// 否则创建新对象
return new Integer(i);
}

案例3

1
2
3
4
5
6
Double d1 = 1.0;
Double d2 = 1.0;
Double d3 = 2.0;
Double d4 = 2.0;
System.out.println(d1 == d2); //false
System.out.println(d3 == d4); // false

分析:
valueOf()源码如下:

1
2
3
public static Double valueOf(String s) throws NumberFormatException {
return new Double(parseDouble(s));
}

案例4:

1
2
3
4
Integer integer = 128;
int c = integer;
System.out.println(c == integer); // true
System.out.println(integer == c); // true

分析:
int c = integer;自动拆箱,c赋值为10,当Integer与int进行==比较时,Integer就会拆箱成一个int类型。所以为true。

案例4

1
2
3
4
5
6
7
8
9
int d = 10;
Integer integer2 = d;
Integer integer3 = 10;
System.out.println(d == integer2); // true
System.out.println(integer3 == integer2); // true
int e = 128;
Integer integer4 = e;
Integer integer5 = 128;
System.out.println(integer4 == integer5); // false

分析:
同理,这里都是常量的比较。

案例5

1
2
3
Integer integer6 = 128;
Integer integer7 = new Integer(128);
System.out.println(integer6 == integer7); // false

分析:
一个对象类型,一个是常类,存放位置不同。