HashMap实现为数组+链表
Map.Entry为一个接口,表示一个键值对。entrySet()方法返回这个类型。
Hash默认使用对象的地址计算散列码,所以自己写一些容器类型的比较,排序的时候,应该同时覆盖hashCode()和equals()两个方法,否则将使用默认的Object的equals()方法,即比较对象地址。
</pre><pre name="code" class="java">import java.util.AbstractMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;
class MapEntry<K,V> implements Map.Entry<K, V>{
private K key;
private V value;
public MapEntry(K key, V value){
this.key = key;
this.value = value;
}
@Override
public K getKey() {
// TODO Auto-generated method stub
return null;
}
@Override
public V getValue() {
// TODO Auto-generated method stub
return null;
}
@Override
public V setValue(V value) {
// TODO Auto-generated method stub
return null;
}
}
public class TestMap<K,V> extends AbstractMap<K,V> {
static final int SIZE = 997;
LinkedList<MapEntry<K,V>>[] buckets = new LinkedList[SIZE];
public V put(K key, V value){
V oldValue = null;
int index = Math.abs(key.hashCode());
if(buckets[index] == null)
buckets[index] = new LinkedList<MapEntry<K, V>>();
LinkedList<MapEntry<K,V>> bucket = buckets[index];//查找用
MapEntry<K, V> pair = new MapEntry<K,V>(key, value);
ListIterator<MapEntry<K,V>> it = bucket.listIterator();
boolean found = false;
while(it.hasNext()){
//searching....
}
if(!found)
buckets[index].add(pair);
return oldValue;
}
public static void main(String[] args){
LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>();
}
@Override
public Set<java.util.Map.Entry<K, V>> entrySet() {
// TODO Auto-generated method stub
return null;
}
}