今天有朋友问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
0
第二次运行结果:
2
0
第三次运行结果:
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
1
第二次运行结果:
2
1
第三次运行结果:
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会进行优化,对于-128到127之间的整数,Integer.valueOf()方法会从缓存中返回相同的对象引用,因此`num1`和`num2`指向的是同一个对象。然而,`Integer num3 = 200;`和`Integer num4 = ...
Java自动装箱和拆箱的实现原理是 Java语言的一个重要特性,它使得开发者可以更加方便地使用原始类型和封装类之间的转换,但是同时也容易引发一些疑惑和错误。通过了解自动装箱和拆箱的实现原理,我们可以更好地使用...
以下是关于Java自动类型转换的一些核心知识点: 1. **类型转换概述**:Java中的类型转换分为两种,一种是自动类型转换(也称为隐式类型转换),另一种是强制类型转换(也称为显式类型转换)。自动类型转换是由...
### Java面试错误汇总知识点解析 #### 1. 面试中的常见问题及误区 - **面试中的常见问题**:面试者经常会遇到一些基础性的问题,例如数据类型、类与对象的区别等。这些问题看似简单,但往往能反映出面试者对Java...
errorCompoundVariable.java 错误使用局部变量示例 factorial.java 求阶乘 Fibonacci.java 求Fiblnacci数列 GcdAndGcm.java 求最大公约数和最小公倍数 errorInit.java 演示变量初始化错误的程序 integer...
它针对Java语言特点、面向对象与面向过程的区别、Java基本数据类型及其封装类、标识符命名规则、instanceof关键字的作用以及Java自动装箱与拆箱的知识点进行了阐述。下面将详细展开这些知识点。 1. Java语言特点: ...
所谓自动装箱就是将原始类型自动的转换为对应的对象,而拆箱就是将对象类型转换为基本类型。 5. 覆盖和重载是什么? 覆盖也叫重写,发生在子类与父类之间,表示子类中的方法可以与父类中的某个方法的名称和参数...
自动装箱和拆箱可能导致类型安全问题,特别是当基本类型与包装类之间进行混合操作时。此外,泛型的使用也可能引发类型不匹配的错误。 9. **资源管理错误 (Resource Management Errors)** 文件、数据库连接和其他...
Java的自动装箱和拆箱简化了基本类型与包装类型之间的转换。例如,当我们将一个int变量赋值给Integer对象时,自动装箱会发生,反之则进行拆箱。装箱调用的是Integer.valueOf()方法,拆箱则是Integer.intValue()方法...
4. **自动装箱与拆箱**:自动装箱允许在原始类型和对应的包装类之间进行无缝切换,提高了代码的简洁性。 5. **增强的for循环(foreach)**:简化了迭代集合、数组和其他迭代对象的代码,使得循环更加直观和简洁。 ...
9. Java的自动装箱和拆箱:Java自动将基本数据类型转换为相应的包装类类型(自动装箱),反之亦然(自动拆箱),简化了开发过程。 10. Java中的错误和异常处理:Java使用try、catch、finally、throw、throws等...
本节内容涵盖了 Java 基础知识的方方面面,从 JVM、JRE 和 JDK 的区别到自动拆装箱的原理。 一、JVM、JRE 和 JDK 的区别 JVM(Java Virtual Machine)是 Java 程序的运行环境,它负责将 Java 字节码转换为机器码并...
5. 系统维护模块:包括日志管理、错误处理、系统设置等,保障系统稳定运行。 在开发过程中,可能会使用Maven或Gradle作为项目构建工具,管理依赖关系。同时,利用Git进行版本控制,确保代码的版本管理和团队协作。 ...
3. **自动装箱与拆箱**:Java 5.0引入了自动装箱和拆箱的概念,使得基本类型与对应的包装类之间可以无缝转换。例如,int和Integer之间可以自动进行装箱(int -> Integer)和拆箱(Integer -> int)操作,提高了编程...
1. **类型转换**:Java中的自动装箱和拆箱可能导致一些陷阱,比如Integer对象与int基本类型的比较。在处理数值时,不恰当的类型转换可能导致逻辑错误。 2. **变量作用域**:Java的局部变量、成员变量和静态变量的...
最后,Java 2 Platform Standard Edition 5.0(通常称为Java 5)的API帮助文档,标志着泛型、枚举类型、注解(Annotation)和自动装箱/拆箱等重要特性的引入。泛型提供了类型安全的集合操作,减少了类型转换错误;...
自动拆装箱是Java SE 5.0引入的一项特性,它允许基本数据类型和它们对应的包装类之间无缝转换。当一个包装类的对象赋值给基本类型的变量时,会自动进行拆箱,反之则进行装箱。例如,`Integer i = new Integer(5); ...
泛型是JAVA 1.5中最引人注目的特性之一,它允许开发者在类、接口或方法中声明类型参数,从而在编译时提供类型安全检查,避免了运行时的类型转换错误。在JAVA 1.4及更早版本中,集合框架只能存储`Object`类型的元素,...