public static void main(String [] args) {
// Integer
//Java为了提高性能提供了和String类一样的对象池机制,
//Java的八种基本类型的包装类(Packaging Type)也有对象池机制,范围是-128~127
Integer i1 = 20;
Integer i2 = 20;
Integer i3 = 0;
Integer i4 = new Integer(20);
Integer i5 = new Integer(20);
Integer i6 = new Integer(0);
System.out.println("i1=i2\t" + (i1 == i2));//true
System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));//true
System.out.println("i4=i5\t" + (i4 == i5));//false
System.out.println("i4=i1\t" + (i4 == i1));//false
System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));//true
System.out.println("i2=i5+i6\t" + (i2 == i5 + i6));//true
/*Java的数学计算是在内存栈里操作的,Java会对i5、i6进行拆箱操作,其实比较的是
* 基本类型(20=20+0),他们的值相同,因此结果为True。
* */
System.out.println();
/*
* 也就是说这种方式声明一个Integer对象时,JVM首先会在Integer对象的缓存池中查找有木有值为20
* 的对象,如果有直接返回该对象的引用;如果没有,则使用New keyword创建一个对象,并返回该对象的
* 引用地址。因为Java中【==】比较的是两个对象是否是同一个引用(即比较内存地址),i2和i2都是引用
* 的同一个对象,So i1==i2结果为”true“;而使用new方式创建的i4=new Integer(20)、
* i5=new Integer(20),虽然他们的值相等,但是每次都会重新Create新的Integer对象,不会
* 被放入到对象池中,所以他们不是同一个引用,输出false。
* */
//-128----------127
Integer i11 = 800;
Integer i22 = 800;
Integer i33 = 0;
Integer i44 = new Integer(800);
Integer i55 = new Integer(800);
Integer i66 = new Integer(0);
//因为i11,i22已经超过了常量池的范围,所以jvm会为他们各自创建新的对象
//ii1 = new Integer(800) ii12 = new Integer(800)
//所以他们不是同一个引用
System.out.println("i11=i22\t" + (i11 == i22));//false
//java的数学计算是在栈中操作的,需要进行拆箱操作,比较的是基本数据类型
System.out.println("i11=i22+i33\t" + (i11 == i22 + i33));//true
System.out.println("i44=i55\t" + (i44 == i55));//false
System.out.println("i11=i44\t" + (i44 == i11));//false
//java运算在栈中进行,比较的是基本数据类型
System.out.println("i44=i55+i66\t" + (i44 == i55 + i66));//true
System.out.println("i22=i55+i66\t" + (i22 == i55 + i66));//true
Integer t1 = -129;
Integer t2 = -129;
System.out.println(t1==t2);//256,255,128 ---false
//127,-128----true
}
int i=200;
Integer j = new Integer(200);
Integer k = 200;
System.out.println(i==j);//true 和int型比较时候自动拆包
System.out.println(i==k);//true
System.out.println(j==k);//true