一,数据类型区别
我们知道java中由两种数据类型,即基本类型和对象类型,int就是基本数据类型,而Integer是一个class,也习惯把Integer叫做int的包装类。
二,声明或实例化时区别
基本类型int在使用时可以在声明时直接初始化,如int a=0;而Integer作为一个class肯定要通过其构造方法来实例化啦,如:Integer i=new Integer(0);
三,默认值不同
int的默认值是0,而Integer的默认值是null
四,内存中存储的方式不同
int在内存中存储的是数据值,而Integer实际存储的是对象的引用,当new一个Integer时实际上是生成一个指针指向此对象;
五:变量的比较方式不同
int 可以使用 == 来对比两个变量是否相等,而integer一定要使用equals来比较两个变量是否相等
六、 Integer、new Integer()和int的比较
1、两个new Integer()变量比较,永远是false
// 1、两个new Integer()变量比较,永远是false
Integer i1 = new Integer(100);
Integer j1 = new Integer(100);
System.out.println(i1 == j1);
System.out.println("===============");
因为引用数据类型,new 创建将会在堆内存中地址值
==进行比较引用数据类型比较的是地址值
2,Integer变量和new Integer()变量比较,永远为false
// 2、Integer变量 和 new Integer() 变量比较 ,永远为 false
Integer i2 = 100;
Integer j2 = new Integer(100);
System.out.println(i2 == j2);
System.out.println("===============");
因为:i2指向的是常量池中的对象的地址值,j2指向的是堆内存中的地址值,地址值不同比较为false
3,两个Integer 变量比较,如果两个变量的值在区间-128到127 之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为 false。
Integer i3 = 127;
Integer j3 = 127;
Integer i33 = 128;
Integer j33 = 128;
System.out.println(i3 == j3);
System.out.println(i33 == j33);
System.out.println("================");
分析:
Integer i3 = 127在编译时,会翻译成为 Integer i = Integer.valueOf(127),而 java 对 Integer类型的 valueOf 的定义如下
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
java对于-128到127之间的数,会进行缓存。 所以 Integer i = 127 时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,就不会new了。
4,int变量与 Integer、new Integer()比较时,只要两个的值是相等的,则为true.
Integer i4 = new Integer(100); //自动拆箱为 int i4 = 100 ,相当于两个int的比较
int j4 = 100;
System.out.println(i4 == j4);//true
Java的自动拆包机制啦,当一个基本类型和一个包装类型比较时,包装类型会被自动拆包进行比较。
小结:
Integer 是 int 的包装类,它们的区别主要体现在 5 个方面:数据类型不同、默认值不同、内存中存储的方式不同、实例化方式不同以及变量的比较方式不同。
包装类的存在解决了基本数据类型无法做到的事情泛型类型参数、序列化、类型转换、高频区间数据缓存等问题。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/120785.html