你知道在Java中Integer和int的这些区别吗?

一、基本概念(重要)

  • Integer 是 int 的包装类,int 则是 java 的一种基本数据类型;
  • Integer 变量必须实例化后才能使用,而int变量不需要;
  • Integer 实际是对象的引用,当new一个 Integer时,实际上是生成一个指针指向此对象;而 int 则是直接存储数据值;
  • Integer的默认值是null,int的默认值是0。

二、拓展

基于以上的一些概念,这里我们拓展一下,对于Integer包装类型与int基本数据类型之间数值相互比较的结果进行一下说明,这个也可能在面试当中会被问到。

三、new Integer()与new Integer()的比较

下面的代码大家觉得结果是什么呢?大家可以先自己想一想然后再继续往下看。

public static boolean comp(){
        Integer i1=new Integer(10);
        Integer i2=new Integer(10);
        return i1==i2;
    }

Integer 变量必须实例化后才能使用,也就是我们必须new Integer()之后才可以使用,而我们知道,任何对象只要是new出来的都会放在堆内存中,同时该变量存储指向堆内存的地址,只要new出来的对象就是一个新对象,也就是说i1和i2指向的两个不同的对象,为了证明这一点,我们通过javap -v 看一下字节码,也能看的很清楚。

因为是两个不同的对象,所以上面的结果是false。

四、Integer与new Integer()的比较

再看下面的代码,Integer变量 和 new Integer() 变量比较

public static boolean comp1(){
        Integer i1=new Integer(10);
        Integer i2=10;
        return i1==i2;
    }

因为 Integer变量 指向的是 java 常量池中的对象,而 new Integer() 的变量指向堆中新建的对象,两者在内存中的地址不同,两者比较的话永远为 false。

五、Integer与Integer的比较

public static void comp2(){
        Integer i = 100;
        Integer j = 100;
        System.out.print(i == j);

        Integer m = 128;
        Integer n = 128;
        System.out.print(m == n);
    }

这里为什么会列举两个呢?大家往下看。
其实Integer i = 100 在编译时,会翻译成为 Integer i = Integer.valueOf(100),而 java 对 Integer类型的 valueOf 的定义如下:

这里的low和high分别为-128和127。

阅读源码我们可以很清晰的看到,java对于-128到127之间的数,会进行缓存,所以 当Integer i 的值在 -128到127之间时,会将值进行缓存,下次再取Integer j(值在 -128到127之间)时,就会直接从缓存中取,就不会new了,这样拿到的就是同一个对象。当Integer i 的值不在 -128到127之间时,每次都会重新new Integer(),那么每次都会是不同的对象。所以看到这里,大家应该知道上面的两个不同的比较的结果是什么了把,前者为true,后者为false。

六、int 变量 与 Integer、 new Integer() 比较

int 变量 与 Integer、 new Integer() 比较时,只要两个的值是相等,则为true,需要说明的是包装类Integer 和 基本数据类型int 比较时,java会自动拆包装为int ,然后进行比较,实际上就变为两个int变量的比较。

Integer i = new Integer(10); //自动拆箱为 int i=10; 此时,相当于两个int的比较
int j = 10;
System.out.print(i == j); //true

看完了以上的,大家看看下面的比较大家能否写出正确的结果。

public static void comp3(){
        int i = 128;
        Integer i2 = 128;
        Integer i3 = new Integer(128);

        System.out.println("i == i2 = " + (i == i2)); // Integer会自动拆箱为int,所以为true
        System.out.println("i == i3 = " + (i == i3)); // true,理由同上

        Integer i4 = 127;// 编译时被翻译成:Integer i4 = Integer.valueOf(127);
        Integer i5 = 127;
        System.out.println("i4 == i5 = " + (i4 == i5));// true

        Integer i6 = 128;
        Integer i7 = 128;
        System.out.println("i6 == i7 = " + (i6 == i7));// false

        Integer i8 = new Integer(127);
        System.out.println("i5 == i8 = " + (i5 == i8)); // false

        Integer i9 = new Integer(128);
        Integer i10 = new Integer(128);
        System.out.println("i9 == i10 = " + (i9 == i10)); // false
    }
public static void comp4(){
        Integer a = new Integer(127), b = new Integer(128);

        int c = 127, d = 128, dd = 128;
        Integer e = 127, ee = 127, f = 128, ff = 128;

        System.out.println(a == b); // false 因为a,b都是new出来的对象,地址不同所以为false
        System.out.println(a == c); // true a会自动拆箱为int类型
        System.out.println(a == e); // false 指向的地址不同a是new出来的

        System.out.println(e == c); // true e会自动拆箱为int类型
        System.out.println(e == ee);// true Integer对 处于-128到127范围之间,指向了同一片地址区域

        System.out.println(b == f); // false 指向的地址不同b是new出来的
        System.out.println(f == d); // true f自动拆箱为int类型

        System.out.println(f == ff); /*
         * false 指向的不是同一片地址区域。
         * 在Integer类型中,-128到127存放的是同一片区域地址,
         * 之外的数是另外开辟空间来进行 存储的
         */
        System.out.println(d == dd); // true 不解释
    }
public static void comp5(){
        Integer i01 = 59;
        int i02 = 59;
        Integer i03 =Integer.valueOf(59);
        Integer i04 = new Integer(59);
        System.out.println(i01 == i02);//true
        System.out.println(i01 == i03);//true
        System.out.println(i03 == i04);//false
        System.out.println(i02 == i04);//true
    }
public static void comp6(){
        Integer i01 = 128;
        int i02 = 128;
        Integer i03 = Integer.valueOf(128);
        Integer i04 = new Integer(128);
        System.out.println(i01 == i02);//true
        System.out.println(i01 == i03);//false
        System.out.println(i03 == i04);//false
        System.out.println(i02 == i04);//true
    }

到此这篇关于你知道在Java中Integer和int的这些区别吗?的文章就介绍到这了,更多相关Integer和int的区别内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

时间: 2021-06-09

基于jdk1.8的Java源码详解 Integer

public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该类不能够被继承,同时 Integer 继承了Number类,因此可以将Integer转换成 int .double.float.long.byte和short类型的数据,另外,也实现了comparable接口,因此Integer类也可以进行自然排序. 构造方法只有两个: public Integer(int

详解Java中int和Integer的区别

基本数据类型和引用类型 Java是面向对象的编程语言,一切都是对象,但是为了编程的方便还是引入了基本数据类型,为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换,对应如下: 原始类型:boolean,char,byte,short,int,long,float,double 包装类型:Boolean,Character,Byte

Java AtomicInteger类使用方法实例讲解

1.java.util.concurrent.atomic 的包里有AtomicBoolean, AtomicInteger,AtomicLong,AtomicLongArray, AtomicReference等原子类的类,主要用于在高并发环境下的高效程序处理,来帮助我们简化同步处理. 在Java语言中,++i和i++操作并不是线程安全的,在使用的时候,不可避免的会用到synchronized关键字.而AtomicInteger则通过一种线程安全的加减操作接口. 2.AtomicInteger

Java Integer及int装箱拆箱对比

示例代码: class BoxIntInteger { public static void main(String[] args) { Integer a = new Integer(10111); int b = 10111; boolean equal1 = a == b; boolean equal2 = a.equals(b); System.out.println(equal1); System.out.println(equal2); } } 反编译字节码: public stat

Java中Integer类型值相等判断方法

背景 本周开发中遇到一个很低级的问题,Integer包装类的相等判断,包装类与基本数据类型的区别,应该大多数人在面试中经常被问到,但是有的时候大家都会烦这些看起来没啥用的东西,面试前还需要去熟悉,博主之前也是这样认为的,但是平时看一些理论性的东西,在方案探讨或者可行性分析时是很必要的,废话不多少,看看这个问题吧 事故现场 public static void main(String[] args) { Integer a =127; Integer b = 127; Integer c = 12

Java中BigDecimal类与int、Integer使用总结

前言 我们都知道浮点型变量在进行计算的时候会出现丢失精度的问题.如下一段代码: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.out.println(4.015 * 100); System.out.println(123.3 / 100); 输出: 0.060000000000000005 0.5800000000000001 401.49999999999994 1.23299999999999

JAVA Integer类常用方法解析

JAVA中Integer类下的常用方法有哪些? 1.进制转换 n进制转10进制 字符串结果 Integer.parseInt(String s, int radix): radix范围为2-36(包括0-9,a-z) string输入为二进制字符串 System.out.println( Integer.parseInt("10000",2)); //16 2.int转二进制字符串 System.out.println( Integer.toBinaryString(789)); //

通过实例了解Java Integer类和int的区别

代码实例如下 public static void main(String[] args) { Integer i = 10; Integer j = 10; System.out.println(i == j); Integer a = 128; Integer b = 128; System.out.println(a == b); int k = 10; System.out.println(k == i); int kk = 128; System.out.println(kk == a

Jackson优雅序列化Java枚举类过程解析

1. 前言 在Java开发中我们为了避免过多的魔法值,使用枚举类来封装一些静态的状态代码.但是在将这些枚举的意思正确而全面的返回给前端却并不是那么顺利,我们通常会使用Jackson类库序列化对象为JSON,今天就来讲一个关于使用Jackson序列化枚举的通用性技巧. 2. 通用枚举范式 为了便于统一处理和规范统一的风格,建议指定一个统一的抽象接口,例如: /** * The interface Enumerator. */ public interface Enumerator { /** *

java String类常用方法练习小结

String 类代表字符串.Java 程序中的所有字符串字面值(如 "abc" )都作为此类的实例实现. 字符串是常量:它们的值在创建之后不能更改.字符串缓冲区支持可变的字符串. String 类包括的方法可用于检查序列的单个字符.比较字符串.搜索字符串.提取子字符串. 创建字符串副本并将所有字符全部转换为大写或小写. String类是最常用的类之一,下面就通过几个练习,熟悉String类中的提供的重要方法. 字符串练习一 给定一个字符串数组,按照字典顺序,进行大小写排序 思路: 1.

Java Number类原理实例解析

这篇文章主要介绍了Java Number类原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Number类 内置数据类型:byte.int.long.double等 包装类:Integer.Long.Byte.Double.Float.Short. ​ 这种由编译器特别支持的包装称为装箱,所以当内置数据类型被当作对象使用的时候,编译器会把内置类型装箱为包装类.相似的,编译器也可以把一个对象拆箱为内置类型.Number 类属于 java.l

Java String类的常用方法汇总

一.String类 String类在java.lang包中,java使用String类创建一个字符串变量,字符串变量属于对象.java把String类声明的final类,不能有类.String类对象创建后不能修改,由0或多个字符组成,包含在一对双引号之间. 二.String类对象的创建 字符串声明:String stringName; 字符串创建:stringName = new String(字符串常量);或stringName = 字符串常量; 三.String类构造方法 1.public

java.lang.Void类的解析与使用详解

今天在查看源码的时候发现了 java.lang.Void 的类.这个有什么作用呢? 先通过源码查看下 package java.lang; /** * The {@code Void} class is an uninstantiable placeholder class to hold a * reference to the {@code Class} object representing the Java keyword * void. * * @author unascribed *

Java实体类实现链式操作实例解析

这篇文章主要介绍了Java实体类实现链式操作实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 原来是这么写bean的,单纯的使用get.set方法,再加一个toString package Model; /** * @author: Davion * @date: 2019/12/11 * @description: */ public class User { private Integer id; private String nam

Java File类的常用方法总结

Java File类的功能非常强大,利用Java基本上可以对文件进行所有的操作.本文将对Java File文件操作类进行详细地分析,并将File类中的常用方法进行简单介绍,有需要的Java开发者可以看一下. 构造函数 复制代码 代码如下: public class FileDemo {      public static void main(String[] args){          //构造函数File(String pathname)          File f1 =new Fi

Java中Math类常用方法代码详解

近期用到四舍五入想到以前整理了一点,就顺便重新整理好经常见到的一些四舍五入,后续遇到常用也会直接在这篇文章更新... public class Demo{ public static void main(String args[]){ /** *Math.sqrt()//计算平方根 *Math.cbrt()//计算立方根 *Math.pow(a, b)//计算a的b次方 *Math.max( , );//计算最大值 *Math.min( , );//计算最小值 */ System.out.pri