`
shilimin
  • 浏览: 13759 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java自动拆装箱的错误使用

    博客分类:
  • java
阅读更多

 

今天有朋友问Integer a = 10;的内存使用,随便带出了自动拆装箱问题,以整型为例子进行说明

1、自动装箱

@Test
public void fun1() {
	Integer Ii = null;
	int ii = 0;
	long s = System.currentTimeMillis();
	for (int i = 0; i < 100000; i++) {
		Ii = i;
	}
	long e = System.currentTimeMillis();
	System.out.println(e - s);
	s = System.currentTimeMillis();
	for (int i = 0; i < 100000; i++) {
		ii = i;
	}
	e = System.currentTimeMillis();
	System.out.println(e - s);
}

第一次运行结果:
3

第二次运行结果:
2

第三次运行结果:
3
0

可以得出Integer Ii = int i比int ii = int i慢,运行10w次相差了3毫秒左右,主要原因是编译器在编译时进行了自动装箱操作,查看编译后源码就不难理解

  @Test
  public void fun1()
  {
    Integer Ii = null;
    int ii = 0;
    long s = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
      Ii = Integer.valueOf(i); // 将Integer Ii = 10;编译为Integer Ii =
                               Integer.valueOf(10);使用Integer.valueOf进行装箱
    }
    long e = System.currentTimeMillis();
    System.out.println(e - s);
    s = System.currentTimeMillis();
    for (int i = 0; i < 100000; i++) {
      ii = i;
    }
    e = System.currentTimeMillis();
    System.out.println(e - s);
  }

2、自动拆箱

@Test
public void fun2() {
	Integer Ii = null;
	int ii = 0;
	List list = new ArrayList();

	for (int i = 0; i < 100000; i++) {
		list.add(i);
	}
	long s = System.currentTimeMillis();
	for (int i = 0; i < list.size(); i++) {
		Ii = list.get(i);
	}
	long e = System.currentTimeMillis();
	System.out.println(e - s);

	s = System.currentTimeMillis();
	for (int i = 0; i < list.size(); i++) {
		ii = list.get(i);
	}
	e = System.currentTimeMillis();
	System.out.println(e - s);
}

第一次运行结果:
1

第二次运行结果:
2

第三次运行结果:
2
1

虽然计算时间相差不大,但依然能说明问题,多了一次拆箱过程10w次计算慢了将近1毫秒左右,编译后源码如下

  @Test
  public void fun2() {
    Integer Ii = null;
    int ii = 0;
    List list = new ArrayList();

    for (int i = 0; i < 100000; i++) {
      list.add(Integer.valueOf(i));
    }
    long s = System.currentTimeMillis();
    for (int i = 0; i < list.size(); i++) {
      Ii = (Integer)list.get(i);
    }
    long e = System.currentTimeMillis();
    System.out.println(e - s);

    s = System.currentTimeMillis();
    for (int i = 0; i < list.size(); i++) {
      ii = ((Integer)list.get(i)).intValue();// 将Integer对象使用intValue进行拆箱

    }
    e = System.currentTimeMillis();
    System.out.println(e - s);
  }

3、总结:应该尽量避免这种错误的拆装箱的使用,统一类型,尽量使用基本数据类型,写程序时要考虑是否会出现自动拆装箱

ps:尽量使用基本数据类型,基本数据类型为栈内存操作,利于内存回收,速度也更快。使用int a = 10;代替Integer a = 10;

http://blog.shilimin.com/324.htm

分享到:
评论

相关推荐

    关于Java自动装箱(autoboxing)的一些意想不到的结果

    特别是在使用缓存范围内的包装类对象时,应当谨慎处理比较逻辑,避免对对象生命周期做出错误判断,并注意不要在多线程环境中使用自动装箱的对象作为锁。理解这些特性有助于开发者更好地控制程序的行为,避免潜在的...

    Java拆装箱深度剖析

    `是自动装箱的例子。由于Java会进行优化,对于-128到127之间的整数,Integer.valueOf()方法会从缓存中返回相同的对象引用,因此`num1`和`num2`指向的是同一个对象。然而,`Integer num3 = 200;`和`Integer num4 = ...

    详解Java 自动装箱与拆箱的实现原理

    Java自动装箱和拆箱的实现原理是 Java语言的一个重要特性,它使得开发者可以更加方便地使用原始类型和封装类之间的转换,但是同时也容易引发一些疑惑和错误。通过了解自动装箱和拆箱的实现原理,我们可以更好地使用...

    Java中自动类型转换共3页.pdf.zip

    以下是关于Java自动类型转换的一些核心知识点: 1. **类型转换概述**:Java中的类型转换分为两种,一种是自动类型转换(也称为隐式类型转换),另一种是强制类型转换(也称为显式类型转换)。自动类型转换是由...

    Java面试错误汇总.txt

    ### Java面试错误汇总知识点解析 #### 1. 面试中的常见问题及误区 - **面试中的常见问题**:面试者经常会遇到一些基础性的问题,例如数据类型、类与对象的区别等。这些问题看似简单,但往往能反映出面试者对Java...

    Java开发技术大全(500个源代码).

    errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integer...

    10万字总结java面试题和答案.pdf

    它针对Java语言特点、面向对象与面向过程的区别、Java基本数据类型及其封装类、标识符命名规则、instanceof关键字的作用以及Java自动装箱与拆箱的知识点进行了阐述。下面将详细展开这些知识点。 1. Java语言特点: ...

    Java软件开发常见面试题及答案.pdf

    所谓自动装箱就是将原始类型自动的转换为对应的对象,而拆箱就是将对象类型转换为基本类型。 5. 覆盖和重载是什么? 覆盖也叫重写,发生在子类与父类之间,表示子类中的方法可以与父类中的某个方法的名称和参数...

    Java语言程序的错误类型和产生原因.zip

    自动装箱和拆箱可能导致类型安全问题,特别是当基本类型与包装类之间进行混合操作时。此外,泛型的使用也可能引发类型不匹配的错误。 9. **资源管理错误 (Resource Management Errors)** 文件、数据库连接和其他...

    10万字面试总结Java.pdf

    Java的自动装箱和拆箱简化了基本类型与包装类型之间的转换。例如,当我们将一个int变量赋值给Integer对象时,自动装箱会发生,反之则进行拆箱。装箱调用的是Integer.valueOf()方法,拆箱则是Integer.intValue()方法...

    JAVA 2 使用教程(第2版)程序代码

    4. **自动装箱与拆箱**:自动装箱允许在原始类型和对应的包装类之间进行无缝切换,提高了代码的简洁性。 5. **增强的for循环(foreach)**:简化了迭代集合、数组和其他迭代对象的代码,使得循环更加直观和简洁。 ...

    java面试宝典txt

    9. Java的自动装箱和拆箱:Java自动将基本数据类型转换为相应的包装类类型(自动装箱),反之亦然(自动拆箱),简化了开发过程。 10. Java中的错误和异常处理:Java使用try、catch、finally、throw、throws等...

    java程序员面试整理3(1).pdf

    本节内容涵盖了 Java 基础知识的方方面面,从 JVM、JRE 和 JDK 的区别到自动拆装箱的原理。 一、JVM、JRE 和 JDK 的区别 JVM(Java Virtual Machine)是 Java 程序的运行环境,它负责将 Java 字节码转换为机器码并...

    毕业设计:基于Java Web的集装箱码头闸口预约管理系统源码.zip

    5. 系统维护模块:包括日志管理、错误处理、系统设置等,保障系统稳定运行。 在开发过程中,可能会使用Maven或Gradle作为项目构建工具,管理依赖关系。同时,利用Git进行版本控制,确保代码的版本管理和团队协作。 ...

    Java函数包 API

    3. **自动装箱与拆箱**:Java 5.0引入了自动装箱和拆箱的概念,使得基本类型与对应的包装类之间可以无缝转换。例如,int和Integer之间可以自动进行装箱(int -&gt; Integer)和拆箱(Integer -&gt; int)操作,提高了编程...

    java解惑(java谜题)中文版的

    1. **类型转换**:Java中的自动装箱和拆箱可能导致一些陷阱,比如Integer对象与int基本类型的比较。在处理数值时,不恰当的类型转换可能导致逻辑错误。 2. **变量作用域**:Java的局部变量、成员变量和静态变量的...

    javaAPI帮助文档

    最后,Java 2 Platform Standard Edition 5.0(通常称为Java 5)的API帮助文档,标志着泛型、枚举类型、注解(Annotation)和自动装箱/拆箱等重要特性的引入。泛型提供了类型安全的集合操作,减少了类型转换错误;...

    〈Java开发手册(泰山版)〉灵魂13问1

    自动拆装箱是Java SE 5.0引入的一项特性,它允许基本数据类型和它们对应的包装类之间无缝转换。当一个包装类的对象赋值给基本类型的变量时,会自动进行拆箱,反之则进行装箱。例如,`Integer i = new Integer(5); ...

    JAVA1.5新特性

    泛型是JAVA 1.5中最引人注目的特性之一,它允许开发者在类、接口或方法中声明类型参数,从而在编译时提供类型安全检查,避免了运行时的类型转换错误。在JAVA 1.4及更早版本中,集合框架只能存储`Object`类型的元素,...

Global site tag (gtag.js) - Google Analytics