您的位置:首页 > 编程语言 > Java开发

自行实现Map底层结构(数组+链表) --Java版

2016-07-19 10:36 441 查看
package Map;

import Collection.TestLinkedList;

/*
* 自定义实现Map功能(底层:数组+链表)
* Map:存放键值对,根据键找值
* 目的仅为更加了解该结构、编码部分不考虑细节
* 注意注释部分
* */
class Entry<K, V> {
K Key;
V Value;

public Entry(K key, V value) {
super();
Key = key;
Value = value;
}

}

public class RealizeMap<K, V, E> {
@SuppressWarnings("unchecked")
TestLinkedList<Entry<K, V>> arr[] = new TestLinkedList[165];
int size;

RealizeMap() {
size = 0;
}

public void put(K key, V value) {
// 注意不能漏了->处理键值覆盖
Entry<K, V> e = new Entry<>(key, value);
int hash = key.hashCode() % 165;
if (arr[hash] == null) {
TestLinkedList<Entry<K, V>> list = new TestLinkedList<>();
arr[hash] = list;
list.addLast(e);
}else {
for(int i=0;i<arr[hash].size;i++) {
Entry<K, V> E = arr[hash].get(i);//由于E在此取义为该链表键对应节点的地址,所以直接改E即可覆盖之
if(E.Key.equals(key)) {
E.Value = value;
return;
}
}
arr[hash].addLast(e);
}
}

public V get(K key) {
int hash = key.hashCode();
if (arr[hash] != null) {
for (int i = 0; i < arr[hash].size; i++) {
if (arr[hash].get(i).Key.equals(key))
return arr[hash].get(i).Value;
}
}
return null;
}

public static void main(String[] args) {
RealizeMap<String, String, Entry<String, String>> map = new RealizeMap<>();
map.put("1", "张三");
map.put("2", "李四");
map.put("2", "黎明");
map.put("3", "王五");
map.put("4", "马六");
System.out.println(map.get("2"));
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: