自己实现HashMap

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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/**
 * hashmap的demo
 * @author cuiyc
 * @version 1.0
 * @date 2021/6/5 22:28
 */
public class HashMapDemo {
    public static void main(String[] args) {
 
        Map<String,String> hashmap=new HashMap<>();
 
        MyHashMap map=new MyHashMap();
        map.put("k1","v1");
        map.put("k2","v2");
        System.out.println("map的长度是,"+map.size);
        System.out.println("k2的value是,"+map.get("k2"));
        System.out.println("k1的value是,"+map.get("k1"));
    }
 
    private static class MyHashMap{
        private int size;
        LinkedList[] array =new LinkedList[999];
 
 
        public MyHashMap(){}
        public MyHashMap(int size){
            this.size=size;
        }
 
        //计算key的hashcode值
        final int hash(Object key){
            int h;
            return (key==null)?0:(h=key.hashCode())^(h>>>16);
        }
        //对数组的长度取模,得到应该存入的位置
        final int mode(int h){
            return h/array.length;
        }
 
        //得到size的值
        public int getSize(){
            return size;
        }
        //put方法
        public void put(Object key,Object value){
            //先把key 和 value放入entry对象中
            MyEntry myEntry=new MyEntry(key,value);
            //根据key值计算出hashcode值,然后得到应当在数组中存放的位置
            int hashValue=hash(key);
            //然后拿到hahscode值后,再和数组的长度取模计算出再数组中的一个位置
            hashValue=mode(hashValue);
            //若该位置为空,则直接添加链表
            if(array[hashValue]==null){
                LinkedList linkedList=new LinkedList();
                linkedList.add(myEntry);
                array[hashValue]=linkedList;
            }else {
                //否则,该位置是已经相同的key值,则需要遍历到key值的entry,然后更新。
                for (int i = 0; i < array[hashValue].size(); i++) {
                     MyEntry myentry= (MyEntry) array[hashValue].get(i);
                     if(key.equals(myentry.getKey())){
                         myentry.value=value;
                     }else {
                         array[hashValue].add(myEntry);
                     }
                }
            }
            size++;
        }
 
        //get方法
        public Object get(Object Key){
            int hashCode=mode(Key.hashCode());
            if(array[hashCode]!=null){
                for (int i = 0; i < array[hashCode].size(); i++) {
                   MyEntry myEntry= (MyEntry) array[hashCode].get(i);
                   if(Key.equals(myEntry.getKey())){
                       return myEntry.value;
                   }
                }
            }
            return null;
        }
    }
 
    //Entry数据结构
    private static class MyEntry<K,V> implements Map.Entry<K,V>{
        int hash;
        final K key;
        V value;
        MyEntry<K,V> next;
 
        MyEntry(int hash,K key,V value,MyEntry<K,V> next){
            this.hash=hash;
            this.key=key;this.value=value;this.next=next;
        }
 
        public MyEntry(K key,V value){
            this.key=key;this.value=value;
        }
 
 
 
        @Override
        public K getKey() {
            return key;
        }
 
        @Override
        public V getValue() {
            return value;
        }
 
        @Override
        public V setValue(V newValue) {
            V oldValue=value;
            value=newValue;
            return oldValue;
        }
 
        @Override
        public final boolean equals(Object o) {
            if (o == this){
                return true;
            }
            if (o instanceof Map.Entry) {
                Map.Entry<?,?> e = (Map.Entry<?,?>)o;
                if (Objects.equals(key, e.getKey()) &&
                        Objects.equals(value, e.getValue())){
                    return true;
                }
            }
            return false;
        }
 
        @Override
        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }
 
 
    }
}

  

posted @   小猫钓鱼吃鱼  阅读(59)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示