Tiger学习 之 primitive and wrapper

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;

你可能感兴趣的:(jvm,J#)