隨筆 - 81  文章 - 1033  trackbacks - 0
          <2007年5月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          在浮躁的年代里,我們進(jìn)取心太切,患得患失;虛榮心太強(qiáng),戰(zhàn)戰(zhàn)兢兢。一心爭(zhēng)強(qiáng)好勝,惟恐榜上無名。
          I think I can fly , and flying like a bird !
          程序員一名,已售出,缺貨中!

          我的郵件聯(lián)系方式

          用且僅用于MSN

          博客點(diǎn)擊率
          free web counter
          free web counter

          常用鏈接

          留言簿(36)

          隨筆檔案

          搜索

          •  

          積分與排名

          • 積分 - 187343
          • 排名 - 309

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          本來只轉(zhuǎn)載了個(gè)鏈接,和一個(gè)簡(jiǎn)單的使用程序,但昨天不小心看到有人批判jdk1.5,先說java要強(qiáng)制轉(zhuǎn)型不好的問題沒解決,
          容器不能放基類型不好,接著說泛型沒用。而恰恰Jdk1.5中解決了這些問題,所以感嘆之余,把這篇文章改一下,詳細(xì)的說說泛型。

          一,Java中的泛型:
          在Java中能使用到泛型的多是容器類,如各種list map set,因?yàn)镴ava是單根繼承,所以容器里邊可以放的
          內(nèi)容是任何Object,所以從意義上講原本的設(shè)計(jì)才是泛型。但用過Java的人是否感覺每次轉(zhuǎn)型很麻煩呢?
          而且會(huì)有些錯(cuò)誤,比如一個(gè)容器內(nèi)放入了異質(zhì)對(duì)象,強(qiáng)制轉(zhuǎn)型的時(shí)候會(huì)出現(xiàn)cast異常。而這中錯(cuò)誤在編譯器是
          無從發(fā)現(xiàn)的。所以jdk1.5中提供了泛型,這個(gè)泛型其實(shí)是向c++靠攏了.好,我們先看幾個(gè)實(shí)例再細(xì)說原理。

          二,泛型的用法:(多個(gè)實(shí)例)

          1 實(shí)例A
          2 ArrayList < String > ?strList? = ? new ?ArrayList < String > ();
          3 strList.add( " 1 " );
          4 strList.add( " 2 " );
          5 strList.add( " 3 " );
          6 // 關(guān)鍵點(diǎn)(1)?注意下邊這行,沒有強(qiáng)制轉(zhuǎn)型
          7 String?str? = ?strList.get( 1 );
          8 // 關(guān)鍵點(diǎn)(2)然後我們加入,這個(gè)時(shí)候你會(huì)發(fā)現(xiàn)編譯器報(bào)錯(cuò),錯(cuò)誤在編譯器被發(fā)現(xiàn),錯(cuò)誤當(dāng)然是發(fā)現(xiàn)的越早越好
          9 strList.add( new ?Object());

          1 實(shí)例B
          2 ArrayList < Integer > ?iList? = ? new ?ArrayList < Integer > ();
          3 // 關(guān)鍵點(diǎn)(3)?注意直接把整數(shù)放入了集合中,而沒有用Integer包裹
          4 iList.add( 1 );
          5 iList.add( 2 );
          6 iList.add( 3 );
          7 // 關(guān)鍵點(diǎn)(4)同樣直接取出就是int
          8 int ?num? = ?iList.get( 1 );

          1 實(shí)例C
          2 // 關(guān)鍵點(diǎn)(5)展示一下key-value的時(shí)候要怎么寫,同時(shí)key和value也可以是基本類型了。
          3 HashMap < Integer,Integer > ?map? = ? new ?HashMap < Integer,Integer > ();
          4 map.put( 1 ,? 11 );
          5 map.put( 2 ,? 22 );
          6 map.put( 3 ,? 33 );
          7 int ?inum? = ?map.get( 1 );
          8

          三,看完了實(shí)例了,詳細(xì)來說說為什么吧
          首先jdk1.5中的泛型,第一個(gè)解決的問題,就是Java中很多不必要的強(qiáng)制轉(zhuǎn)型了,具體的實(shí)現(xiàn),我們以ArrayList
          為例,下邊是ArrayList中的片斷代碼:

          ?1ArrayList類的定義,這里加入了<E>
          ?2public?class?ArrayList<E>?extends?AbstractList<E>
          ?3????????implements?List<E>,?RandomAccess,?Cloneable,?java.io.Serializable
          ?4
          ?5//get方法,返回不再是Object?而是E
          ?6public?E?get(int?index)?{
          ?7????RangeCheck(index);
          ?8????return?elementData[index];
          ?9}

          10//add方法,參數(shù)不再是Object?而是E
          11public?boolean?add(E?o)?{
          12????ensureCapacity(size?+?1);??//?Increments?modCount!!
          13????elementData[size++]?=?o;
          14????return?true;
          15}

          16


          四,Boxing 和UnBoxing
          看到上邊的關(guān)鍵點(diǎn)(3)和(4)是否感覺驚奇呢,因?yàn)镴ava中煩人的除了強(qiáng)制轉(zhuǎn)型,另一個(gè)就是基礎(chǔ)類型了
          放入容器的時(shí)候要包裝,取出了還要轉(zhuǎn)回。Jdk1.5中解決了這個(gè)問題.如上邊的使用方法

          五,泛型的生命周期(使用注意事項(xiàng))
          如果我們?cè)囍袮rrayList<String> list的內(nèi)容序列化,然後再讀取出來,在使用的過程中會(huì)發(fā)現(xiàn)出錯(cuò),
          為什么呢?用Stream讀取一下回來的數(shù)據(jù),你會(huì)發(fā)現(xiàn)<String>不見了,list變成了普通的ArrayList,而不是
          參數(shù)化型別的ArrayList了,為什么會(huì)這樣呢 ?見下邊的比較

          六,C++的泛型和Java的泛型
          在泛型的實(shí)現(xiàn)上,C++和Java有著很大的不同,
          Java是擦拭法實(shí)現(xiàn)的
          C++是膨脹法實(shí)現(xiàn)的
          因?yàn)镴ava原本實(shí)現(xiàn)就是泛型的,現(xiàn)在加入型別,其實(shí)是"窄化",所以采用擦拭法,在實(shí)現(xiàn)上,其實(shí)是封裝了原本的
          ArrayList,這樣的話,對(duì)于下邊這些情況,Java的實(shí)現(xiàn)類只有一個(gè)。

          1ArrayList<Integer>??.;???public?class?ArrayList
          2ArrayList<String>??..;???--同上--
          3ArrayList<Double>??..;???--同上--
          4而C++采用的是膨脹法,對(duì)于上邊的三種情況實(shí)際是每一種型別都對(duì)應(yīng)一個(gè)實(shí)現(xiàn),實(shí)現(xiàn)類有多個(gè)
          5list<int>?li;????????????????class?list;?//int?版本
          6list<string>?ls;?????????????class?list;?//string?版本
          7list<double>?ld;?????????????class?list;?//double?版本????

          這就造成了,在序列化后,Java不能分清楚原來的ArrayList是
          ArrayList<Integer>還是ArrayList

          七,題外話,在很多東西的實(shí)現(xiàn)上C++和Java有很多不同
          例如運(yùn)算符的問題i=i++問題,詳細(xì)看這里
          例如在C++中能很好實(shí)現(xiàn)的double-checked locking單態(tài)模式,在Java中幾乎很難實(shí)現(xiàn) 詳細(xì)看這里
          還有就是上邊提到的泛型實(shí)現(xiàn)上。

          八,Jdk 1.5加入了不少新東西,有些能很大的提高開發(fā)質(zhì)量,例如Jdk1.4?,Jdk.15中StringBuffer的不同
          因?yàn)閺?。4轉(zhuǎn)入1。5不久,所以慢慢會(huì)發(fā)一些在1。5的使用過程中發(fā)現(xiàn)的東西。

          最后,我們還可以自己寫類似ArrayList這樣的泛型類,至于如何自定義泛型類,泛型方法請(qǐng)參見候捷先生的文章

          本文大部份內(nèi)容來自候捷寫的jdk1.5泛型的文章http://jjhou.csdn.net/javatwo-2004-gp-in-jdk15.pdf? 向他致敬。

          posted on 2007-01-09 21:33 cresposhi 閱讀(267) 評(píng)論(4)  編輯  收藏

          FeedBack:
          # re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 【轉(zhuǎn)載】 2007-02-02 15:08 梅穎
          哈哈,又搶了個(gè)位置,嘻嘻  回復(fù)  更多評(píng)論
            
          # re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 【轉(zhuǎn)載】 2007-02-06 12:58 梅穎
          popo,在在,呵呵,餓到不行了我,看你的博客充饑。。。  回復(fù)  更多評(píng)論
            
          # re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 【轉(zhuǎn)載】[未登錄] 2007-05-16 14:37 dreamstone
          轉(zhuǎn)載的話表明一下出處比較好  回復(fù)  更多評(píng)論
            
          # re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 【轉(zhuǎn)載】 2007-05-16 14:41 cresposhi
          @dreamstone
          確實(shí),這篇還是我剛開始寫blog時(shí)候轉(zhuǎn)載的,不知道把出處要寫在上面,現(xiàn)在轉(zhuǎn)載的都寫了。我也不記得這篇文章是哪里轉(zhuǎn)載來的,相比dreamstone兄肯定知道吧,不會(huì)是你寫的吧,呵呵。如果是,請(qǐng)告知,我馬上加上!
          不好意思  回復(fù)  更多評(píng)論
            

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 武威市| 兴业县| 当雄县| 郸城县| 轮台县| 时尚| 万山特区| 台山市| 左权县| 岐山县| 石狮市| 崇左市| 松桃| 辉县市| 天全县| 同心县| 深泽县| 中宁县| 桦川县| 衡水市| 大安市| 抚顺县| 五常市| 乌兰察布市| 交口县| 天镇县| 琼结县| 益阳市| 肥西县| 太原市| 揭东县| 鄂尔多斯市| 沂水县| 东光县| 扶绥县| 策勒县| 伊金霍洛旗| 佛教| 青州市| 巴东县| 嵩明县|