程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> J2SE >> 體驗J2SE 1.5新特性之裝箱和拆箱(7)

體驗J2SE 1.5新特性之裝箱和拆箱(7)

編輯:J2SE

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機制,可以用一種更簡單的方式,來解決同時存在兩套類型系統而造成的一些不方便。不過,這種機制並沒有解決所有的相關問題,有些工作還是需要靠手工操作來進行。另外,由於不恰當的使用這一機制會造成一些性能方面的負面影響,所以在使用的時候還要注意一些問題才行。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved