Byte 的源码探寻

2017-04-03  本文已影响78人  坚持编程_lyz

byte 占一个字节 , 8 位 , -128到127

Byte 内部有一个 ByteCache 内部类来维护byte类的实例创建,可以更好复用对象的实例;
 Byte cache[] = new Byte[-(-128) + 127 + 1];  //初始化一个256个大小容量的数组(奶瓶)
 static {
            for(int i = 0; i < cache.length; i++)
                cache[i] = new Byte((byte)(i - 128));//给这个数组大奶瓶附上值(-128到127)
        }

在我们调用的时候

public static Byte valueOf(byte b) {//规定你只能传递类型为byte,那么值就是-127到128,
        final int offset = 128;
        return ByteCache.cache[(int)b + offset];//加上128,那么也不会超过256这个奶瓶的容器大小,取出数组中的数据辅值返给我们
    }
 static {
        System.out.println("static");
    }

    {
        System.out.println("{}");
    }
private Inner i = new Inner(); //a private member
    class Inner {
        public Inner() {
            System.out.println("我是成员变量对象的构造方法");
        }
    }

打印为

static
{}
我是成员变量对象的构造方法

小测试:

    Byte aByte1 = Byte.valueOf((byte) 11111); 
    Byte aByte3 = Byte.valueOf((byte) 11111);
  //上面这个2个利用缓存机制,所以就是一个对象,而且地址和内容都一样
    Byte aByte2 = new Byte("103");//新创建一个对象,但是内容和aByte1和aByte3是一样的
    System.out.println(aByte1==aByte2);
    System.out.println(aByte1.equals(aByte2));
    aByte2 = Byte.valueOf((byte) 11111);
    System.out.println(aByte1);
    System.out.println(aByte1==aByte2);
    System.out.println(aByte1==aByte3);
    System.out.println(aByte1.equals(aByte2));

结果:

    false
    true
    103
    true
    true
    true

而==比较的是对象的引用,equals比较的是对象的内容。

上一篇 下一篇

猜你喜欢

热点阅读