Hashmap( 四 )

我们把关键的方法拿出来分析:void addEntry(int hash, Object key, Object value, int bucketIndex) {table[bucketIndex] = new Entry(hash, key, value, table[bucketIndex]);因为 hash 的算法有可能令不同的键值有相同的hash码并有相同的table索引,如:key=“33”和key=Object g的hash都是-8901334,那它经过indexfor之后的索引一定都为i,这样在new的时候这个Entry的next就会指向这个原本的table[i],再有下一个也如此,形成一个鍊表,和put的循环对定e.next获得旧的值 。到这里,HashMap的结构,大家也十分明白了吧? if (size++ >= threshold) //这个threshold就是能实际容纳的量resize(2 * table.length); //超出这个容量就会将Object table重构所谓的重构也不神,就是建一个两倍大的table(我在别的论坛上看到有人说是两倍加1,把我骗了),然后再一个个indexfor进去!注意!!这就是效率!!如果你能让你的HashMap不需要重构那幺多次,效率会大大提高!说到这里也差不多了,get比put简单得多,大家,了解put,get也差不了多少了 。对于collections我是认为,它是适合广泛的,当不完全适合特有的,如果大家的程式需要特殊的用途,自己写吧,其实很简单 。(作者是这样跟我说的,他还建议我用LinkedHashMap,我看了源码以后发现,LinkHashMap其实就是继承HashMap的,然后override相应的方法,有兴趣的同人,自己looklook)建个 Object table,写相应的算法,就ok啦 。举个例子吧,像 Vector,list 啊什幺的其实都很简单,最多就多了的同步的声明,其实如果要实现像Vector那种,插入,删除不多的,可以用一个Object table来实现,按索引存取,添加等 。如果插入,删除比较多的,可以建两个Object table,然后每个元素用含有next结构的,一个table存,如果要插入到i,但是i已经有元素,用next连起来,然后size++,并在另一个table记录其位置 。