Java: Integer vs int

摘要:
埃菲尔语言设计人员是这么认为的,而Java设计人员正逐渐接近这个结论。Integer是引用类型,int是本机数据类型。我们在四种情况下讨论它:1)整数和int类型赋值将整数类型赋值为int类型。此时,Integer变量的值将自动解压缩为int类型,然后分配给int变量。这里,底层调用intValue()方法来实现所谓的解包。2) Integer和int类型之间的比较是无关紧要的。Integer==int和int==Integer具有相同的效果。整型变量被解压缩为整型,然后进行比较。如果它们相等,则返回true;否则,返回false。

Definitions

Anintis aprimitive. It isnotanObject. Anintis a high performance, streamlined beast for calculating numbers in the range -2,147,483,648 [-231] aka Integer.MIN_VALUE to +2,147,483,647 [231-1] aka Integer.MAX_VALUE. Anintis a bare bones32-bitchunk of information.intvariables aremutable. Unless you mark themfinal, you can change their value at any time.

AnInteger, is aObjectthat contains a singleintfield. AnIntegeris much bulkier than anint. It is sort like a Fedex box to contain theint.Integers areimmutable. If you want to affect the value of aIntegervariable, the only way is to create anewIntegerobject and discard the old one.

Anintis a number; anIntegeris a pointer that can reference an object that contains a number.

Converting

Fortunately it is easy to convert back and forth betweenintandInteger.

// to int i from Integer ii
int i = ii.intValue();

// to Integer ii from int i
Integer ii = new Integer( i );

See thisAmanuensisfor other conversions.

Why Both?

Why are there bothintandInteger? For speed.ints, without anyObjectpackaging are compact and fast. Would it not have been easier if there were only one of sort of creature that could do everything and have the compiler automatically figure out when the packaging was needed and when not? The Eiffel language designers thought so, and the Java designers are gradually coming around to the same conclusion.

Integer是引用类型,int是原生数据类型。
我们分四种情况来讨论:
1) Integer与int类型的赋值
a.把Integer类型赋值给int类型。此时,int类型变量的值会自动装箱成Integer类型,然后赋给Integer类型的引用,这里底层就是通过调用valueOf()这个方法来实现所谓的装箱的。
b.把int类型赋值给Integer类型。此时,Integer类型变量的值会自动拆箱成int类型,然后赋给int类型的变量,这里底层则是通过调用intValue()方法来实现所谓的拆箱的。
2) Integer与int类型的比较
这里就无所谓是谁与谁比较了,Integer == int与int == Integer的效果是一样的,都会把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。同样,拆箱调用的还是intValue()方法。
3) Integer之间的比较
这个就相对简单了,直接把两个引用的值(即是存储目标数据的那个地址)进行比较就行了,不用再拆箱、装箱什么的。
4) int之间的比较
这个也一样,直接把两个变量的值进行比较。
值得注意的是:对Integer对象,JVM会自动缓存-128~127范围内的值,所以所有在这个范围内的值相等的Integer对象都会共用一块内存,而不会开辟多个;超出这个范围内的值对应的Integer对象有多少个就开辟多少个内存。

测试代码如下:

public static void main(String[] args) throwsException
    {
        Integer a = 127, b = 128;
        
        int c = 128;
        
        //自动装箱,这里会调用Integer中的valueOf方法把c装箱成Integer类型
        a =c;
        
        //这里比较的是两个对象的地址,显然不等
        System.out.println(a ==b);
        
        //这里会调用Integer的intValue方法获得Integer对象a指向的栈地址中存的值再与c进行值比较,
        //而不是把c装箱成Integer类型进行地址比较
        System.out.println(a ==c);
        
        //同上,也是获得a指向的栈地址中存的值
        System.out.println(c ==a);
        
        /*** 总结:只有在赋值(=)的时候才会出现装箱和拆箱两种情况,
         * 在比较(==)的时候只会出现一种情况,那就是拆箱,而不会出现装箱的情况
         */System.out.println("----------------------------------");
        
        Integer i1 = 127;
        Integer i2 = 127;
        
        System.err.println(i1 ==i2);
        i1 = 128;
        i2 = 128;
        System.err.println(i1 ==i2);
        
        /*** 总结:JVM会自动缓存-128~127范围内的值,所以所有在这个范围内的值相等的Integer对象都会共用一块内存,而不会开辟多个;
         * 超出这个范围内的值对应的Integer对象有多少个就开辟多少个内存,这样做是为了节省内存消耗。
         */}

免责声明:文章转载自《Java: Integer vs int》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转)仅供个人学习-接口测试工具:jmeter、postman、soapUI的区别fastjson生成JSON字符串的时候出现$ref下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

Ubuntu关闭开机自启项

Ubuntu关闭开机自启项很多时候服务器重启速度越来越慢,cpu占用率越来越高,很大原因是服务器里面有很多开机自启项,需要手动查询出来并禁用!...

input框输入金额处理的解决办法

最近,已经启动的项目在删除输入输入量时突然出现问题。各种在线搜索都没有找到你想要的。今天,我将以react框架为例进行代码贡献。我会写下需求和解决方案,希望对我的朋友有用。如果有更好的方法实现它,请给我一些建议!”在“:”下;n=数学。防抱死制动系统;vars=“”;对于{s+=.replace;}S=S||“整数”;n=数学。地板对于{varp=“”;对于...

Crontab详细用法-定时任务详解

LWC“八个字符,有效范围为0-31个月的整数:可以出现”,-*/“四个字符,无效范围为1-12或JAN DECDayofWeek:可以出现”。-*/?因为月日和周日将相互影响。例如,在“分钟”字段中使用5,20表示它将在每分钟的5和20分钟触发一次。50:表示它只能出现在周日和月日域中。如果在DayofWeek域中使用5L,这意味着它将在最后一个星期四触发...

高通LCD开发常见问题&分析

LCD的fps一般都上限为60,正常使用时候一般设置为58,因为由于LCDpanelrange存在刷新率温度漂移情况,所以在dtsi中关键panel-framerate都不建议修改。平台端的CABL功能算法是用于LCD背光灯相关计算,在更新灰阶前,处理出现不连续不均匀等的状况。当然该算法也可以回导致LCD出现灰阶部分会有波纹以及短暂的不连续的条纹情况。这是由...

Java SPI

在java.util.ServiceLoader的文档里有比较详细的介绍。简单的总结下javaspi机制的思想。  2.jdbc    jdbc4.0以前,开发人员还需要基于Class.forName的方式来装载驱动,jdbc4也基于spi的机制来发现驱动提供商了,可以通过META-INF/services/java.sql.Driver文件里指定实现类的方...

Oracle分组查询

2). 在分组函数中使用NVL函数–NVL函数可以强制分组函数包含具有空值的记录3)当存在空数据和空数据时,可以组合单行函数来使用,例如:计算员工的平均奖金。如果没有奖金,它将被视为0 selectcount(*),count,avg,avgfromemp--补充注释1)当最小和最大计数字符类型时,它们将根据字符序列计数最小和最大。如果值为空,则MIN和MA...