美文网首页
Java Long类型

Java Long类型

作者: 天不错啊 | 来源:发表于2019-10-17 23:05 被阅读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,有一种恍然大悟的感觉。

    相关文章

      网友评论

          本文标题:Java Long类型

          本文链接:https://www.haomeiwen.com/subject/krdbmctx.html