Integer和int基本类型的比较
来源:互联网 发布:知乎 openstack 集群 编辑:程序博客网 时间:2024/06/07 07:29
先看几行代码
Integer a1 = 100; Integer a2 = 100; System.out.println("a1==a2:" + (a1 == a2)); Integer b1 = 200; Integer b2 = 200; System.out.println("b1==b2:" + (b1 == b2)); Integer c1 = new Integer(100); Integer c2 = new Integer(100); System.out.println("c1==c2:" + (c1 == c2)); int d1 = 100; Integer d2 = new Integer(100); System.out.println("d1==d2:" + (d1 == d2));
a1==a2:trueb1==b2:falsec1==c2:falsed1==d2:true
大家的答案是否和显示的相同呢,如果和你想象的不同,那又是为什么会产生这种情况呢?
包装类型
这里我们重复什么是包装类型,什么是基本类型了。
包装类型的解释:
- 当我们对两个基本类型进行比较时,JVM是直接比较他们的他们的值
int a = 10; int b = 10; System.out.println(a == b);//true
- 当我们对两个包装类型比较时,JVM通过比较他们的地址来判断是否是同一个对象。例如下面的而例子,c1和c2都是new出来的新对象,因此c1==c2的值肯定不同,他们只是拥有相同value值的Integer对象。
Integer c1 = new Integer(100); Integer c2 = new Integer(100); System.out.println("c1==c2:" + (c1 == c2));//false
当我们对两个包装类型比较时,还有一种情况,就是不通过new来创建Integer,而是通过JVM自动把int基础类型转换成Integer对象(下面称为封包)。如以下例子:
Integer a1 = 100; Integer a2 = 100; System.out.println("a1==a2:" + (a1 == a2));//true Integer b1 = 200; Integer b2 = 200; System.out.println("b1==b2:" + (b1 == b2));//false
为什么两个几乎一样的代码结果不同呢?让我们来看下JVM的指令操作:
从上图可以看出,在封包的过程中其实就是调用了Integer.valueOf()方法把int基本类型转换成了Integer对象。
public static Integer valueOf(int i) { //IntegerCache.low=-128,IntegerCache.high=127 if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
在valueOf方法中对i进行了判断,如果在[-128,127]之间会从缓存中取出相应的Integer对象,而不是重新new一个Integer对象,所以当我们比较100的时候是返回的true,而200则是返回的是false。
4. 当我们把一个Integer和一个int对象比较时,是通过从Integer取出value和int值比较
int d1 = 100;
Integer d2 = new Integer(100);
System.out.println("d1==d2:" + (d1 == d2));
阅读全文
0 0
- Integer和int基本类型的比较
- Int和Integer的比较
- Integer和int的比较
- int和Integer的比较
- Integer和int的比较
- int 与 Integer 类型的比较
- int 和 integer 比较
- Integer类型与int类型的==比较
- 关于int和Integer比较的问题
- Integer和int的种种比较
- Integer和Int比较的种种猫腻
- Integer值和int值的比较
- Integer和int的种种比较
- Integer和int的比较大小
- Integer和int类型的判断
- Integer和int类型的判断
- Java中Integer与int类型的比较--装箱和拆箱
- Java Integer和int类型变量的两两相等性比较
- [LeetCode] 520.Detect Capital
- Date日期类的实现(C++)
- opencv学习笔记一
- 9.24linux系统文件
- [LeetCode] 541.Reverse String II
- Integer和int基本类型的比较
- [LeetCode] 566.Reshape the Matrix
- 基于FreeRTOS与MQTT的物联网技术应用系列——步进电机控制(五)MQTT的移植和步进电机控制的实现
- Ubuntu软件源
- 关系数据库
- JAVA JDK动态代理图解
- MYSQL游标
- [LeetCode] 415.Add Strings
- 复杂一点的CV