Java自动拆装包

作者: 一个不熬夜的孩子 | 来源:发表于2017-02-09 20:00 被阅读33次

    Java自动拆装包的例子

    这段代码在Java 1.5以前是不合法的

    Long v = 0; 
    v += 1;
    

    需要写成这样:

    Long v = 0; 
    v += new Long(1);
    

    在Java 1.5 以后,编译器帮我们做了上面的工作。这就是Java的自动拆装包,方便了很多,但是也带来了可能会让人忽略的问题。

    Java自动拆装包例子的性能

    我们看一个求和的例子:

    public static void main(String[] args) {
        long time = System.currentTimeMillis();
        long sum = 0L;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println("total : " + sum);
        System.out.println("process time : " + (System.currentTimeMillis() - time) + "ms");
    }
    /* 
    输出:
    total : 2305843005992468481
    process time : 820ms
    */
    

    现在我们把long sum = 0L修改成Long再看看输出:

     public static void main(String[] args) {
        long time = System.currentTimeMillis();
        Long sum = 0L;
        for (int i = 0; i < Integer.MAX_VALUE; i++) {
            sum += i;
        }
        System.out.println("total : " + sum);
        System.out.println("process time : " + (System.currentTimeMillis() - time) + "ms");
    }
    /* 
    输出:
    total : 2305843005992468481
    process time : 9650ms
    */
    

    通过上面的对比,我们看到几乎同样的代码,long的效率竟然是Long的10倍有多(视机子的配置而定),在上面的例子中我们看到Java的自动拆装包是编译期帮我们做了这样的操作:

    sum += i;
    // 转化为:
    sum += new Long(i);
    

    可想而知,上面的第二段代码效率慢的原因是自动拆装包的锅,new了0x7fffffff多个Long对象,所以效率会下降。

    相关文章

      网友评论

        本文标题:Java自动拆装包

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