java中8大基本数据类型,分别对应8个包装类;
JDK1.5开始引入了,自动装箱、自动拆箱;
自动装箱:当将基本数据类型赋值给引用变量时,系统可以自动将它包装为相应的包装类的实例对象;装箱就是调用包装类的valueOf()方法;
自动拆箱:当需要的是基本数据类型,而实际传入的是包装类的对象时,系统会自动将对象剥开,得到它的值;拆箱就是调用包装类的xxxValue()方法,xxx代表不同数据类型;
#low=-128,high=127
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
通过查看valueOf()方法源码可知,对于Integer方法,当值在[-128,127]直接时,返回的是IntegerCache.cache缓存的值,超出这个范围的,则new一个新对象;则有如下情况:
public static void main(String[] args) {
Integer t1 = 100;
Integer t2 = 100;
Integer t3 = 200;
Integer t4 = 200;
System.out.println(t1 == t2);
System.out.println(t3 == t4);
}
t1==t2为true,而t3==t4为false
而对于Double的valueOf()方法源码,直接new一个新的对象返回;
public static Double valueOf(double d) {
return new Double(d);
}
则==两边是两个不同的对象,必然都不相等
public static void main(String[] args) {
Double t1 = 100.00;
Double t2 = 100.00;
Double t3 = 200.00;
Double t4 = 200.00;
System.out.println(t1 == t2);
System.out.println(t3 == t4);
}
Double类的valueOf方法会采用与Integer类的不同实现,因为,在某个范围内的整型数值个数是有限的,而浮点数则是无限的。
+ - * / 是基本数据类型的运算,如果使用包装类型,会触发自动拆箱;