包装类学习(2)

参考以下文章:



public class TEST {
	    public static void main(String[] args) {
	         
	        Integer a = 1;
	        Integer b = 2;
	        Integer c = 3;
	        Integer d = 3;
	        Integer e = 321;
	        Integer f = 321;
	        Long g = 3L;
	        Long h = 2L;
	        //A
	        System.out.println(c==d);
	        System.out.println(e==f);
	        System.out.println(c==(a+b));
	        System.out.println(c.equals(a+b));
	        System.out.println(g==(a+b));
	        System.out.println(g.equals(a+b));
	        System.out.println(g.equals(a+h));
	        
	        
	        //B
	        int i = 40;  
            int i0 = 40;  
            Integer i1 = 40;  
            Integer i2 = 40;  
            Integer i3 = 0;  
            Integer i4 = new Integer(40);  
            Integer i5 = new Integer(40);  
            Integer i6 = new Integer(0);  
            Double d1=1.0;  
            Double d2=1.0;  
              
            System.out.println("i=i0\t" + (i == i0));  
            System.out.println("i1=i2\t" + (i1 == i2));  
            System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));  
            System.out.println("i4=i5\t" + (i4 == i5));  
            System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));      
            System.out.println("d1=d2\t" + (d1==d2));


	    }
}

反正我是没做对,和大家分享一下
从两个博客找的题目,试了一下答案如下:

true
false
true
true
true
false
true
i=i0	true
i1=i2	true
i1=i2+i3	true
i4=i5	false
i4=i5+i6	true
d1=d2	false

在做题之前先补充点知识:

  • 包装类的自动拆箱就是运用xxxvalue()方法,自动装箱是valueof()函数
  • 基本大家都知道,默认情况下,Integer(-127-128)范围内的值会被缓存,但对于其他包装类却没有研究过,下面是其他包装类的对象的缓存机制:
//boolean原生类型自动装箱成Boolean
    public static Boolean valueOf(boolean b) {
        return (b ? TRUE : FALSE);
    }

    //byte原生类型自动装箱成Byte
    public static Byte valueOf(byte b) {
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];
    }

    //byte原生类型自动装箱成Byte
    public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }

    //char原生类型自动装箱成Character
    public static Character valueOf(char c) {
        if (c <= 127) { // must cache
            return CharacterCache.cache[(int)c];
        }
        return new Character(c);
    }
    
    //int原生类型自动装箱成Integer
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

    //int原生类型自动装箱成Long
    public static Long valueOf(long l) {
        final int offset = 128;
        if (l >= -128 && l <= 127) { // will cache
            return LongCache.cache[(int)l + offset];
        }
        return new Long(l);
    }

    //double原生类型自动装箱成Double
    public static Double valueOf(double d) {
        return new Double(d);
    }

    //float原生类型自动装箱成Float
    public static Float valueOf(float f) {
        return new Float(f);
    }


可以看出除了Double和Float类型基本上都有缓存机制,这两个类型没有的原因,
可能是double/float的数值不像Integer那样在指定范围内只有有限个值,所以性能上不划算

A组

主要的考点是:
当 "=="运算符的两个操作数都是 包装器类型的引用,则是比较指向的是否是同一个对象,而如果其中有一个操作数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。另外,对于包装器类型,equals方法并不会进行类型转换。

c==d 和 e==f j基本操作,没啥好说
c==(a+b) a和b 先拆箱 在计算  由于(a+b)已经是基本类型了 所以c 拆箱,那么 3==3 
c.equai(a+b)  会先触发自动拆箱过程,再触发自动装箱过程,也就是说a+b,会先各自调用intValue方法,得到了加法运算后的数值之后,便调用Integer.valueOf方法,再进行equals比较,Integer 的equals函数如下,结果为true

    public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }
    
g==(a+b) g自动拆箱后,左边long 右边int 基本类型比较值,值相等就相等
g.equals(a+b)  Long类型和 Integer肯定不相等
g.equals(a+h)  (a+h) 计算后 自动装箱加 升级 变成Long的包装类了

B组

i == i0 和  i1 == i2 基本操作
i1 == i2 + i3  i2和i3会自动拆箱计算 ,i1自动拆箱
i4 == i5 两个变量 比较 地址 !不牵涉拆箱和装箱 
i4 == i5 + i6  牵涉拆箱,最后== 两边都是int基本类型
d1==d2  Double没有缓存机制!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值