利用自定义泛型,自己简单实现HashMap

泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。(来自百度百科)

 

实现步骤

1.首先HashMap表面保存的是Key和Value,但是实际上保存的是一个个的Entry,而Entry里面是Key和Value

 

  1. public class MyEntry<K, V> {
  2.     private K key;
  3.     private V value;
  4.     public K getKey() {
  5.         return key;
  6.     }
  7.     public void setKey(K key) {
  8.         this.key = key;
  9.     }
  10.     public V getValue() {
  11.         return value;
  12.     }
  13.     public void setValue(V value) {
  14.         this.value = value;
  15.     }
  16. }

2.利用泛型写自己的HashMap,继承HashSet,里有有一个entrys用来保存名-值对的集合。

 

 

  1. public class MyHashMap<K, V> extends HashSet {
  2.     private Set<MyEntry<K, V>> entrys = new HashSet<MyEntry<K, V>>();
  3. }

3.实现HashMap的put(K key, V value)和V get(K key)方法

 

 

  1. public void put(K key, V value) {
  2.         MyEntry<K, V> myEntry = new MyEntry<K, V>();
  3.         myEntry.setKey(key);
  4.         myEntry.setValue(value);
  5.         entrys.add(myEntry);
  6.     }
  7.     public V get(K key) {
  8.         V value = null;
  9.         for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) {
  10.             MyEntry<K, V> entry = i.next();
  11.             if (key.equals(entry.getKey())) {
  12.                 value = entry.getValue();
  13.                 break;
  14.             }
  15.         }
  16.         return value;
  17.     }

4.实现Set<MyEntry<K, V>> entrySet(),Set<K> keySet(),String toString()三个迭代方法

 

 

  1. public Set<MyEntry<K, V>> entrySet() {
  2.         return entrys;
  3.     }
  4.     public Set<K> keySet() {
  5.         Set<K> set = new HashSet<K>();
  6.         for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) {
  7.             MyEntry<K, V> myEntry = i.next();
  8.             set.add(myEntry.getKey());
  9.         }
  10.         return set;
  11.     }
  12.     @Override
  13.     public String toString() {
  14.         StringBuffer sb = new StringBuffer(“[“);
  15.         for (Iterator<MyEntry<K, V>> i = entrys.iterator(); i.hasNext();) {
  16.             MyEntry<K, V> myEntry = i.next();
  17.             sb.append(myEntry.getKey());
  18.             sb.append(“=”);
  19.             sb.append(myEntry.getValue());
  20.             sb.append(“,”);
  21.         }
  22.         sb.deleteCharAt(sb.length() – 1);
  23.         sb.append(“]”);
  24.         return sb.toString();
  25.     }

5.测试。

 

 

  1. public class Test {
  2.     /**
  3.      * @param args
  4.      */
  5.     public static void main(String[] args) {
  6.         // TODO Auto-generated method stub
  7.         MyHashMap<String, String> map = new MyHashMap<String, String>();
  8.         map.put(“hello1”, “world1”);
  9.         map.put(“hello2”, “world2”);
  10.         System.out.println(map);
  11.         Set<String> set = map.keySet();
  12.         for (String string : set) {
  13.             System.out.println(string);
  14.         }
  15.     }
  16. }

 

有图有真相,总结:HashMap就是自定义索引的Set


 

标签