做CS61B的homework6,碰到了一個(gè)問(wèn)題,本來(lái)想忽視翎冲,問(wèn)了之后才發(fā)現(xiàn)是大問(wèn)題。
前提:
我現(xiàn)在要構(gòu)造一個(gè)size = 100 的哈希表,里面裝LinkedList, 然后每個(gè)鏈表用來(lái)裝發(fā)生沖突的拆火,Key相等的類 Entry。
hashTable = new LinkedList<Entry>[sizeEstimate];
是錯(cuò)的涂圆。但是如果寫(xiě)们镜,
hashTable = (LinkedList<Entry>[])new LinkedList[sizeEstimate];
這么寫(xiě)就對(duì)了。
其中就涉及到 泛型的問(wèn)題润歉。之前也或多或少碰到過(guò)憎账。剛剛仔細(xì)查了下,有些收獲卡辰,總體而言胞皱,如下。
Java中的數(shù)組必須知道它所持有的確切類型九妈。
然而反砌,對(duì)于一個(gè)泛型,程序無(wú)法獲得它的具體的參數(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è)問(wèn)題有什么解決方法零如。
方法一就是用 Cast,如我上所說(shuō)锄弱。但也有不好的地方考蕾。強(qiáng)制轉(zhuǎn)換對(duì)程序影響不好。具體哪里不好我也不懂会宪,那老頭這么說(shuō)的肖卧。那就這么說(shuō)吧。
方法二:用ArrayList 來(lái)解決問(wèn)題掸鹅。
先說(shuō)下塞帐,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!