int是无符号整数(Integer与int之间的秘密)
相信各位Java行业的”打工人“,不论在日常工作还是学习中,都会接触整数类型的数值,并且还能深情的说出”整数类型一般分为4种“。
那么我问你一个问题,你知道 Java 中可以使用什么类型存储整型数值?
这个问题问的好像有点瞧不起在座各位的样子,嗯。。。那么我换种问法好了,毕竟看完这篇文章的人,将来都是会实现不上班的这个理想的。
Integer与int有什么关联?
嗯?这个问题问的还是有点意思,第一,Integer是int的包装类;第二,int是基本类型,而Integer是引用数据类型;第三...有点想不起来了。
没事,让我们通过本篇文章一起来回顾下,Integer与int之间的秘密。
1.概念int 是我们常说的整型,如果没有初始化就使用默认值为0。int是 Java 的 8 个基本数据类型(byte 、short、char、int、float、double、long、boolean)之一,Java 中这8个基本数据类型的数据也不具备“对象”的特性:没有属性、方法可以被调用。
Integer 是 int 对应的包装类,是引用数据类型,Integer如果没有实例化就直接使用会报空指针异常(因为默认值为NULL)。Integer拥有对应的属性和方法,它可以将int类型的变量作为Integer的成员变量,还可以进行数学运算、int 和字符串之间转换等。
2.int和Interger的相互转换既然Integer 是 int 对应的包装类,那Interger要如何包装int呢?
在JDK 1.5之前int和Interger之间的转换相对繁琐一些,需要把基本类型赋值给对应的包装类型,需要使用包装类型的构造函数,或者valueOf方法完成。
在JDK 1.5开始提供了自动装箱和自动封箱的功能,极大的简化了基本类型变量和包装类型对象之间的转换。所谓的自动装箱其实就是基础数据类型和其对应包装类型之间自动进行转换,两者生成的字节码是一致的,在运行时也等价。而自动拆箱的转换过程与自动装箱相反。
3.int和Interger的比较了解完int和Interger的一些概念,接下来通过代码看看int和Interger的比较有什么不一样的地方。
如下代码的运行结果是什么?
举手,运行结果是“true”。
对,运行结果是“true”,Integer包装类型的数值和int基本数据类型的数值进行比较时,会自动拆拆箱为int,然后进行比较,实际上就变为两个int类型的数值的比较。
那如下代码的运行结果是什么?
抢答,运行结果是“true”。
对,运行结果还是“true”!既然都会抢答了,那就接我最后一招,如下代码的运行结果是什么?
这题目也太糊弄人了,答案当然还是“true”。
嘻嘻,这次你可是答错了,此代码运行的结果是“false”。
编译代码“Integer i5 = 数值;”时,会被翻译成“Integer i5 = Integer.valueOf(数值);”valueOf()方法的源代码如下。
看一下源码大家都会明白,Integer执行valueOf()方法时,会对-128到127之间的数进行缓存,Demo2中Integer i = 127时,会将127进行缓存,下次再写Integer i2 = 127时,就会直接从缓存中取,就不会new了。所以Demo2运行的结果为true;而Demo3中的128不会被缓存起来,会被重新new一个Integer对象。
接下来,对上述内容进行总结如下。
1.int是Java的一种基本数据类型,Integer是int的包装类。
2.int类型的变量未初始化时默认值是0,Integer类型的对象必须实例化后才能使用,未实例化之前默认值是NULL。
3.Integer类型的对象和int类型的值之间可以自动封箱和自动装箱。
4.Integer变量和int变量比较时,Integer类型的值会自动拆箱为int再去比,只要两个变量的值是相等的,则结果为true。
5.两个都是非new出来的Integer,会对-128到127之间的数值进行缓存。
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com