体验J2SE 1.5新特性之装箱和拆箱

http://tech.ddvip.com   2006年11月27日    社区交流

本文详细介绍体验J2SE 1.5新特性之装箱和拆箱

  如果只是利用Autoboxing/Auto-Unboxing机制来保存基本类型的数据(例如把基本类型的数据放到Collection里面之类),这种影响倒还可以忽略,因为这只是把原来需要手工进行的工作自动化了;但是,如果要频繁的借助Autoboxing来给一个包裹类变量赋值,这开销很容易上升到需要加以注意的程度。

  注意对包裹类的变量使用“++”和“--”运算符的时候,也会创建新的对象,而不是在修改原来对象的状态。

  清单29:是替换不是修改

Integer i = new Integer(1);
Integer j = i;/* 让j、i指向同一对象 */
System.out.println(j == i);/* 目前j、i是同一对象,因此输出“true” */
i++;
System.out.println(j == i);/* 现在j、i是不同对象,因此输出“false” */
System.out.println(i);/* 现在i的值是“2” */
System.out.println(j);/* 而j的值仍是“1” */

  这个现象是由于Java里的包裹类是“不可变的(immutable)”——即没有提供一种能让自己所代表的值发生变化的途径——而造成的。

  在需要大量赋值操作的时候,可以通过适当使用一些基本类型的局部变量来减轻对性能方面的影响。不过,如果性能的瓶颈在于要往一个容器里频繁放入基本类型的数据的话,恐怕就得靠改用一些专门为容纳基本类型的数据而设计的容器类来解决了(例如Jarkata Commons Primitives组件里提供的那些)。

  清单30:一段需要往一个容器里频繁放入基本类型的数据的程序

import java.util.*;
public class WordCounter {
public static void main(String[] args) {
HashMap counts = new HashMap();
for (int i = 0; i < args.length; i++) {
String current = args[i];
if (counts.containsKey(current)) {
counts.put(current, ((Integer) counts.get(current)) + 1);
} else {
counts.put(current, 1);
}
}
for (Iterator itr = counts.keySet().iterator(); itr.hasNext();) {
String key = (String) itr.next();
System.out.println(key + ":" + counts.get(key));
}
}
}

  12. 归纳总结

  借助J2SE 1.5里提供的Autoboxing/Auto-Unboxing机制,可以用一种更简单的方式,来解决同时存在两套类型系统而造成的一些不方便。不过,这种机制并没有解决所有的相关问题,有些工作还是需要靠手工操作来进行。另外,由于不恰当的使用这一机制会造成一些性能方面的负面影响,所以在使用的时候还要注意一些问题才行。

责编:豆豆技术应用

正在加载评论...