包装类的自动装箱和自动拆箱
包装类的自动装箱和拆箱是JDK1.5的新特性
一.首先:了解自动装箱的过程
有两种自动装箱过程
第一种 (-128~127)之内 调用相应包装类的valueOf()
例如:Integer i = 12; Integer a = 23;
这些过程由JDK 编译器自动装箱完成的 即 会自动调用 Integer.valueOf() 方法
上面实际为: Integer i = Integer.valueOf(12); Integer a = Integer.value(23);
其实在该范围之内,底层中是通过数组存的值,当在该范围内再一次定义相同大小的值,如12,JDk它会在相应的数组里找到该值是不是存在,如存在则数组里存有12,则把它的引用给该对象,所以它们的地址是相等的.
例如:Integer a = 20; Integer b = 20;
System.out.println(b==a);//true
第二种 不在(-128~127)之内 直接 new 对象
例如: Integer i = 200; Integer a = 200;
实际为: Integer i = new Integer(200); Integer a = new Integer(200);
System.out.println(i==a);//false
注意:只要他们的实际值相同(基本类型数值) ,则它们的hashCode相等
二.自动拆箱的过程
自动拆箱是指将包装类的类型直接赋值给对应的基本数据类型的变量;
例如: Integer i = 100; int a = i;
实际上底层调用了相应的xxxValue()方法: Integer i = 100; int a = i.intValue();
在包装类进行与基本数据类型比较时 ,会存在自动拆箱的操作。
Integer in = 400;
int i = 400;
// 当包装类和对应的基本类型在运算的时候会进行自动拆箱
System.out.println(in == i);//true
NaN
// NaN是唯一的一个值
// NaN与任何东西都不相等,包括自己本身
// System.out.println(Double.NaN == Double.NaN);//false
System.out.println(Double.isNaN(5.8 / 4.32));//false
System.out.println(Double.isNaN(0.0/0));//true