hashmap的简单实现_JAVA_编程开发_程序员俱乐部
    
    
    
    
    
        
    
    
    
 
    
        
            
            
            
                
                    
                        hashmap的简单实现
                
                
                
                    
                        - 摘要:来自ThinkingInJava【P493】。JavaCode1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859packageorg.vocano.java.tst;importjava.util.*;publicclassSimpleHashMap<K,V>extendsAbstractMap<K,V>
- 标签:has 实现 Map Hash 
 
                
                    
                    
- 来自Thinking In Java【P493】。
 ?Java Code?
1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
?
package?org.vocano.java.tst;
 
 import?java.util.*;
 
 public?class?SimpleHashMap<K,V>?extends?AbstractMap<K,V>?{
 ????//?Choose?a?prime?number?for?the?hash?table
 ????//?size,?to?achieve?a?uniform?distribution:
 ????static?final?int?SIZE?=?997;
 ????//?You?can't?have?a?physical?array?of?generics,
 ????//?but?you?can?upcast?to?one:
 ????@SuppressWarnings("unchecked")
 ????LinkedList<SimpleEntry<K,V>>[]?buckets?=
 ????????new?LinkedList[SIZE];
 ????public?V?put(K?key,?V?value)?{
 ????????V?oldValue?=?null;
 ????????int?index?=?Math.abs(key.hashCode())?%?SIZE;
 ????????if(buckets[index]?==?null)
 ????????????buckets[index]?=?new?LinkedList<SimpleEntry<K,V>>();
 ????????LinkedList<SimpleEntry<K,V>>?bucket?=?buckets[index];
 ????????SimpleEntry<K,V>?pair?=?new?SimpleEntry<K,V>(key,?value);
 ????????boolean?found?=?false;
 ????????ListIterator<SimpleEntry<K,V>>?it?=?bucket.listIterator();
 ????????while(it.hasNext())?{
 ????????????SimpleEntry<K,V>?iPair?=?it.next();
 ????????????if(iPair.getKey().equals(key))?{
 ????????????????oldValue?=?iPair.getValue();
 ????????????????it.set(pair);?//?Replace?old?with?new
 ????????????????found?=?true;
 ????????????????break;
 ????????????}
 ????????}
 ????????if(!found)
 ????????????buckets[index].add(pair);
 ????????return?oldValue;
 ????}
 ????public?V?get(Object?key)?{
 ????????int?index?=?Math.abs(key.hashCode())?%?SIZE;
 ????????if(buckets[index]?==?null)?return?null;
 ????????for(SimpleEntry<K,V>?iPair?:?buckets[index])
 ????????????if(iPair.getKey().equals(key))
 ????????????????return?iPair.getValue();
 ????????return?null;
 ????}
 ????public?Set<Map.Entry<K,V>>?entrySet()?{
 ????????Set<Map.Entry<K,V>>?set=?new?HashSet<Map.Entry<K,V>>();
 ????????for(LinkedList<SimpleEntry<K,V>>?bucket?:?buckets)?{
 ????????????if(bucket?==?null)?continue;
 ????????????for(SimpleEntry<K,V>?mpair?:?bucket)
 ????????????????set.add(mpair);
 ????????}
 ????????return?set;
 ????}
 ????public?static?void?main(String[]?args)?{
 ????????SimpleHashMap<String,String>?m?=
 ????????????new?SimpleHashMap<String,String>();
 ????????m.put("a",?"b");
 ????????System.out.println(m.get("a"));
 ????}
 }??