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

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

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

    Dict.CN 在線詞典, 英語(yǔ)學(xué)習(xí), 在線翻譯

    都市淘沙者

    荔枝FM Everyone can be host

    統(tǒng)計(jì)

    留言簿(23)

    積分與排名

    優(yōu)秀學(xué)習(xí)網(wǎng)站

    友情連接

    閱讀排行榜

    評(píng)論排行榜

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

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

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

    二,泛型的用法:(多個(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) 注意下邊這行,沒(méi)有強(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ù)放入了集合中,而沒(méi)有用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í)候要怎么寫(xiě),同時(shí)key和value也可以是基本類(lèi)型了。
    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ì)來(lái)說(shuō)說(shuō)為什么吧
    首先jdk1.5中的泛型,第一個(gè)解決的問(wèn)題,就是Java中很多不必要的強(qiáng)制轉(zhuǎn)型了,具體的實(shí)現(xiàn),我們以ArrayList
    為例,下邊是ArrayList中的片斷代碼:

     1ArrayList類(lèi)的定義,這里加入了<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)是否感覺(jué)驚奇呢,因?yàn)镴ava中煩人的除了強(qiáng)制轉(zhuǎn)型,另一個(gè)就是基礎(chǔ)類(lèi)型了
    放入容器的時(shí)候要包裝,取出了還要轉(zhuǎn)回。Jdk1.5中解決了這個(gè)問(wèn)題.如上邊的使用方法

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

    六,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)類(lèi)只有一個(gè)。

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

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

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

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

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

    posted on 2007-06-08 15:40 都市淘沙者 閱讀(191) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): Java Basic/Lucene/開(kāi)源資料

    主站蜘蛛池模板: 一个人免费观看日本www视频 | 四虎影视永久免费视频观看| 亚洲欧洲国产精品久久| 欧洲人成在线免费| 亚洲AV日韩AV天堂一区二区三区| 中文在线观看永久免费| 亚洲精品美女久久久久99| 国产精品免费久久久久影院| 亚洲综合网站色欲色欲| 水蜜桃视频在线观看免费播放高清| 亚洲精品夜夜夜妓女网| 久久99热精品免费观看动漫| 亚洲一区二区中文| 国产无人区码卡二卡三卡免费 | 皇色在线免费视频| 亚洲国产精品乱码一区二区| 久久大香香蕉国产免费网站 | 亚洲国产日韩a在线播放| 热99re久久精品精品免费| 美女被吸屁股免费网站| MM131亚洲国产美女久久| 东方aⅴ免费观看久久av| 亚洲高清资源在线观看| 女人张腿给男人桶视频免费版 | 在线亚洲精品福利网址导航| 99精品视频免费| 色偷偷亚洲女人天堂观看欧| 免费一级毛片在线播放| 国产免费无码一区二区| 在线综合亚洲中文精品| 亚洲一级Av无码毛片久久精品 | 精品四虎免费观看国产高清午夜| 亚洲综合无码一区二区三区| 青苹果乐园免费高清在线| 黄色a三级免费看| 91大神亚洲影视在线| 成人毛片免费网站| av永久免费网站在线观看| 亚洲精品国产国语| 亚洲情综合五月天| 永久免费视频v片www|