做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!