hashmap的简单实现

  1. 来自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"));
        }

     

你可能感兴趣的:(java,HashMap,thinkinginjava)