java:无意识自动装箱的可怕之处

前言:《effective Java》一书确实经典,真是为没有早一点买到这本书而感到遗憾。再来学习一个小知识,在之前,我只是知道integer是int的装箱类,而int是基本类型而已,从来没有意识到自动装箱有这么大的区别,“要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱。

根据书中所写,我测试了以下的简单例子。

package com.mwq.number;

public class Test {

    public static void main(String[] args) {
        long time1 = System.currentTimeMillis();

        long sum = 0L;
        for (int i = 0; i < Integer.MAX_VALUE / 2; i++) {
            sum += i;
        }

        System.out.println(sum);

        long time2 = System.currentTimeMillis();

        System.out.println(time2 - time1);

        Long sum1 = 0L;
        for (int i = 0; i < Integer.MAX_VALUE / 2; i++) {
            sum1 += i;
        }

        System.out.println(sum);

        long time3 = System.currentTimeMillis();

        System.out.println(time3 - time2);
    }

}

例子很简单,看看Long和long在+i的时候到底有多大的区别,花费的时间是如何的。

看结果,由于我电脑计算0到Integer.MAX_VALUE 的运算速度太慢,所以就只取了一半的量。

576460750692810753
1903
576460750692810753
10939

差了一个数量级!!!!!!!!!

sum在被声明为Long而不是long的时候,就会创造N(具体多少个N,我还真不知道,书中说的是2的31次方,显然我的不是)多个Long实例!

总结:项目中有大量的装箱和基本类型,看来是要好好的优化一下了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-29 19:10:23

java:无意识自动装箱的可怕之处的相关文章

《Java中的自动装箱和拆箱功能.》

1 //Java中的自动装箱和拆箱功能. 2 class AutoboxingUnboxing 3 { 4 public static void main(String[] args) 5 { 6 //直接把一个基本类型变量赋给Interger对象. 7 Integer inObj = 5; 8 Object inObj1 = 6; 9 //直接把一个boolean类型的变量赋给一个Object类型的变量. 10 Object boolObj = true; 11 //直接把Integer对象赋

Java自动包装(自动装箱)

装箱(封装对象) ,即把基础数据类型(如 int)转换成基础类型封装类的对象(如 new Integer())拆箱就是装箱的反过程,即把基础类型封装类的对象(如 new Integer())转换为基础数据类型(如 int).包装器功能对所有的基本类型和包装器类型都起作用: Java学习之自动装箱和自动拆箱源码分析

黑马程序员——Java枚举和自动装箱

------- android培训.java培训.期待与您交流! ----------                                                                            枚举类和自动装箱     一.枚举      枚举由不重复的常量构成,在java中使用enmu关键字定义枚举,所有的枚举会自动继承java.lang.enmu. 比如定义交通灯的枚举. publicenumTrafficLamp { RED ,GREED,YEL

Java笔记:自动装箱

一.类型封装器 出于性能考虑,Java并没有放弃基本数据类型,如果总是以对象的形式来使用这些类型,会带来不可接受的开销.虽然基本类型提供了性能的好处,但有时又需要对象的表示形式.例如,基本类型无法以引用的方式传递,Java实现的标准数据结构只能操作对象.为了处理这些情况,Java提供了类型封装器. 二.自动装箱 将数值封装到对象中的过程称为拆箱,从类型封装器中抽取数值的过程称为拆箱.Java已经支持自动装箱和自动拆箱.当需要将基本类型转换为对象时,必然会发生自动装箱.当需要将对象转换为基本类型时

深入剖析Java中的自动装箱和拆箱过程

深入剖析Java中的装箱和拆箱 自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 若有不正之处,请谅解和批评指正,不胜感激. 请尊重作者劳动成果,转载请标明原文链接: http://www.cnblogs.com/dolphin0520/p/3780005.

Java基础之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 自动装箱 Java中所谓的装箱通俗点就是:八种基本数据类型在某些条件下使用时,会自动变为对应的包装器类型. 如下清单1: @Test public void boxingTest() {    Integer i1 = 17; Integer i2 = 17;    Integer i3 = 137; Integer i4 = 137;    System.out.println(i1 == i2)

java中的自动装箱和自动拆箱

/* JDK5.0新特性: 以下的特性适合JDK1.5版本之后的.包括1.5 jdk1.4,包括1.4在内之前的所有版本不能使用以下特性. 自动装箱(auto_boxing)和自动拆箱(auto_unboxing) */ public class IntegerTest05{ public static void main(String[] args){ //JDK5.0之前的. //int-->Integer (装箱) Integer i1 = new Integer(10); //Integ

转!!Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.403E38

Java基础类型自动装箱(autoboxing)

Java SE 1.5 版本及之后,开始提供自动装箱功能. 自动装箱,将基础类型“包装”成一种类型: 基本类型 -->  包装器类 如下过程可触发自动装箱过程: Integer count = 1; Double amount = 2.0D 从 Javadoc API 上看,包装器类提供方法,对封装的基础类型进行操作: 类型转换,如 float --> int 比较 ... 值得注意的是,对于 [-128, 127] 之间的数值,自动装箱利用缓存提供内存使用效率. 即,自动装箱对于该范围的数值