快速业务通道

体验J2SE 1.5新特性之装箱和拆箱 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
);/* 输出“false” */

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

时间:2010-07-08

11. 对性能的妨碍

由于Autoboxing机制的实质是“自动创建能代表基本类型数据的对象”,所以,不可避免的会对性能造成一些妨碍。

如果只是利用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机制,可以用一种更简单的方式,来解决同时存在两套类型系统而造成的一些不方便。不过,这种机制并没有解决所有的相关问题,有些工作还是需要靠手工操作来进行。另外,由于不恰当的使用这一机制会造成一些性能方面的负面影响,所以在使用的时候还要注意一些问题才行。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号