/** **包装类
- @author hqr
- 2019.10.3
/*
int 类型数值为例,转化为包装类
public static void main(String[] args) {
Integer i = new Integer(10);//手动装箱
Integer i1 = 10; //自动装箱(DK1.5开始,提供了自动装箱的功能)
int j =i; // 拆箱
}
相关运算
Integer i0 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i0==i2);//true
System.out.println(i3==i4);//false
在 Interger 的 valueOf 方法中,如果数值在 [-127, 128] 范围的时候, 就会去 IntegerCache.cache 这个数组寻找有没有存在的 Integer 对象的引用,如果有,则直接返回对象的引用,如果没有(超过了范围),就新建一个 Integer 对象。
以上的i0,i2值为100,没超过范围,所以会直接从cache中取已经存在的对象,所以i1和i2指向的是同一个对象,而i3和i4则是分别指向不同的对象。
Double j1 = 100.0;
Double j2 = 100.0;
Double j3 = 200.0;
Double j4 = 200.0;
System.out.println(j1 == j2);//false
System.out.println(j3 == j4);//false
//Double 并没有 Integer 的缓存机制,
//而是直接返回了一个新的 Double 对象,因此以下的四个引用都是指向不同的对象的,所以不同
Boolean b1 = false;
Boolean b2 = false;
Boolean b3 = true;
Boolean b4 = true;
System.out.println(b1 == b2);//true
System.out.println(b3 == b4);//true
System.out.println(b1 == b3);//false
//Boolean每次传入的 true 或 false,都是指向同一个 Boolean 对象,因此他们的引用肯定相同了
//传入true,就指向true对应的对象;传入false就指向false对应的对象
Integer a = 10;
Integer b = 20;
Integer c = 30;
Integer d = 30;
Integer e = 300;
Integer f = 300;
Integer g = a + b;
System.out.println(c == d);//true
System.out.println(e == f);//false
System.out.println(c == g);//true
System.out.println(c == (a + b));//true
System.out.println(c.equals(a + b));//true
//当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,
//而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)