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比较的是对象的内容。
网友评论