public class Main {
public static void main(String[] args) {
Long l = null;
System.out.println(l == 0L);
}
}
没想到居然报了空指针,我仔细的研究了一下包装器。
public class Main {
public static void main(String[] args) {
Long l = null;
Long l2 = 0L;
long l3 = 0L;
Long l4 = l3;
System.out.println(l == 0L);
System.out.println(l2 == 0L);
System.out.println(l3 == 0L);
}
}
jd-gui 瞧瞧.class文件
public class Main
{
public static void main(String[] args)
{
Long l = null;
Long l2 = Long.valueOf(0L);
long l3 = 0L;
Long l4 = Long.valueOf(l3);
System.out.println(l.longValue() == 0L);
System.out.println(l2.longValue() == 0L);
System.out.println(l3 == 0L);
}
}
编译器做了一些操作
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
private static class LongCache {
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);
}
}
private final long value;
public long longValue() {
return value;
}
得到以下结论:
- Long类 内部有LongCache静态内部类 有一个Long类型数组缓存-128~127。
- Long l1 = 0L 编译器将其 Long l1 = Long.valueof(0L),如果不在cache范围内,则new Long(0L);
- 0L 是 long 而不是Long
- 如果Long 为null,使用会出异常,因为longValue()方法。
- 以前只知道自动装箱,自动拆箱,实际并没有看过源码,也没有反编译看过class,有一种恍然大悟的感觉。