面试官:小伙子你给我讲一下Integer和int的区别?

前言

Integer和int 最本质的区别就是:Integer是封装类,int是基本数据类型(这是废话)。web

本文是但愿能对Integer和int的区别进行更详细的对比说明并加以举例面试

Integer和int的区别

Integer的默认初始值是null,而int的初始值是int
也就是说Integer可以区分出未赋值和值为0的区别,而int却不能表达出未赋值的状况,因此int不适合做为web层的表单数据填写。(例如:一个学生参加考试且成绩为0,和没参加考试成绩为null)
Integer是类,自带不少方法供使用,而int只能作一些基本的±*/=的操做
Integer变量必须先实例化,int变量直接使用算法

关于Integer

在说明Integer的时候有几个小知识点提一下:spring

拆箱和装箱数据库

何时拆箱:基本数据类型和引用数据类型作运算时
何时装箱:基本数据类型赋值给引用数据类型时
“==”和“equals()”设计模式

“==”:在比较基本数据类型时比较的是数值,比较引用数据类型时比较的是对象堆内存地址
equals():在Object类中是经过“==”来比较的,但大多时候,咱们会将其进行重写
在Integer类中,“==”用来比较对象地址是否相同,而equals()被重写,他会先判断参数中对象是否为Integer类型,若是是则判断值是否相同。缓存

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

几点说明

Integer变量和int变量比较值时,只要值是相等的,结果就为true(由于Java会自动拆箱,将Integer拆为int,在进行比较)数据结构

Integer a = new Integer(1);
int b = 1;
System.out.println(a == b);//true

两个经过new生成的Integer变量是永远不相等的(由于new生成的是两个新对象,内存地址不一样)多线程

Integer a = new Integer(1);
Integer b = new Integer(1);
System.out.println(a == b);//false

一个new产生的变量和一个非new产生的Integer变量也是不相等的(由于非new产生的Integer变量指向Java常量池中的对象,而new产生的变量指向堆中新建对象,他俩所在的内存地址不一样)并发

Integer a = new Integer(1);
Integer b = 1;
System.out.println(a == b);//false

两个非new产生的Integer变量比较:当值在-128~127之间时,结果为true,当值在此区间外结果为false(由于Integer常量池的存储范围是[-128,127],在此范围内是直接存储于常量池的,都指向同一个地址。在此范围外的数须要经过堆内存建立一个新对象。好比Integer a=1会将1写入缓存中,下次再写Integer b=1时会直接从缓存中去,不用new了,因此取到的地址也是相同的)

Integer a = 1;
Integer b = 1;
System.out.println(a == b);//true

Integer a = 129;
Integer b = 129;
System.out.println(a == b);//false

最后

欢迎关注公众号:前程有光,领取一线大厂Java面试题总结+各知识点学习思惟导+一份300页pdf文档的Java核心知识点总结! 这些资料的内容都是面试时面试官必问的知识点,篇章包括了不少知识点,其中包括了有基础知识、Java集合、JVM、多线程并发、spring原理、微服务、Netty 与RPC 、Kafka、日记、设计模式、Java算法、数据库、Zookeeper、分布式缓存、数据结构等等。