包装类的自动装箱和拆箱是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

NaN 是什么?
NaN 属性代表一个“不是数字”的值。这个特殊的值是因为运算不能执行而导致的,不能执行的原因要么是因为其中的运算对象之一非数字(例如, “abc” / 4),要么是因为运算的结果非数字(例如,除数为零)。

虽然这看上去很简单,但 NaN 有一些令人惊讶的特点,如果你不知道它们的话,可能会导致令人头痛的bug。

首先,虽然 NaN 意味着“不是数字”,但是它的类型,不管你信不信,是 Number:

console.log(typeof NaN === "number");  // logs "true"

此外, NaN 和任何东西比较——甚至是它自己本身!——结果是false:

console.log(NaN === NaN);  // logs "false"

一种半可靠的方法来测试一个数字是否等于 NaN,是使用内置函数 isNaN(),但即使使用 isNaN() 依然并非是一个完美的解决方案。

一个更好的解决办法是使用 value !== value,如果值等于NaN,只会产生true。另外,ES6提供了一个新的 Number.isNaN() 函数,这是一个不同的函数,并且比老的全局 isNaN() 函数更可靠。