int与Integer的区别

2022/5/3 6:15:21

本文主要是介绍int与Integer的区别,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

int与Integer的区别

两种数据类型

  • 基本数据类型:boolean、byte、short、char、int、long、float、double
  • 引用数据类型:数组、接口、类、string

Java把基本数据类型封装成了不同的类

数据类型 类类型
boolean Boolean
byte Byte
short Short
char Character
int Integer
long Long
float Float
double Double

int与Integer对比

  • Integer是int的包装类;int是基本数据类型
  • Integer变量必须实例化后才能使用;int变量不需要
  • Integer实际是对象的引用,指向此new的Integer对象;int是直接存储数据值
  • Integer的默认值是null;int的默认值是0

int 与 Integer的深入对比

  1. 由于Integer变量实际上是对Integer类的一个引用,所以两个通过new生成的Integer变量永远不相等(因为new 生成的是两个对象,其内存地址不同)

    Integer num01 = new Integer(100);
    Integer num02 = new Integer(100);
    System.out.print(num01 == num02);//false
    
  2. Integer 变量和 int 变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类 Integer 和基本数据类型 int 比较时,Java 会自动拆包成int ,然后进行比较,实际上就变成两个int 变量的比较)

    Integer num01 = new Integer(100);
    int num02 = 100;
    System.out.print(num01 == num02);//true
    
  3. 非new生成的Integer和new Integer() 生成的变量比较时,结果为false(因为非new生成的Integer变量指向的是静态常量池中cache数组中存储的指向了堆中的Integer对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的对象引用地址不同)

    Integer num01 = new Integer(100);
    Integer num02 = 100;
    System.out.print(num01 == num02);//false
    
  4. 对于两个非new 生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

    Integer num01 = 100;
    Integer num02 = 100;
    System.out.print(num01 == num02);//ture
    
    Integer num03 = 128;
    Integer num04 = 128;
    System.out.print(num03 == num04);//false
    

    (Java在编译Integer num01 = 100;时,会翻译成Integer num01 = Integer.valueOf(100)。而Java API 中对Integer 类型的valueOf的定义如下,对于-128至127之间的数,会进行缓存,Integer num01 = 127时,就会直接从缓存中取,就不会new了)

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

自动装箱和自动拆箱

自动装箱:将基本数据数据类型重新转化为对象
public class Test{
    public static void main(String[]args){
        //声明一个Integer对象,用到了自动装箱:解析为Integer num = Integer num = Integer.valueOf(9);
        Integer num = 9;  }
}

9属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的。但jdk1.5之后就可以进行这样的声明,自动将基本数据类型转化为对应的封装类型,成为一个对象以后就可以调用对象声明的所有方法

自动拆箱:将对象重新转化为基本数据类型数据类型
public class Test{
    public static void main(String[] args){
        //声明一个Integer对象
        Integer num = 9;
        
        //进行计算时隐含的有自动拆箱
        System.out.print(num--);
    }
}

因为对象不能直接进行运算的,而是要转化基本数据类型后才能进行加减乘除。

//装箱
Integer num = 10;

//拆箱
Integer num01 = num;

深入解析Integer

问题描述
public class Test{
    public static void main(String[] args){
        //在-128~127之外的数
        Integer num01 = 128;
        Integer num02 = 128;
        System.out.println(num01 == num02);//false
        
        //在-128~127之内的数
        Integer num03 = 9;
        Integer num04 = 9;
        System.out.println(num03 == num04);//ture
    }
}

解析原因:归结于Java对于Integer与int的自动装箱与拆箱的设计,是一种模式:

享元模式(flyweight)

  1. 加大对简单数字的重复利用,Java定义在自动装箱时对于在-128~127之内的数值,它们被装箱成Integer对象后,会在内存中被重用,始终只存在一个对象
  2. 而如果在-128~127之外的数,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象
Integer源码解析

给一个Integer对象赋于一个int值时,会调用Integer类的静态方法valueOf,源码如下:

public static Integer valueOf(String s, int radix) throws NumberFormatException{
    return Integer.valueOf(parseInt(s,radix));
}

/**
1. 在-128~127之内:静态常量池中cache数组时static final类型,cache数组对象会被存储于静态常量池中。
cache数组里的元素去不是static final 类型,而是cache[k] = new Integer(j++),
那么这些元素是存储于堆中,只是cache数组对象存储的时指向了堆中Integer对象(引用地址)

2.在-128~127之外:新建一个Integer对象,并返回。
*/
public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= Integer.low && i <=IntegerCache.high){
        return IntegerCache.cache[i + (-IntegerCache.low)];
    }
    return new Integer(i);
}

IntegerCache是Integer的内部类,源码如下:

private static class IntegerCache{
    static final int low = -128;
    static final int high;
    static final Integer Cahe[];
    
    static{
        //high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue = sun.misc.Vm.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if(integerCacheHighPropValue != null){
            int i = parseInt(integerCacheHighPropValue);
            i = Math.max(i,127);
            //Maximum array size is Integer.MAX_VALUE
            h = Math.min(i,Integer.MAX_VALUE - (-low)-1);
        }
        high = h;
        
        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++){
            cache[k] = new Integer(j++);//创建一个对象
        }
        
    }
    private IntegerCache(){}
}


这篇关于int与Integer的区别的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程