java ==与equals的区别
本文主要是针对int,Integer 之间的==与equals进行比较
很多人都不明白为什么integer里面存在[-128,127]这个范围,想知道这个原因的话首先要知道int和integer的区别
int就是最基本的数据类型,integer是int的包装类,也就是给int变成了一个类,增加了很多熟悉和方法。
由于创建类的时候每次都需要新建数据占用一些空间,于是java考虑到常用的数据基本上是在100以内,所以给了[-128,127]这个范围,
只要在[-128,127]之间的Integer类型的变量,可以直接指向常量池中的缓存地址,不会new开辟出新的空间。
下面来看一下具体的代码:
public class test20210122_004 {
public static void main(String[] args) {
int a1 = 10;
Integer a2 = 10;
Integer a3 = 10;
Integer a4 = new Integer(10);
Integer a5 = 200;
Integer a6 = 200;
System.out.println(a1 == a2); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(a2 == a3); //true 在[-128,127]范围内直接在常量池中获取
System.out.println(a2 == a4); //false a4要求新创建对象,不在常量池中获取了
System.out.println(a5 == a6); //false 超过[-128,127]范围,不能在常量池中获取了,需要创建新的对象
System.out.println(a5.intValue() == a6.intValue()); //true 拆箱取值
System.out.println(a5.equals(a6)); //true 判断值是否相等
System.out.println(a5.intValue()); //200
}
}
public class test20210122_004 {
public static void main(String[] args) {
int a1 = -300;
Integer a2 = -300;
Integer a3 = -300;
Integer a4 = new Integer(-300);
Integer a5 = 300;
Integer a6 = 300;
Integer a7 = -100;
Integer a8 = -100;
Integer a9 = Integer.valueOf(a1);
System.out.println(a1 == a2); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(a2 == a3); //false 超过[-128,127]范围,不能在常量池中获取了,需要创建新的对象
System.out.println(a2 == a4); //false a4要求新建对象,a2超过[-128,127]范围也是新建的对象,他们的地址都是各自独一无二的。
System.out.println(a5 == a6); //false 超过[-128,127]范围,不能在常量池中获取了,需要创建新的对象
System.out.println(a5.intValue() == a6.intValue()); //true 拆箱取值
System.out.println(a5.equals(a6)); //true 判断值是否相等
System.out.println(a5.intValue()); //300 拆箱取值
System.out.println(a7.intValue()); //-100 拆箱取值
System.out.println(Integer.valueOf(a1)); //-300 装箱
System.out.println(a1 == a9); //true a1装箱之后成为a9,由于a1是int,当int和 Integer进行==比较的时候,Integer会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(a2 == a9); //false a1装箱之后成为a9,由于超过[-128,127]范围,都是新建的对象,他们的地址都是各自独一无二的。
}
}
public class test20210122_005 {
public static void main(String[] args) {
int a1 = -100;
Integer a2 = -100;
Integer a3 = -100;
Integer a4 = new Integer(-100);
Integer a5 = Integer.valueOf(a1);
System.out.println(a1 == a2); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(a2 == a3); //true 在[-128,127]范围内直接在常量池中获取
System.out.println(a2 == a4); //false a4要求新创建对象,不在常量池中获取了
System.out.println(Integer.valueOf(a1)); //-100 装箱取值
System.out.println(a1 == a5); //true a1装箱之后成为a5,由于a1是int,当int和 Integer进行==比较的时候,Integer会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(a2 == a5); //true a1装箱之后成为a5,由于a2和a5都是在[-128,127]范围内就直接在常量池取值,没有新建对象
System.out.println(a3 == a5); //true a1装箱之后成为a5,由于a3和a5都是在[-128,127]范围内就直接在常量池取值,没有新建对象
}
}
注意:
由于Integer 是类无法参与“+”的操作,所以当Integer遇到+时,需要将Integer自动拆箱为int,然后再将int的值进行+操作
当Integer与int进行比较的时候,Integer自动拆箱为int,然后进行值比较。