美文网首页
Byte 的源码探寻

Byte 的源码探寻

作者: 坚持编程_lyz | 来源:发表于2017-04-03 16:47 被阅读78次

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

Byte 内部有一个 ByteCache 内部类来维护byte类的实例创建,可以更好复用对象的实例;
 Byte cache[] = new Byte[-(-128) + 127 + 1];  //初始化一个256个大小容量的数组(奶瓶)
  • 类中声明了一个静态final的数组,
  • 并用静态代码块默认初始化了数组的大小 -127到128;
 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这个奶瓶的容器大小,取出数组中的数据辅值返给我们
    }
  • 补充知识 , 如果一个类默认调用的时候(加载的时候)会先调用
    1.static的静态块
    2.然后调用构造代码块
    3.执行初始化成员变量,我们new了一个对象Inner *默认jvm会给成员变量赋值0,或null ; 类的成员变量无论是否赋值,都会在各种初始化之前早已被设置为二进制0或null了。
 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比较的是对象的内容。

相关文章

网友评论

      本文标题:Byte 的源码探寻

      本文链接:https://www.haomeiwen.com/subject/vcqoottx.html