java 99% 是对象处理的,还有1%是primitive(int,short,char...等字面值)的处理,与之相对的wrapper class 是Integer,Short,Character...等,因此,总需要要在primitive和wrapper之间不断的转换...
Tiger来使用boxing和unboxing来解决这个问题...自动执行这些转换...即autoboxing和auto-unboxing..
1.primitive to wrapper
引用
//Tiger之前定义个Integer必须如下
Integer i = new Integer(100);
//Tiger只需这样
Integer i = 100;
int j = 100;
Integer x = j;
还有,JVM将特定primitive都给box成相同的不可变的wrapper对象(ture,false -128——127,部分char),放在缓存...高效率。
看下面两个例子..
引用
Integer counter1 = 100;
Integer counter2 = 100;
System.out.print("counter1 == counter2: " );
System.out.println(counter1 == counter2);
Integer counter3 = 256;
Integer counter4 = 256;
System.out.print("counter3 == counter4: ");
System.out.println(counter3 == counter4);
结果输出:
引用
counter1 == counter2: true
counter3 == counter4: false
Why?
因为counter1 和counter2 的值在-128——127之间,是不可变的wrapper,所以会将Integer boxing 成int类型,然后进行比较,所以是相等的。
因为counter3 和counter4 的值不在-128——127之间,没有将Integer进行boxing因此比较的还是对象(两个对象是在不同的内存空间),所以不相等的。
2.wrapper to primitive
引用
Integer j = 100;
int i = j;
//自动将wrapper转换为primitive
但是如果是这样..
引用
Integer j = null;
int i = j;
//将抛出NullPointerExcepion异常,所以建议初始换wrapper对象的值.
3.wrapper的递增与递减
wrapper对象也可以递增与递减,如
引用
Integer counter = 1;
counter++;
--counter;
//先把Integer先unboxing成int,递增或递减,然后再boxing回去
4.Boolean and boolean
通过Boolean 也可以直接使用逻辑运算符(||、&&、!....),先unboxing成primitive(不可变的wrapper),再做比较...如
引用
Boolean case1 = true;
Boolean case2 = true;
Boolean case3 = false;
//Boolean对象先会被unboxing成primitive,然后进行比较,再boxing最后值成为Wrapper对象赋值给result
Boolean result = (case1 || case2) && case3;