java自动拆装箱的错误使用_JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > java自动拆装箱的错误使用

java自动拆装箱的错误使用

 2012/7/9 21:25:16  shilimin  程序员俱乐部  我要评论(0)
  • 摘要:今天有朋友问Integera=10;的内存使用,随便带出了自动拆装箱问题,以整型为例子进行说明1、自动装箱@Testpublicvoidfun1(){IntegerIi=null;intii=0;longs=System.currentTimeMillis();for(inti=0;i<100000;i++){Ii=i;}longe=System.currentTimeMillis();System.out.println(e-s);s=System.currentTimeMillis(
  • 标签:使用 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
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

发表评论
用户名: 匿名