java ==与equals的区别
本文主要是针对int,Integer 之间的==与equals进行比较
当将i的值设置为40时,注意:40在[-128,127]范围内
public class test20210122_002 {
public static void main(String[] args) {
objPoolTest();
}
public static void objPoolTest() {
int i = 40;
int i0 = 40;
Integer i1 = 40;
Integer i2 = 40;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
System.out.println(i == i0); //true i和i0均是普通类型的变量,所以数据直接存储在栈中,栈中的数据可以共享。当定义了int i = 40; 再定义int i0 = 40;时会自动检查栈中是否有40这个数据,如果有,i0会直接指向i的40,不会再添加一个新的40。
System.out.println(i == i1); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(i == i2); //true
System.out.println(i == i4); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println(i == i5); //true
System.out.println(i1 == i2); //true 当i1=40时在[-128,127]范围内会首先查找常量池里面有没有40,由于没有找到就将40存在常量池,当i2=40在[-128,127]范围内也会查找常量池里面有没有40,此时就可以查找到40了,就直接指向i1指向的那个40了。
System.out.println(i1 == i4); //false 由于i4不想在常量池里面查找,想直接创建新的对象,所以i4和i5都是新创建的各自独一无二的对象,与i1和i2都不一样。
System.out.println(i1 == i5); //false
System.out.println(i4 == i5); //false
}
}
当将i的值设置为240时,注意:240不在[-128,127]范围内
public class test20210122_002 {
public static void main(String[] args) {
objPoolTest();
}
public static void objPoolTest() {
int i = 240;
int i0 = 240;
Integer i1 = 240;
Integer i2 = 240;
Integer i4 = new Integer(240);
Integer i5 = new Integer(240);
System.out.println("i==i0\t" + (i == i0)); //true i和i0均是普通类型的变量,所以数据直接存储在栈中,栈中的数据可以共享。当定义了int i=240; 再定义int i0 = 240;时会自动检查栈中是否有240这个数据,如果有,i0会直接指向i的240,不会再添加一个新的240。
System.out.println("i==i1\t" + (i == i1)); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println("i==i2\t" + (i == i2)); //true
System.out.println("i==i4\t" + (i == i4)); //true 当int和 Integer进行==比较的时候,Integer 会自动拆箱变成int,最终比较的是两者的值是否相同。
System.out.println("i==i5\t" + (i == i5)); //true
System.out.println("i1==i2\t" + (i1 == i2)); //false 当i1=240时不在[-128,127]范围内就不再考虑常量池了,就会直接创建新的对象,同理i2=240也创建了新的对象,所以i1和i2都是新创建的各自独一无二的对象。
System.out.println("i1==i4\t" + (i1 == i4)); //false 由于i4不想在常量池里面查找,想直接创建新的对象,所以i4和i5都是新创建的各自独一无二的对象,与i1和i2都不一样。
System.out.println("i1==i5\t" + (i1 == i5)); //false
System.out.println("i4==i5\t" + (i4 == i5)); //false
}
}