java中int和Integer比较

java中int和Integer比较

一,类型区别

我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的包装类。

二,声明或实例化时区别

基本类型int在使用时可以在声明时直接初始化,如int a=0;而Integer作为一个class肯定要通过其构造方法来实例化啦,如:Integer i=new Integer(0);

三,自动拆包

什么是自动拆包?前面说Integer是int的包装类,拆包就是拆的Integer的包。

对象的比较是通过equal()方法来比较的,但你肯定见过如下操作:

Integer i=new Integer(10);
int j=10;
System.out.println(i==j);//输出true

两个对象如果直接用==判断程序比较的是两个对象的内存地址(不知道对象和引用的关系推荐文章: 链接 ),也就是说只有同一个对象使用==才会返回true,那为什么这里也会返回true呢。

原因就是java的自动拆包机制啦,当一个基本类型和一个包装类型比较时,包装类型会被自动拆包进行比较。

四,非new产生的Integer

1,非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

2,对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true

Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

3,java在编译Integer i = 100 ;时,会翻译成为Integer i = Integer.valueOf(100)。而java API中对Integer类型的valueOf的定义如下,对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。

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

本文部分引用博客:链接

猜你喜欢

转载自www.cnblogs.com/Davidhwj/p/10617765.html