package com.other.test;import java.util.HashMap;/** * HashMap的簡單實現 * @author txxs * */public class MyOwnHashMap {/** * 取數組的大小為16 */private static final int SIZE = 16;private Entry table[] = new Entry[SIZE];/** * 我們要用key和value定義一個簡單的Map資料結構 * 它還用在鏈表中的桶的衝突處理,如果多個索引值對有 * 相同的hashcode,但是有不同的key,使用指標“next” */class Entry {final String key;String value;Entry next;Entry(String k, String v) {key = k;value = v;}public String getValue() {return value;}public void setValue(String value) {this.value = value;}public String getKey() {return key;}}/**在我們自己實現的HashMap中根據key返回value, * 如果是沒有和key對應的value返回空*/public Entry get(String k) {int hash = k.hashCode() % SIZE;Entry e = table[hash];//如果找到了對應的桶,那麼就沿著鏈尋找看看與key對應的value是否存在while(e != null) {if(e.key.equals(k)) {return e;}e = e.next;}return null;}/** * 在map中將特定的key和value關聯起來。 * 如果包含了相同的key,原來的舊值將會被替換掉*/public void put(String k, String v) {int hash=k.hashCode()%SIZE;Entry e=table[hash];if(e!=null){//檢查是否有相同的key,如果有用新值代替舊值while(e.next!=null){if(e.key.equals(k)){e.value=v;return ;}e=e.next;}//在鏈的末尾添加新的元素Entry entryInOldBucket=new Entry(k,v);e.next=entryInOldBucket;}else{//建立一個新桶Entry entryInNewBucket=new Entry(k,v);table[hash]=entryInNewBucket;}}// 測試public static void main(String[] args) {MyOwnHashMap tmhm = new MyOwnHashMap();HashMap map = new HashMap();map.put("Niranjan", "SMTS");map.put("Ananth", "SSE");map.put("Niranjan", "SMTS1");map.put("Chandu", "SSE");tmhm.put("Niranjan", "SMTS");tmhm.put("Ananth", "SSE");tmhm.put("Niranjan", "SMTS1");tmhm.put("Chandu", "SSE");//設定開始時間long startTime = System.nanoTime(); Entry e = tmhm.get("Niranjan");//設定結束時間long endTime = System.nanoTime(); long duration = endTime - startTime; System.out.println("自己實現的HashMap " + duration); //設定開始時間startTime = System.nanoTime(); String mapResult = (String) map.get("Niranjan");//設定結束時間endTime = System.nanoTime(); duration = endTime - startTime; System.out.println("原有的java.util.HashMap " + duration); System.out.println("自己實現的Map取值: "+e.getValue());System.out.println("原有的java.util.HashMap取值: "+mapResult);}}