开这篇博客之前,先说下Long和long的区别
java有八大基本数据类型,byte(8),char(16),short(16),int(32),long(64),float(32),double(64),boolean(1)
对应的八种包装类型,Byte,Char,Short,Integer,Long,Float,Double,Boolean
对于包装类来说,它的用途主要有两种:
a.作为基本类型对应的类类型,方便对象操作
b.包含每种基本数据类型的最大值,最小值等操作方法
双等号针对基本数据类型比较的是值,针对引用类型比较的是对象的内存地址。equals方法在Object对象里比较的是对象的内存地址,但Long这类包装类型对其方法重写了,比较的实际是对象的值。
我们先看下什么叫装箱和拆箱
装箱其实就是把基本类型转换为包装类型,拆箱就是把包装类型转换为基本类型
例如:Integer a = 1;(自动装箱,其实就是执行了Integer a = Integer.valueOf(1))
int b = a (自动拆箱,底层其实就是执行了int b =a.intValue())
接下来重点来了,那Long i = 12L;Long j = 12L;System.out.println(i==j);//true为什么打印也是true呢?
查詢源码我们发现
private static class LongCache {//806行i
private LongCache(){}
static final Long cache[] = new Long[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Long(i - 128);
}
}
public static Long valueOf(long l) {//835行
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
在Long的值为-128到127时,都放在cache里不会重新创建对象,所以==是成立的,当不在此范围内就不成立了。不关Long类型,其余的包装类型中也有类似cache。
我们再来看一题
public class TestDemo {
public static void main(String[] args) {
Integer a = 2;
Integer b = 3;
Integer c = 4;
Long d = 3L;
Long e = 4L;
int f = 2;
//一旦有包装类型和数值类型判断==时,则触发包装类型的自动拆箱,转为数值类型的比较
System.out.println(new Integer(300) == 300);//返回true
//一旦有包装类型和数值类型发生运算时,则触发包装类型的自动拆箱,转为数值类型的运算
System.out.println(c == (a + f));//返回true
//一旦有包装类型和包装类型发生运算时,则触发包装类型的自动拆箱,转为数值类型的运算
System.out.println(c == (a + b));//返回true
//只有对象类型才有equals方法,因此首先a,b触发包装类型的自动拆箱,转为数值类型的运算。
//运算完,再将结果3自动装箱,Integer重写了equals,因此可以转为包装类型与包装类型的比较。
//当两边的包装类型不一致时,必定返回false。
//当两边的包装类型一致时,再进行拆箱,判断两者代表的数值是否相等。
System.out.println(c.equals(a + b));//返回true
//不同数据类型的数值进行运算,首先会将低精度的数据类型转化为高精度的数据类型,即自动类型转换。
//比如现在的int+long,会提升到long+long,再进行运算。
System.out.println(e == (a + d));//返回true
//==号两边类型不一致时,直接执行自动拆箱,比较之后的数值
System.out.println(e == (a + b));//返回true
//依次经历自动拆箱,自动类型转换、运算、自动装箱,类型比较,拆箱,数值比较
System.out.println(e.equals(a + d));//返回true
//依次经历自动拆箱,自动类型转换、运算、自动装箱,类型比较,两边类型不一致,直接返回false
System.out.println(c.equals(a + d));//返回false
}
现在对基本类型与包装类型的拆箱装箱理解了吗?