HashMap是java数据结构中最常用的结构之一。
通过对于JDK的分析1.5.07的分析,对于HashMap的设计有个较为细致的了解。
1.Java HashMap中主要的成员变量有:
/** * The table, resized as necessary. Length MUST Always be a power of two. */ transient Entry[] table;
2.Java HashMap中Map.Entry<K,V>接口的实现是该类中的一个核心过程。
final K key; V value; Entry<K,V> next; final int hash; /** * Creates new entry. */ Entry(int h, K k, V v, Entry<K,V> n) { value = v; next = n; key = k; hash = h; } public final boolean equals(Object o) { if (!(o instanceof Map.Entry)) return false; Map.Entry e = (Map.Entry)o; Object k1 = getKey(); Object k2 = e.getKey(); if (k1 == k2 || (k1 != null && k1.equals(k2))) { Object v1 = getValue(); Object v2 = e.getValue(); if (v1 == v2 || (v1 != null && v1.equals(v2))) return true; } return false; }
其中的next 成员变量,存放了next的Entry。通过构造函数,创建了新的entry。
public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR); table = new Entry[DEFAULT_INITIAL_CAPACITY]; init(); }
Put方法是,通过addEntry建立新的Entry。
void addEntry(int hash, K key, V value, int bucketIndex) { Entry<K,V> e = table[bucketIndex]; table[bucketIndex] = new Entry<K,V>(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length); }
如果此时size到达了限值,则将数组扩容。
通过containsKey查找是否含有该key值。
public boolean containsKey(Object key) { return getEntry(key) != null; }
通过key找出在table数组中的入口,然后,遍历Entry。
final Entry<K,V> getEntry(Object key) { int hash = (key == null) ? 0 : hash(key.hashCode()); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
如果key为null,则默认放在table的第0个element中。
对于Entry的put,get,containsKey等操作,均为基本的数据结构内容。而容器类都实现了Iterator迭代器接口,从而可以遍历该容器对象。
4. Iterator接口的实现
我们结合java测试源代码进行一个分析:
public static void main(String[] args) { ArrayList<String> a = new ArrayList<String>(); a.add("str1"); HashMap<String, String> map = new HashMap<String, String>(); map.put("str1", "str2"); for (Iterator iter = map.entrySet().iterator(); iter.hasNext();) { Entry entry = (Entry)iter.next(); String key = (String)entry.getKey(); System.out.println("the key is: " + key); String value = (String) entry.getValue(); } if (map.containsKey("str2")) { System.out.println("found it."); } }
通过entrySet().iterator()对于该HashMap进行遍历。