<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    love fish大鵬一曰同風(fēng)起,扶搖直上九萬里

    常用鏈接

    統(tǒng)計(jì)

    積分與排名

    friends

    link

    最新評(píng)論

    Jdk1.5中的新特性 --泛型 (詳細(xì)版)(轉(zhuǎn))

    本來只轉(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? 向他致敬。



    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 2006-11-08 13:33 石頭[匿名]

    不錯(cuò),值的學(xué)習(xí)??回復(fù)??更多評(píng)論??

    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 2006-11-10 11:31 大光

    謝謝,以前真的一點(diǎn)都不知道~~??回復(fù)??更多評(píng)論??

    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 2007-01-09 21:10 施偉

    讀了,不錯(cuò)??回復(fù)??更多評(píng)論??

    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 2007-02-04 00:07 小神

    謝謝.. ??回復(fù)??更多評(píng)論??

    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版) 2007-02-18 01:18 喜來了

    總覺得Java 1.5中有很多概念不如原來那么一致和優(yōu)雅. 比如很多情況下需要借助bridge方法. 對(duì)初學(xué)者來說, Java 1.5的魅力肯定有所減少. Java1.5 Generics的開發(fā)花了5年多的時(shí)間, 相信如果不是C#的壓力,到現(xiàn)在也不一定能發(fā)布呢. 很顯然的Java1.5恰恰預(yù)示了我們需要下一個(gè)更好的語言, 不知道是哪個(gè)? 現(xiàn)在有原來搞Java的大牛都轉(zhuǎn)向Ruby了. 一直到現(xiàn)在還沒有時(shí)間去看看Ruby到底怎么樣, 據(jù)說是小日本搞出來的. ??回復(fù)??更多評(píng)論??

    #?re: Jdk1.5中的新特性 --泛型 (詳細(xì)版)2007-02-20 09:47 kedou

    泛型是一個(gè)挺有趣的東東,繼續(xù)使用ing~~~~~~??回復(fù)??更多評(píng)論??

    posted on 2007-02-26 09:37 liaojiyong 閱讀(454) 評(píng)論(0)  編輯  收藏 所屬分類: Java

    主站蜘蛛池模板: 亚洲午夜激情视频| 亚洲人成77777在线播放网站不卡 亚洲人成77777在线观看网 | 国产成人精品久久亚洲高清不卡 | 国产精品1024在线永久免费 | 亚洲一级二级三级不卡| 午夜两性色视频免费网站| 国产99久久久国产精免费| 亚洲乱码一二三四五六区| 国产成人亚洲影院在线观看| 最近最好最新2019中文字幕免费| 亚洲成aⅴ人片久青草影院按摩| 日韩一卡2卡3卡4卡新区亚洲 | 国产一卡二卡四卡免费| 无人视频免费观看免费视频 | a级黄色毛片免费播放视频| 日韩亚洲产在线观看| 亚洲国产第一站精品蜜芽| 国产精品免费播放| 一级毛片全部免费播放| 青青草97国产精品免费观看| 亚洲av成人一区二区三区| 国产V亚洲V天堂无码久久久| 国产精品麻豆免费版| 四虎成年永久免费网站| 久久精品免费网站网| 国产精品亚洲片在线花蝴蝶| 亚洲婷婷综合色高清在线| 亚洲精品无码成人片久久| 免费无遮挡无码永久在线观看视频| 中文字幕免费高清视频| 中文成人久久久久影院免费观看| 亚洲AV日韩AV一区二区三曲| 亚洲免费二区三区| 亚洲精品免费视频| 亚洲人成人网站色www| 免费一级特黄特色大片在线| 24小时日本在线www免费的| 亚洲成人在线免费观看| 欧洲人成在线免费| a国产成人免费视频| 一级毛片高清免费播放|