Vincent

          Vicent's blog
          隨筆 - 74, 文章 - 0, 評論 - 5, 引用 - 0
          數據加載中……

          自動包裝機制

          ?
          管中窺虎

          在學習java 1.5的過程中,我使用了sun公布的tutorial,這份文檔寫的比較詳盡易明,但是對于想快速了解tiger而且具有較好java基礎的人來說,大篇幅的英文文檔是比較耗時間和非必需的,所以我將會歸納這份文檔的主要內容,在保證理解的底線上,盡力減少閱讀者需要的時間。

          ?

          在以下地址可以進入各新增語言特色介紹以及下載相關文檔(若有)。

          http://java.sun.com/j2se/1.5.0/docs/relnotes/features.html

          ?

          ?

          2006815星期二

          第三道虎紋:自動包裝機制

          ?

          我們知道容器類不能放基本類型的,放進放出都要先包裝和解包,所有的這些工作都是繁瑣而無聊的,它早就該有自動機制了,終于在 1.5 里得到了實現。

          ?

          import ?java.util. * ;

          ?

          // ?Prints?a?frequency?table?of?the?words?on?the?command?line

          public ? class ?Frequency? {

          ???
          public ? static ? void ?main(String[]?args)? {

          ??????Map
          < String,?Integer > ?m? = ? new ?TreeMap < String,?Integer > ();

          ??????
          for ?(String?word?:?args)? {

          ??????????Integer?freq?
          = ?m.get(word);

          ??????????m.put(word,?(freq?
          == ? null ? ? ? 1 ?:?freq? + ? 1 ));

          ??????}


          ??????System.out.println(m);

          ???}


          }


          java Frequency if it is to be it is up to me to do the watusi

          {be=1, do=1, if=1, is=2, it=2, me=1, the=1, to=3, up=1, watusi=1}

          ?

          注意到 freq 如果為空,那么 put 的第二個參數就是 int 類型的 1 ,這個時候就出現了自動的包裝,而如果 freq 不為空,那么 freq 1 就是自動解包后運算,再自動包裝,放入 Map 中。

          現在你基本上可以忽略 Integer int (或者這一類的對應)之間的區別了,除了要注意幾點警告: Integer 是可以為 null 的,如果程序試圖自動解包一個 null ,會拋出 NullPointerException 。

          ==用于 Integer 時比的是引用,用于 int 的時候比的是值。最后,還有一點就是即使現在是自動解包打包,它們的運行損耗并沒消失,你依然為這些動作付出了 cpu 的計算時間。

          ?

          這里還有一個相關的例子:

          // ?List?adapter?for?primitive?int?array

          public ? static ?List < Integer > ?asList( final ? int []?a)? {

          ????
          return ? new ?AbstractList < Integer > ()? {

          ????????
          public ?Integer?get( int ?i)? {? return ?a[i];?}

          ????????
          // ?Throws?NullPointerException?if?val?==?null

          ????????
          public ?Integer?set( int ?i,?Integer?val)? {

          ????????????Integer?oldVal?
          = ?a[i];

          ????????????a[i]?
          = ?val;

          ????????????
          return ?oldVal;

          ????????}


          ????????
          public ? int ?size()? {? return ?a.length;?}

          ????}
          ;

          }


          ?

          通過自動的包裝機制,提供了數組與 List 的靈活轉換,但是它的運行效率是比較低的,每個 get , set 操作,都進行了解包或者打包,偶爾使用這個方法還湊合,如果是用于核心代碼的循環里,那就是夠傻的了。

          ?

          那我們什么時候該用自動的包裝機制呢?僅僅是用于消除這類所謂的“阻抗不匹配”,就是基本類型與包裝類的差異,例如要把數值放入容器類的時候。如果在進行科學計算的代碼或者其他講究效率的代碼中使用,則是不恰當的。一個 Integer 不是一個 int ,自動包裝機制僅僅模糊了它們的區別,而沒有消除之。

          posted on 2006-08-22 11:17 Binary 閱讀(790) 評論(0)  編輯  收藏 所屬分類: j2se

          主站蜘蛛池模板: 六枝特区| 新丰县| 夹江县| 莱阳市| 会昌县| 永川市| 郸城县| 嵩明县| 清水县| 乐安县| 南平市| 舒城县| 新绛县| 吕梁市| 边坝县| 安陆市| 邮箱| 车致| 墨竹工卡县| 夹江县| 象山县| 万山特区| 萍乡市| 峨边| 定陶县| 清原| 泰宁县| 夏津县| 丰镇市| 平顶山市| 九寨沟县| 江华| 望都县| 周宁县| 安吉县| 普定县| 遂溪县| 东乡县| 甘南县| 平泉县| 东乌|