java---简单hashMap实现


1、什么是hash?,什么是hash表?
  hashmap jdk起到了一个以点概面的作用
1、什么是hash
它是将一个任意长度的二进制值通过一个映射关系转换成一个固定长度的二进制值
  1、任意长度的二进制值
  2、映射关系(哈希算法--就相当于一个大学里面的学号的一个映射规则)
  3、固定的二进制值(哈希值--相当于我们的大学里面的学号)
  任意长度的二进制值和固定长度的二进制值是一个一一对应关
  固定长度的二进制值就相当于一个任意长度的二进制值的一个摘要
  因定长度的二进制值相当于一个关键字key
  真正有效的数据就是这个学员的基本信息,一个任意长度的二进制值value

key ----- value
hash只是确定了一个key和一个value的唯一映射关系,
为什么要这么做:
2. hashtable
  特点:最重要的特点----它存储效率很高,取数据的时间复杂度是1  o(1)
  hash通过一个key一个输入,通过一个哈希函数,来找到数组中与这个key唯一映射的value
  根据这个haah函数找到数组中这个value的下标

3.哈希函数

  key,找下标,方法?

  1、取模

  int index = key%m;

  m的取值规则:

    m要取比数组长度小的最大质数

4.hash表处理冲突

  1、线性探测法:探测步长为1;

  2、链表形式

 哈希表存储规则:

优缺点:

优点:时间复杂度o(1),存取速度快

缺点:无序,耗内存存放key,空间换取时间

实现代码:

 1 package com.jove;
 2 
 3 public class DNHashMap<V, K> implements DNMap<K, V> {
 4     /**
 5      * 哈希表默认长度
 6      */
 7     private static Integer defaultLength = 16;
 8     
 9     /**
10      * 负载因子   当数组存放的数据达到defaultLength*defaultLoad就进行扩容
11      */
12     private static double defaultLoad = 0.75;
13 
14     /**
15      * 键值对数组
16      */
17     private Entry<K, V>[] table = null;
18     
19     private int size = 0;
20 
21     public DNHashMap(int defaultLength, double defaultLoad) {
22         this.defaultLength = DNHashMap.defaultLength;
23         this.defaultLoad = DNHashMap.defaultLoad;
24         table = new Entry[defaultLength];
25     }
26 
27     public DNHashMap() {
28         this(defaultLength, defaultLoad);
29     }
30 
31     public V put(K k, V v) {
32         int index = this.getIndex(k);
33         Entry<K, V> e = table[index];
34         if(e == null){
35             table[index]= new Entry(k,v,index,null);  
36         }else{
37             Entry entry = new Entry(k,v,index,e);
38             table[index] = entry;
39         }
40         return table[index].getValue();
41     }
42 
43     public V get(K k) {
44         int index = this.getIndex(k);
45         
46         return table[index] == null ? null:table[index].getValue();
47     }
48 
49     public int size() {
50         return size;
51     }
52 
53     /**
54      * 通过哈希算法之后获得键的索引号
55      * @param key
56      * @return
57      */
58     public int getIndex(K key) {
59         int m = defaultLength - 1;
60         return key.hashCode() % m;
61     }
62 
63     /**
64      * 内部类  Entry 用链表的形式存储entry
65      * @author jove
66      *
67      * @param <K> key
68      * @param <V> value
69      */
70     class Entry<K, V> implements DNMap.Entry<K, V> {
71         private K key;
72         private V value;
73         private int index;
74         private Entry<K, V> next;
75 
76         public Entry(K key, V value, int index, Entry<K, V> next) {
77             this.key = key;
78             this.value = value;
79             this.index = index;
80             this.next = next;
81         }
82 
83         public K getKey() {
84             return key;
85         }
86 
87         public V getValue() {
88             return value;
89         }
90 
91     }
92 }
View Code
 1 package com.jove;
 2 
 3 public interface DNMap<K,V> {
 4     V put(K k,V v);
 5     
 6     V get(K k);
 7     
 8     int size();
 9     
10     interface Entry<K,V>{
11         K getKey();
12         
13         V getValue();
14     }
15 }
View Code

测试代码:

 1 package com.jove;
 2 
 3 public class MapTest {
 4     public static void main(String[] args) {
 5         DNHashMap<Object,Object> map = new DNHashMap<>();
 6         map.put("hh", "j0ee");
 7         map.put("jj", "jove");
 8         
 9         System.out.println(map.get("hh"));
10         System.out.println(map.get("jj"));
11     }
12 }
View Code

 

posted on 2018-02-20 13:56  jovelove  阅读(285)  评论(0)    收藏  举报