標准Java庫只包含Dictionary的一個變種,名為:Hashtable。(散列表)
Java的散列表具有與AssocArray相同的接口(因為兩者都是從Dictionary繼承來的)。但有一個方面卻反映出了差別:執行效率。若仔細想想必須為一個get()做的事情,就會發現在一個Vector里搜索鍵的速度要慢得多。但此時用散列表卻可以加快不少速度。不必用冗長的線性搜索技術來查找一個鍵,而是用一個特殊的值,名為“散列碼”。散列碼可以獲取對象中的信息,然后將其轉換成那個對象“相對唯一”的整數(int)。所有對象都有一個散列碼,而hashCode()是根類Object 的一個方法。Hashtable 獲取對象的hashCode(),然后用它快速查找鍵。這樣可使性能得到大幅度提升。
/** * Created by xfyou on 2016/11/4. */ @SuppressWarnings("unchecked") public class AssocArray extends Dictionary { private Vector keys = new Vector(); private Vector values = new Vector(); @Override public int size() { return keys.size(); } @Override public boolean isEmpty() { return keys.isEmpty(); } @Override public Enumeration keys() { return keys.elements(); } @Override public Enumeration elements() { return values.elements(); } @Override public Object get(Object key) { int index = keys.indexOf(key); if (-1 == index) { return null; } return values.elementAt(index); } @Override public Object put(Object key, Object value) { if (!keys.contains(key)) { keys.addElement(key); values.addElement(value); return key; } return null; } @Override public Object remove(Object key) { int index = keys.indexOf(key); if (-1 == index) { return null; } keys.removeElementAt(index); Object retVal = values.elementAt(index); values.removeElementAt(index); return retVal; } public static void main(String[] args) { AssocArray aa = new AssocArray(); for (char c = 'a'; c <= 'z'; c++) { aa.put(String.valueOf(c), String.valueOf(c).toUpperCase()); } char[] ca = {'a', 'e', 'i', 'o', 'u'}; for (char aCa : ca) System.out.println("Uppercase: " + aa.get(String.valueOf(aCa))); } }