Java Long类型

2019-10-17  本文已影响0人  天不错啊
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;
    }

得到以下结论:

  1. Long类 内部有LongCache静态内部类 有一个Long类型数组缓存-128~127。
  2. Long l1 = 0L 编译器将其 Long l1 = Long.valueof(0L),如果不在cache范围内,则new Long(0L);
  3. 0L 是 long 而不是Long
  4. 如果Long 为null,使用会出异常,因为longValue()方法。
  5. 以前只知道自动装箱,自动拆箱,实际并没有看过源码,也没有反编译看过class,有一种恍然大悟的感觉。
上一篇 下一篇

猜你喜欢

热点阅读