Java - 泛型的理解

做CS61B的homework6,碰到了一個問題,本來想忽視,問了之后才發現是大問題。
前提:
我現在要構造一個size = 100 的哈希表,里面裝LinkedList, 然后每個鏈表用來裝發生沖突的,Key相等的類 Entry。

hashTable = new LinkedList<Entry>[sizeEstimate];
是錯的。但是如果寫,
hashTable = (LinkedList<Entry>[])new LinkedList[sizeEstimate];
這么寫就對了。
其中就涉及到 泛型的問題。之前也或多或少碰到過。剛剛仔細查了下,有些收獲,總體而言,如下。
Java中的數組必須知道它所持有的確切類型。
然而,對于一個泛型,程序無法獲得它的具體的參數類型。
即,**數組是具體化的(reified),而泛型在運行時是被擦除的(erasure)。這句話的意思是數組是在運行時才去判斷數組元素的類型約束,而泛型正好相反,在運行時,泛型的類型信息是會被擦除的,只有編譯的時候才會對類型進行強化。 **
所以數組和泛型是水火不容的。
那么這個問題有什么解決方法。
方法一就是用 Cast,如我上所說。但也有不好的地方。強制轉換對程序影響不好。具體哪里不好我也不懂,那老頭這么說的。那就這么說吧。
方法二:用ArrayList 來解決問題。
先說下,ArrayList。目前我的理解。
他是一個List,實現了List的接口,但同時,他又擁有一些Array的特點。
比如,

ArrayList a = new ArrayList<LinkedList<Entry>>();
for (int i = 0; i < 100; i++)
        a.add(new LinkedList<Entry>());

就等效于:

hashTable = new LinkedList<Entry>[100]; //ILLEGAL!!違法的 

然后,需要在哈希值87處插入元素時,就:

(a.get(87)).add(new Entry());

然后,這個的復雜度只有O(1).也就是,基本實現了數組的特征,可以常數時間內快速定位。實現操作。而且,這個ArrayList 可以動態改變大小。畢竟本質是List.
但同時,他又擁有List的屬性,比如, remove(), 等,都是線性的。
有時間可以好好研究下源碼。

要做的好多啊。。
最推薦的泛型的一個文章。
http://zddava.iteye.com/blog/352850

下面幾個也都還不錯。
http://m.blog.csdn.net/blog/bhq2010/12653797
http://www.ibm.com/developerworks/cn/java/j-jtp01255.html
http://blog.csdn.net/eric_sunah/article/details/7262486

**
總結:
Java泛型, ArrayList
**

今天妹子就要考托福了。希望她可以上92.
Anyway, Good luck, Richardo!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • http://www.lxweimin.com/p/7e3e2b898143這是上次寫的泛型,當時其實還是一知半解。...
    Richardo92閱讀 392評論 0 1
  • 一、基本數據類型 注釋 單行注釋:// 區域注釋:/* */ 文檔注釋:/** */ 數值 對于byte類型而言...
    龍貓小爺閱讀 4,288評論 0 16
  • 泛型是Java SE1.5的新特性,泛型的本質是參數化類型,也就是說所操作的數據類型被指定為一個參數。這種參數類型...
    流氓劍客閱讀 263評論 0 0
  • 在經過一次沒有準備的面試后,發現自己雖然寫了兩年的android代碼,基礎知識卻忘的差不多了。這是程序員的大忌,沒...
    猿來如癡閱讀 2,872評論 3 10
  • 2010.9我(右3)和初中同學(右2) 一起考上了 北方的大學,正在前往城市-哈爾濱。高中好友們都過來機場相送。...
    愛嬌閱讀 214評論 0 2