您现在的位置是:首页 > 正文

浅谈 Integer的自动拆箱和装箱

2024-02-01 00:59:25阅读 2
public class IntegerDemo {
	public static void main(String[] args) {
        Integer i1 = 128;
		Integer i2 = 128;
		System.out.println(i1 == i2);
		System.out.println(i1.equals(i2));
		System.out.println("-----------");
 
		Integer i3 = 127;
		Integer i4 = 127;
		System.out.println(i3 == i4);
		System.out.println(i3.equals(i4));
		System.out.println("-----------");
        
		int k = 127;
		System.out.println(k == i3);
		int kk = 128;
		System.out.println(kk == i1);
		System.out.println("-----------");
		      
		Integer m = new Integer(10);
		Integer n = new Integer(10);
		System.out.println(m == n); 
	}
}

大家可以先思考一下结果是什么?

下面慢慢介绍。

1.Interger和int的区别

1.Integer 是 int 包装类,int 是八大基本数据类型之一(byte,char,short,int,long,float,double,boolean)

2.Integer 是类,默认值为null,int是基本数据类型,默认值为0;

3.Integer 表示的是对象,用一个引用指向这个对象,而int是基本数据类型,直接存储数值。

在使用时,Integer x = null;代码就会出现NullPointerException。只要是对象,建议先判断是否为null,然后再使用。

2.Interger的自动拆箱和装箱

自动拆箱:把包装类类型转换为基本类型
自动装箱:把基本类型转换为包装类类型

// 定义了一个int类型的包装类类型变量i
// Integer i = new Integer(100);
Integer ii = 100;
ii += 200;
System.out.println("ii:" + ii);

// 通过反编译后的代码
// Integer ii = Integer.valueOf(100); //自动装箱
// ii = Integer.valueOf(ii.intValue() + 200); //自动拆箱,再自动装箱
// System.out.println((new StringBuilder("ii:")).append(ii).toString())

3.回顾开头的问题、

public class IntegerDemo {
	public static void main(String[] args) {
		// Integer i1 = Integer.valueOf(128);
        Integer i1 = 128;
		Integer i2 = 128;
		System.out.println(i1 == i2);//false
		System.out.println(i1.equals(i2));//true
		System.out.println("-----------");
 
		Integer i3 = 127;
		Integer i4 = 127;
		System.out.println(i3 == i4);//true
		System.out.println(i3.equals(i4));//true
		System.out.println("-----------");
        
		int k = 127;
		System.out.println(k == i3);//true
		int kk = 128;
		System.out.println(kk == i1);//true
		System.out.println("-----------");
		      
		Integer m = new Integer(10);
		Integer n = new Integer(10);
		System.out.println(m == n); //false
}
}

在这里插入图片描述
首先,直接声明Integer i1= 128,会自动装箱变为Integer i1= Integer.valueOf(128);Integer i 会自动拆箱为 i.intValue()。

1)对于i1.equals(i2)这里用equals比较的是值,那么结果肯定为true。

2)为什么i3 == i4会打印true呢?为什么 i1== 12会打印false?我们进入到Integer 类的valueOf()方法:

public static Integer valueOf(int i) {
    if (i >= IntegerCache.low && i <= IntegerCache.high)
        return IntegerCache.cache[i + (-IntegerCache.low)];
    return new Integer(i);
}

分析源码我们可以知道在 i >= -128 并且 i <= 127 的时候 (i >= IntegerCache.low && i <= IntegerCache.high),第一次声明会将 i 的值放入缓存中,第二次直接取缓存里面的数据,而不是重新创建一个Ingeter 对象。那么第一个打印结果因为 i3.i4都等于127 在缓存表示范围内,所以为 true。而i1,i2为128不在表示范围内,所以第一次创建对象的时候没有缓存,第二次创建了一个新的Integer对象。故打印结果为false

3)对于k == i3,==比较符又将右边的自动拆箱,因此它们比较的是数值是否相等,比较两个基本数据类型,结果当然为true。

4)对于kk == i1,解释和第三个一样。int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比较。

5)对于m == n,因为这个虽然值为10,但是我们都是通过 new 关键字来创建的两个对象,是不存在缓存的概念的。两个用new关键字创建的对象用 == 进行比较,结果当然为 false。

网站文章