int和Integer的区别以及自动装箱\拆箱机制
Java 是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java 为每一个基本数据类型都引入了对应的包装类型(wrapper class),int 的包装类就是 Integer,从 Java 5 开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
测试用例:
1/**
2 * @author ZhangXiaoYu
3 * @date 2021/8/31 14:29
4 */
5public class AutoUnboxingTest {
6 public static void main(String[] args) {
7 Integer a = new Integer(3);
8 Integer b = 3;
9 int c = 3;
10 System.out.println(a.equals(b)); //true Integer重写equals使其变为值比较
11 System.out.println(a == b); //false 两个引用没有引用用一对象
12 System.out.println(a == c); //true a自动拆箱成int类型再和c比较
13 /*
14 * 也就是说,Integer是引用类型,而int是基本类型。
15 * 当引用类型和引用类型进行比较时(使用==),比较的是其对象的内存地址(引用地址),而使用equals是比较的值,也就是那个3;
16 * equals默认是比较其引用地址,是Integer重写了equals使其变成了值比较。
17 * 所以由于a、b都是Integer类型,所以他两使用 == 进行比较引用地址肯定是false;
18 * 而a和c在进行比较的时候,由于Integer自动拆箱的特性,在Integer和int进行比较时,会将Integer拆成int类型
19 * 而int类型和int类型进行比较时,是值比较,所以a==c是true;
20 * */
21 }
22}
Integer equals
1 public boolean equals(Object obj) {
2 if (obj instanceof Integer) {
3 return value == ((Integer)obj).intValue();
4 }
5 return false;
6 }
未重写 equals
1 public boolean equals(Object obj) {
2 return (this == obj);
3 }
标题:int和Integer的区别以及自动装箱\拆箱机制
作者:zzzzchen
地址:https://dczzs.com/articles/2021/08/31/1630392379257.html