HashMap的简单实现

 基本概念

Map 别名映射表,也叫关联数组,基本思想是它维护的键-值(对)关联,因此可以用键查找值,也有放入键值的操作,下面根据定义自己来实现一个Map,首先应该想到的是数组,因为大多数Java集合类底层都是基于数组和链表的,这里我给它命名叫做 MapVersion01

 1 public class MapVersion01<K,V> {
 2     //存储每一个键值对的数组
 3     private Object[][] pairs;
 4     //数组的容量
 5     private int index;
 6 
 7     public MapVersion01(int capacity) {
 8         this.pairs = new Object[capacity][2];
 9     }
10 
11     /**
12      * 插入的方法
13      * @param key
14      * @param value
15      */
16     public void  put(K key, V value) {
17         if(index >= pairs.length)
18             throw new IndexOutOfBoundsException();
19         pairs[index++] = new Object[]{key, value};
20     }
21 
22     /**
23      * 查找方法
24      * @param key
25      * @return
26      */
27     public V get(K key) {
28         for(int i = 0 ; i < index ; i++) {
29             if(key.equals(pairs[i][0]))
30                 return (V)pairs[i][1];
31         }
32         return null;
33     }
34 
35     @Override
36     public String toString() {
37         StringBuilder sb = new StringBuilder();
38         for(int i = 0 ; i < index ; i ++) {
39             sb.append(pairs[i][0]).toString();
40             sb.append(" : ");
41             sb.append(pairs[i][1].toString());
42             if(i < index - 1) {
43                 sb.append("
");
44             }
45         }
46         return sb.toString();
47     }
48 
49     public static void main(String[] args) {
50         MapVersion01<Integer,String> map = new MapVersion01<Integer,String>(10);
51         map.put(1,"111");
52         map.put(2,"222");
53         map.put(3,"333");
54         map.put(4,"444");
55         map.put(5,"555");
56         map.put(6,"666");
57         System.err.println(map);
58     }
单元测试结果:

这里为了方便查看,重写了toString方法,打印出每一个键值对儿,乍一看,实现起来貌似很简单,再看一下Map接口,好像少了点什么。对了,少了2样东西:

  1. 遍历hash表取键值对的方法;
  2. 分别得到所有键的集合、值的集合;

这2个问题应该很好实现,下面是我实现的:

 1 public Set<K> keySet() {
 2     Set<K> keySet = new HashSet<K>();
 3     if (pairs.length > 0) {
 4         for (int i = 0; i < index; i++) {
 5             K key = (K) pairs[i][0];
 6             keySet.add(key);
 7         }
 8     }
 9     return keySet;
10 }
11 
12 public Set<V> values() {
13     Set<V> values = new HashSet<V>();
14     if (pairs.length > 0) {
15         for (int i = 0; i < index; i++) {
16             V value = (V) pairs[i][1];
17             values.add(value);
18         }
19     }
20     return values;
21 }
22 
23 public Set<Entry<K, V>> entrySet() {
24     Set<Entry<K, V>> set = new HashSet<Entry<K, V>>();
25     if (pairs.length > 0) {
26         for (int i = 0; i < index; i++) {
27             K key = (K) pairs[i][0];
28             V value = (V) pairs[i][1];
29             Entry<K, V> entry = new Entry<K, V>(key, value);
30             set.add(entry);
31         }
32     }
33     return set;
34 }
35 
36 //键值对存放在一起的映射对象
37 private static class Entry<K, V> {
38     private K key;
39     private V value;
40 
41     public Entry(K key, V value) {
42         this.key = key;
43         this.value = value;
44     }
45 
46     public K getKey() {
47         return key;
48     }
49 
50     public void setKey(K key) {
51         this.key = key;
52     }
53 
54     public V getValue() {
55         return value;
56     }
57 
58     public void setValue(V value) {
59         this.value = value;
60     }
61 
62     @Override
63     public int hashCode() {
64         return (key == null ? 0 : key.hashCode()) ^ (value == null ? 0 : value.hashCode());
65     }
66 
67     @Override
68     public boolean equals(Object obj) {
69         if (!(obj instanceof Entry))
70             return false;
71         Entry<K, V> me = (Entry<K, V>) obj;
72         return (me.getKey() == null ? key == null : me.getKey().equals(key)) &&
73                 (me.getValue() == null ? value == null : me.getValue().equals(value));
74     }
75 }
原文地址:https://www.cnblogs.com/blentle/p/6604955.html