浅谈Java的 int 和 Integer 的区别
Posted 老唐的编程笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈Java的 int 和 Integer 的区别相关的知识,希望对你有一定的参考价值。
1.基础概念:
int是我们常说的整型数字,是Java的8个原始数据类型之一。Java语言虽然号称一切都是对象,但原始数据类型是例外。
Integer是int对应的包装类,它有一个int类型的字段存储数据,并且提供了基本操作,比如数学运算、int和字符串之间转换等。在Java 5中,引入了自动装箱和自动拆箱功能(boxing/unboxing),Java可以根据上下文,自动进行转换,极大地简化了相关编程。
注:自动装箱与拆箱实际上算是一种“语法糖”。所谓语法糖,可简单理解为Java平台为我们自动进行了一些转换,保证不同的写法在运行时等价。因此它们是发生在编译阶段的,也就是说生成的字节码是一致的。
2.主要区别:
Integer是int的包装类,现在最新的J,int则是java的一种基本数据类型.
Integer变量必须实例化后才能使用,而int变量不需要.
Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值.
Integer的默认值是null,int的默认值是0.
3.应用中的一些特性:
a.由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址不同)。
Integer i = new Integer(100); Integer j = new Integer(100); System.out.print(i == j); //false
b.但如果是int 和 interger对比的话,系统会默认我们对比的是值而非内存地址:
Integer i = new Integer(100); int j = 100; System.out.print(i == j); //true
c. new Integer(100)生成的变量指向堆中新建的对象,而直接声明的指向的是java常量池中的对象,所以指向的地址不同(同为interger就对比地址而非指,因为interger属于类(包装类)
Integer i = new Integer(100); Integer j = 100; System.out.print(i == j); //false
d.对于两个非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
这是因为 Java对于-128到127之间的数,会进行缓存,Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。
所以说因为128不会被缓存而是直接新建的对象,所以说存储的地址是不同的。
引用:
https://blog.csdn.net/zjfahs/article/details/90138277
https://blog.csdn.net/weixin_39793752/article/details/80951220
以上是关于浅谈Java的 int 和 Integer 的区别的主要内容,如果未能解决你的问题,请参考以下文章