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,自动拆装箱)