一、byte, short, int, long四种基本数据类型以及其包装类的比较:
int i = 100;
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = new Integer(100);
Integer i4 = new Integer(100);
Integer i5 = 300;
Integer i6 = 300;
System.out.println(i == i1);// true;i1自动拆箱
System.out.println(i == i3);// true; i3自动拆箱
System.out.println(i1 == i2);// true; i1和i3都指向常量池中同一个地址
System.out.println(i1 == i3);// false; 两个不同的对象
System.out.println(i3 == i4);// false; 两个不同的对象
System.out.println(i5 == i6);// false; 自动装箱时,如果值不在-128到127,就会创建一个新的对象
结论:
1.基本数据类型与其包装类运算或比较时,会自动拆箱成基本数据类型;
2.在自动装装箱时,会先检查其值是否在-128到127之间,如果在这之间,就会直接指向常量池中其值的地址;
3.只要是new得到的一定是对象,存在堆内存中;
4.同时byte, short, long也具有该特性。
原因:JVM做的一些一些优化,将常用的基本数据类型在程序运行时就创建加载在常量池中。
二、double, float类型的不同:
Float f1 = 100f;
Float f2 = 100f;
Float f3 = 300f;
Float f4 = 300f;
System.out.println(f1 == f2);// false
System.out.println(f3 == f4);// false
结论:float,double类型的包装类,都会在堆中创建一个新对象,因此比较的是对象的地址