lotusswan

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            11 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks
          Java 5.0中最大的特性是引入了泛型,而引入泛型影響最大的就是幾個(gè)集合類。前一次我簡要記錄了一下學(xué)習(xí)List的筆記,本次我將概要地描述一下泛型在集合中的其他應(yīng)用。
          1.指定一個(gè)類型參數(shù)
          一個(gè)類型參數(shù)主要針對List、Set等集合類而言,具體處理和List大同小異,不再贅述。
          2.指定兩個(gè)類型參數(shù)
          兩個(gè)類型參數(shù)主要針對Map集合類。Map類會(huì)存儲(chǔ)一對元素:鍵-值對,自然就會(huì)對應(yīng)著兩種類型。通List一樣,使用Map時(shí)只需要指定參數(shù)類型就可以了,不同之處在于需同時(shí)指定鍵類型和值類型:
          ??????? Map<String, String> map = new HashMap<String, String>();
          如果理解了泛型的核心概念:所謂參數(shù)類型,不過是占位符而已;那么使用一個(gè)類型參數(shù)還是兩個(gè)類型參數(shù)其實(shí)沒有任何差別。
          3.使用Iterator
          如果集合類使用了類型參數(shù),則定義相應(yīng)的迭代器時(shí)也必須指定類型參數(shù),例如:
          ??????? Map<Integer, String> map = new TreeMap<Integer, String>();
          ????????Interator iter = map.keySet().iterator();
          上面的語句就是無法編譯的,因?yàn)镮terator和Map不配套;不過,反過來,如果集合類沒有使用類型參數(shù),而Iterator使用了類型參數(shù),這種情況是允許的,之所以這樣,主要是為了方便,省掉獲取元素必須進(jìn)行映射的步驟。例如下面的語句:
          ??????? Map map = new TreeMap();
          ????????Interator<Integer> iter = map.keySet().iterator();
          則是合法的,不過建議你別這么做,否則你是自找麻煩。因?yàn)閷τ谙旅娴恼Z句:
          Map?map? = ? new ?HashMap();
          ????????map.put(
          " zero " ,? " class?1 "
          );
          ????????map.put(
          1 ,? " class?2 "
          );
          ????????map.put(
          " two " ,? " class?3 "
          );
          ????????map.put(
          " three " ,? " class?4 "
          );
          ????????map.put(
          " four " ,? 3
          );
          ????????
          ????????Iterator
          < String > ?iter? =
          ?map.keySet().iterator();????
          ????????
          while (iter.hasNext())?
          {
          ????????????System.out.println(iter.next());
          ????????}
          你能期望得到什么?上面的語句編譯時(shí)不會(huì)出錯(cuò),不過運(yùn)行時(shí)可能讓你大吃一驚。所以為了減少運(yùn)行時(shí)出錯(cuò)的可能,建議你盡量使用參數(shù)化類型。
          4.函數(shù)形參參數(shù)類型化
          我們也可以指定函數(shù)形參的參數(shù)類型,例如:
          private ? void ?printListOfStrings(List < String > ?list,?PrintStream?out)? throws ?IOException? {
          ???????
          for ?(Iterator < String > ?i? = ?list.iterator(?);?i.hasNext(?);?)?
          {
          ???????out.println(i.next(?));
          ???????}

          ?????}
          5.返回值參數(shù)類型化
          除了可以使用集合體時(shí)采用參數(shù)化類型,返回值也可以采用參數(shù)類型化,例如:
          private ?List < String > ?getListOfStrings(?)? {
          ????????List
          < String > ?list? = ? new ?LinkedList < String >
          ();
          ????????list.add(
          " Hello "
          );
          ????????
          return
          ?list;
          ??????}
          總之,引入泛型的目的就是為了減少編程時(shí)的錯(cuò)誤,盡量將錯(cuò)誤在編譯時(shí)就發(fā)現(xiàn),而不是遺留到運(yùn)行時(shí),所以我們應(yīng)該盡可能地運(yùn)用好泛型這一強(qiáng)大的工具提高我們的編程能力。下面以一個(gè)很粗糙的例子作為本文的終結(jié):
          package ?com.jiang.tiger.chap1;

          import
          ?java.util.ArrayList;
          import
          ?java.util.Collection;
          import
          ?java.util.Iterator;
          import
          ?java.util.List;
          import
          ?java.util.Map;
          import
          ?java.util.HashMap;
          import
          ?java.util.Set;
          import
          ?java.util.TreeMap;

          public ? class ?IteratorTester?
          {
          ????
          public ? static ?Map?MapInitial(Class?type)?
          {
          ????????Map
          < Integer,?String > ?map? = ? null
          ;
          ????????
          try ?
          {
          ????????????map?
          = ?(Map < Integer,?String >
          )?type.newInstance();
          ????????????map.put(
          0 ,? " class?1 "
          );
          ????????????map.put(
          1 ,? " class?2 "
          );
          ????????????map.put(
          2 ,? " class?3 "
          );
          ????????????map.put(
          3 ,? " class?4 "
          );
          ????????????map.put(
          4 ,? " calss?4 "
          );
          ????????}
          ? catch ?(InstantiationException?e)? {
          ????????????
          // ?TODO?自動(dòng)生成?catch?塊

          ????????????e.printStackTrace();
          ????????}
          ? catch ?(IllegalAccessException?e)? {
          ????????????
          // ?TODO?自動(dòng)生成?catch?塊

          ????????????e.printStackTrace();
          ????????}

          ????????
          return ?map;
          ????}

          ????
          ????
          public ? static ? void ?CollectionIterator()? {
          ????????Map
          < Integer,?String > ?map? = ?MapInitial(( new ?HashMap < Integer,?String >
          ()).getClass());
          ????????Collection
          < String > ?list? =
          ?map.values();
          ????????Iterator
          < String > ?iter? =
          ?list.iterator();
          ????????
          ????????
          while (iter.hasNext())?
          {
          ????????????System.out.println(iter.next());
          ????????}

          ?????}

          ????
          ????
          public ? static ? void ?ListIterator()? {
          ????????Map
          < Integer,?String > ?map? = ?MapInitial(( new ?TreeMap < Integer,?String >
          ()).getClass());
          ????????List
          < String > ?list? = ? new ?ArrayList < String >
          ();
          ????????Set
          < Integer > ?set? =
          ?map.keySet();
          ????????Iterator
          < Integer > ?iter? =
          ?set.iterator();
          ????????
          ????????
          while (iter.hasNext())?
          {
          ????????????list.add(map.get(iter.next()));
          ????????}

          ????????
          ????????Iterator
          < String > ?iterator? = ?list.iterator();
          ????????
          while (iterator.hasNext())?
          {
          ????????????System.out.println(iterator.next());
          ????????}

          ????}

          ????
          ????
          public ? static ? void ?main(String[]?args) {
          ????????CollectionIterator();
          ????????ListIterator();
          ????}

          }

          上面程序的運(yùn)行結(jié)果如下所示:
          class? 3
          calss?
          4
          class?
          2
          class?
          4
          class?
          1
          class?
          1
          class?
          2
          class?
          3
          class?
          4
          calss?
          4
          posted on 2006-12-04 21:50 lotusswan 閱讀(1237) 評論(0)  編輯  收藏 所屬分類: Tiger學(xué)習(xí)筆記
          主站蜘蛛池模板: 昌都县| 广东省| 交城县| 宝坻区| 镇雄县| 峡江县| 玛沁县| 农安县| 马鞍山市| 通海县| 澄江县| 温宿县| 福海县| 务川| 湟源县| 柞水县| 高州市| 邓州市| 虎林市| 皋兰县| 南江县| 砀山县| 陇西县| 滨州市| 土默特右旗| 峨山| 南乐县| 盘山县| 汕头市| 阿拉尔市| 新泰市| 西乡县| 奈曼旗| 阳信县| 叙永县| 稷山县| 武强县| 石景山区| 营口市| 河北省| 卓资县|