缓存机制:缓存了从 -128 到 127 内的所有 Long 值,如果是这个范围内的 Long 值,就不会初始化,而是从缓存中拿。
源码如下
private static class LongCache {
private LongCache(){}
//数组存储值
static final Long cache[] = new Long[-(-128) + 127 + 1];
//将-128~127值存储到cache中
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
//结论:new出来的对象肯定是不相等的,
//不是new(看范围:如果在指定范围则相等,如果不在指定范围不相等)
Integer a=new integer(1);
Integer b=new integer(1);
System.out.println(a==b);//false 两个对象地址不相等
Integer c=1;
Integer d=1;
System.out.println(c==d);
//true 如果没有超出缓存范围,你可以将它理解为两个值,所有他们相等,
//如果他们超过缓存范围,如下面的例子,Integer e=130->
//Integer e= new Integer(130) e属于一个对象,f超出范围,
//所有f属于另一个对象。所以e!=f
Integer e=130;
Integer f=130;
System.out.println(e==f);
扩充自动拆箱和自动装箱
- 自动拆箱:将引用数据类型转换为基本数据类型
- 自动装箱:将基本数据类型装换为引用数据类型(对象)
理解代码如下
Integer a=1;//这就是自动装箱:Integer a=new integer(1);(但他并没有new:我现在的理解认知)
int b=a-1;//虽然a在上面时对象,但是由于自动拆箱,对象a将会变为基本数据值(1),
System.out.println(a);//1
System.out.println(b);//0