做CS61B的homework6,碰到了一個(gè)問題,本來想忽視,問了之后才發(fā)現(xiàn)是大問題。
前提:
我現(xiàn)在要構(gòu)造一個(gè)size = 100 的哈希表,里面裝LinkedList, 然后每個(gè)鏈表用來裝發(fā)生沖突的,Key相等的類 Entry。
hashTable = new LinkedList<Entry>[sizeEstimate];
是錯(cuò)的。但是如果寫,
hashTable = (LinkedList<Entry>[])new LinkedList[sizeEstimate];
這么寫就對(duì)了。
其中就涉及到 泛型的問題。之前也或多或少碰到過。剛剛仔細(xì)查了下,有些收獲,總體而言,如下。
Java中的數(shù)組必須知道它所持有的確切類型。
然而,對(duì)于一個(gè)泛型,程序無法獲得它的具體的參數(shù)類型。
即,**數(shù)組是具體化的(reified),而泛型在運(yùn)行時(shí)是被擦除的(erasure)。這句話的意思是數(shù)組是在運(yùn)行時(shí)才去判斷數(shù)組元素的類型約束,而泛型正好相反,在運(yùn)行時(shí),泛型的類型信息是會(huì)被擦除的,只有編譯的時(shí)候才會(huì)對(duì)類型進(jìn)行強(qiáng)化。 **
所以數(shù)組和泛型是水火不容的。
那么這個(gè)問題有什么解決方法。
方法一就是用 Cast,如我上所說。但也有不好的地方。強(qiáng)制轉(zhuǎn)換對(duì)程序影響不好。具體哪里不好我也不懂,那老頭這么說的。那就這么說吧。
方法二:用ArrayList 來解決問題。
先說下,ArrayList。目前我的理解。
他是一個(gè)List,實(shí)現(xiàn)了List的接口,但同時(shí),他又擁有一些Array的特點(diǎn)。
比如,
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處插入元素時(shí),就:
(a.get(87)).add(new Entry());
然后,這個(gè)的復(fù)雜度只有O(1).也就是,基本實(shí)現(xiàn)了數(shù)組的特征,可以常數(shù)時(shí)間內(nèi)快速定位。實(shí)現(xiàn)操作。而且,這個(gè)ArrayList 可以動(dòng)態(tài)改變大小。畢竟本質(zhì)是List.
但同時(shí),他又擁有List的屬性,比如, remove(), 等,都是線性的。
有時(shí)間可以好好研究下源碼。
要做的好多啊。。
最推薦的泛型的一個(gè)文章。
http://zddava.iteye.com/blog/352850
下面幾個(gè)也都還不錯(cuò)。
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
**
總結(jié):
Java泛型, ArrayList
**
今天妹子就要考托福了。希望她可以上92.
Anyway, Good luck, Richardo!