Integer和int的区别(装箱和拆箱)

Integer的自动装箱和自动拆箱、与int的区别

  • Integer的自动装箱和自动拆箱
    • Integer和int的区别

第一次写博客,因为偶尔看到一道题,自己做错了,所以话了写时间研究了一下,或许存在错误,希望大家指出,相互学习。当是我的笔记,存在博客,以后可以翻看。

Integer的自动装箱和自动拆箱

Integer类包装一个对象中的原始类型int的值。 类型为Integer的对象包含一个单一字段,其类型为int 。
此外,该类还提供了一些将int转换为String和String转换为int ,以及在处理int时有用的其他常量和方法。
1.自动装箱:自动将基本数据类型转换为包装器类型
Integer i1 = 122;
编译时,jvm会自动把上面的代码编译成 Integer i1 = Integer.valueOf(122)这是会把int类型的数值122自动包装成Integer类型。
2.自动拆箱:拆箱就是自动将包装器类型转换为基本数据类型
Integer i2 = new Integer(100);
int a = i2;
编译时,jvm执行这段代码:
Integer i2 = new Integer(100);
int a = i2.intValue();

Integer和int的区别

我们直接上代码来说明Integer和int区别。

Integer a = 15;
Integer b = 15;
System.out.println("a == b:"+(a == b));
System.out.println("a.equals(b):"+a.equals(b));

你们看代码,试想a= =b的运行结果是什么?a==b的真是结果是:
在这里插入图片描述
因为编译代码是,jvm会自动进行Integer的装箱,所以都返回了true。
我们在看一段代码:

Integer c = 128;
Integer d = 128;
System.out.println("c==b:"+(c == d));
System.out.println("c.equals(d):"+c.equals(d));

大家试想一下运行结果是什么?真实结果是:
在这里插入图片描述
看到结果,或许就有人质疑,为什么是这个结果,c==d不应该是true吗?别着急,我们先来看一段Integer的源码:
Integer和int的区别(装箱和拆箱)_第1张图片
如果传入的i(也就是我们的数值128)在范围[-128,127]之间,则直接返回这个结果,否则,重新new一个新的Integer()。看了这段源码和解释,或许就阔然开朗了,c和d返回的是一个新的Integer()对象的引用,所以c == b返回false 而equals比较返回的是true。(不同 “= =”和equals的可以先查看下资料)
我们再来看一段代码:

Integer e = new Integer(200);
Integer f = new Integer(200);
System.out.println(e == f);
System.out.println(e.equals(f));

System.out.println("c == e:"+(c == e)); 
System.out.println("c.equals(e):"+c.equals(e));

int g = 200;
System.out.println(g == f);
System.out.println(f.equals(g));
		

通过上面的两个小案例,我想大家也有思路了,六个输出结果是:
Integer和int的区别(装箱和拆箱)_第2张图片
第一个输出结果为false:因为e 和 f使用new关键字创建了Integer()对象,所以在堆内存中的地址不同,引用不同,返回false;
第二个输出结果为true:为什么呢?不妨先来看一下Integer重写的equals方法,再想结果:
Integer和int的区别(装箱和拆箱)_第3张图片
如果类型相同,则在比较引用的值,相同就返回true;
第三、第四个输出结果返回false:c == e因为物理地址不同,所以返回false,而c.equals(e)类型相同,但值不同,所以返回false。
第五、第六个输出结果返回true:因为Integer与int比较,Integer会自动拆箱成int类型,再与int类型比较,基本数据类型的比较值相同返回true。(记住----Integer与int比较只要值相同就是true)

总结:运算符“= =”看地址是否相同,在看是否在【-128,127】范围,再看值;.equals()看地址,再看值。

你可能感兴趣的:(Integer,基础)