Int和Integer的区别
文章目录
- 一、Int和Integer的区别
- Int和Integer的比较(扩展)
一、Int和Integer的区别
1、Integer是Int的包装类,Int是八种基本数据类型之一。
2、Integer变量必须实例化以后才可以使用,而Int变量不需要实例化。
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,而Int是直接存储数据值。
4、Integer的默认值是null,Int的默认值是0。
Int和Integer的比较(扩展)
先来看一段代码:
public class Test {public static void main(String[] args) {Integer a = new Integer(10);Integer b = new Integer(10);System.out.println(a == b);Integer c = new Integer(10);int d = 10;System.out.println(c == d);Integer e = new Integer(10);Integer f = 10;System.out.println(e == f);Integer g = 10;Integer h = 10;System.out.println(g == h);Integer i = 128;Integer j = 128;System.out.println(i == j);int k = 10;Integer l = 10;System.out.println(k == l);int m = 128;Integer n = 128;System.out.println(m == n);}}
输出结果为:
思考一下为什么?
第一组:
//1、falseInteger a = new Integer(10);Integer b = new Integer(10);System.out.println(a == b);
a和b是两个Integer变量,Integer变量实际上是对Integer对象的引用,而new生成的是两个对象,内存地址不同,所以a和b不相等,结果为false。
第二组:
//2、trueInteger c = new Integer(10);int d = 10;System.out.println(c == d);
由于包装类Integer和基本数据类型Int在进行比较的时候,Java会自动拆箱为Int(c.intValue(10) == d),然后进行比较,实际上就是两个Int变量的比较,只要两个变量的值是相等的,结果就为true。
第三组:
//3、falseInteger e = new Integer(10);Integer f = 10;System.out.println(e == f);
和第二组不同的是, e 和 f 都是Integer变量,区别是非new生成的Integer变量 f 指向的是Java常量池中的对象,new生成的Integer变量指向堆中新建的对象,两者在内存中地址不同,所以结果为false。
第四组:
//4、trueInteger g = 10;Integer h = 10;System.out.println(g == h);
对于 g == h,两个Integer类的比较应该用equals,而这里使用==判断地址,结果本应该是false,但打印出来却是true,这是为什么?
首先,直接声明Integer g = 10;
的时候,Java自动装箱为Integer g = Integer.valueOf(10)
,查看Integer类的valueOf方法:
// range [-128, 127] must be interned (JLS7 5.1.7)
// static final int low = -128;
// assert IntegerCache.high >= 127;
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i);}
观察源码可以发现,当 i>=-128并且 i<=127的时候,第一次声明会将 i 的值放入缓存中,第二次直接复用缓存里边已有的对象,而不是重新创建一个Integer对象。这个区间内的Integer值可以直接使用 == 判断,但这个区间外的所有数据,都会在堆上产生,并不会复用已有对象。
这组的 g 和 h 都在这个区间内,所以结果为true。
第五组:
//5、falseInteger i = 128;Integer j = 128;System.out.println(i == j);
第五组刚好可以和第四组进行对比,因为 i 和 j 不在那个区间内,所以都是在堆上新产生一个对象,结果为false。
第六组:
//6、trueint k = 10;Integer l = 10;System.out.println(k == l);
Integer的自动拆箱功能,k == l.intValue(10),也就是比较两个基本数据类型,结果当然为true。
第七组:
//7、trueint m = 128;Integer n = 128;System.out.println(m == n);
和第六组一样的道理,总之Int和Integer比较,无论是否有new,结果都为true,因为Java会把Integer自动拆箱为Int再去比较。
再看一段代码:
public class Test {public static void main(String[] args) {Integer a = 1;Integer b = 2;Integer c = 3;Integer d = 3;Integer e = 321;Integer f = 321;Long g = 3L;Long h = 2L;System.out.println(c == d);System.out.println(e == f);System.out.println(c == (a + b));System.out.println(c.equals((a+b)));System.out.println(g == (a+b));System.out.println(g.equals(a+b));System.out.println(g.equals(a+h));}}
输出结果为:
c == d
就是第一个示例中的第四组,结果为true。e == f
就是第一个示例中的第五组,结果为false。c == (a + b)
,由于 a + b 包含了算术运算,Java会进行自动拆箱,==又将 c 自动拆箱,所以比较的是数值是否相等,结果为true。c.equals((a+b))
,a 和 b 先各自调用intValue()方法自动拆箱,得到 a + b 的结果后再调用Integer.valueOf()方法自动装箱,再进行equals比较,结果为true。g == (a+b)
,首先计算a + b,也是先各自调用intValue()方法自动拆箱得到数值,由于 g 是Long类型的,也会自动拆箱为long,==运算符能够将小范围的数据类型转换为大范围的数据类型,也就是把 int 转换为 long,然后把两个long类型的数值进行比较,结果为true。g.equals(a+b)
,同理a+b会先自动拆箱,然后将结果自动装箱,但是equals 运算符不会进行类型转换,所以是Long.equals(Integer),结果为false。g.equals(a+h)
,a + h 自动拆箱后是 int + long,运算符 + 进行类型转换,结果为long,long再自动装箱为Long,两个Long进行equals比较,结果为true。
Int和Integer的区别相关推荐
- int和Integer的区别在哪里
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象 ...
- java int interger_java面试题之int和Integer的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- java int == integer_java int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- 二十八、Java中的Int和Integer的区别
@Author:Runsen @Date:2020/6/3 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- 最明的int和Integer的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象 ...
- java int与integer的区别
int与integer的区别从大的方面来说就是基本数据类型与其包装类的区别: int 是基本类型,直接存数值,而integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型 ...
- int和Integer的区别,哪个在定义变量好
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- JAVA中int 是什么意思,java中int和Integer什么区别
java中int和Integer的区别 一看就懂 int 是基本类型,直接存数值 integer是对象,用一个引用指向这个对象 1.Java 中的数据类型分为基本数据类型和复杂数据类型 int 是前 ...
- java int和integer的区别_int和Integer的区别
int和Integer的区别 1.Integer是int的包装类,int则是java的一种基本数据类型 2.Integer变量必须实例化后才能使用,而int变量不需要 3.Integer实际是对象的引 ...
- 10分钟讲清int 和 Integer 的区别
其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中.所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧. ...
最新文章
- 吴恩达与LG握手合作!
- gradle多工程打包冲突问题
- python手机版怎么用-怎么用手机编写Python程序?
- 过滤请求绝技 — 布隆过滤器与布谷鸟过滤器
- RTMP Handshake
- oracle 单表查询 详细图文
- TCP/IP学习笔记
- 判断显卡好坏的步骤、新买显卡装机后不亮解决
- python 遗传算法书籍推荐_转 强烈推荐遗传算法入门例子
- 年底将至 怎么向国外客户开口催单 附话术模板
- 前端技术规划与战略:2022
- wpsmac和pc版的区别_WPS Mac版本与Microsoft有什么区别?
- ldap根据dn值查找objectClass
- Python之身份证号码的校验
- Excel 如何批量查询快递单号
- java delete()_Java File delete()用法及代码示例
- 移动端 touch 手机拖动 css停止问题
- 咖啡,为什么有些比较甜?
- 取十位数,百位数,千位数的各位方法小姐
- storm mysql trident_Storm入门(十三)Storm Trident 教程