博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现Map接口(hash原理)
阅读量:7083 次
发布时间:2019-06-28

本文共 6918 字,大约阅读时间需要 23 分钟。

闲来无事,就实现一个简单的map来练练手吧!

HashMap的底层实现主要是基于数组和链表来实现的,HashMap中通过key的hashCode来计算hash值的,由这个hash值计算在数组中的位置,将新插入的元素放到数组的这个位置,如果新插入的元素的hash值跟这个位置上已有元素的hash值相同,就会出现hash冲突,这时候,就在该位置通过链表来插入新的元素。 

如图,紫色部分是hash数组,绿色部分是链表,是为了解决冲突而产生的。

在实现Map接口时还需要实现Entry接口,以便能取出Map中元素。

package chapter3.question5;import java.util.Map;public class SimpleEntry implements Map.Entry, Comparable {    private Object key;    private Object value;    public SimpleEntry(Object key, Object value) {        this.key = key;        this.value = value;    }    @Override    public int compareTo(Object o) {        SimpleEntry simpleEntry = (SimpleEntry) o;        return ((Comparable) key).compareTo(simpleEntry.key);    }    @Override    public Object getKey() {        return key;    }    @Override    public Object getValue() {        return value;    }    @Override    public Object setValue(Object value) {        Object result = this.value;        this.value = value;        return result;    }    @Override    public String toString() {        return key + "=" + value;    }}

接下来就是Map的简单是实现啦。

package chapter3.question5;import java.util.*;public class SimpleMap implements Map {    private final static int SLOT = 999;    private LinkedList[] bucket = new LinkedList[SLOT];    private int size = 0;    @Override    public int size() {        return size;    }    @Override    public boolean isEmpty() {        return size == 0;    }    @Override    public boolean containsKey(Object key) {        int index = key.hashCode() % SLOT;        if (index < 0) index = -index;        if (bucket[index] == null) return false;        LinkedList linkedList = bucket[index];        Iterator iterator = linkedList.iterator();        while (iterator.hasNext()) {            SimpleEntry entry = (SimpleEntry) iterator.next();            if (entry.getKey().equals(key)) {                return true;            }        }        return false;    }    @Override    public boolean containsValue(Object value) {        for (int i = 0; i < SLOT; i++) {            if (bucket[i] != null) {                LinkedList linkedList = bucket[i];                Iterator iterator = linkedList.iterator();                while (iterator.hasNext()) {                    SimpleEntry entry = (SimpleEntry) iterator.next();                    if (entry.getValue().equals(value)) {                        return true;                    }                }            }        }        return false;    }    @Override    public Object get(Object key) {        int index = key.hashCode() % SLOT;        if (index < 0) index = -index;        if (bucket[index] == null) return null;        LinkedList linkedList = bucket[index];        Iterator iterator = linkedList.iterator();        while (iterator.hasNext()) {            SimpleEntry entry = (SimpleEntry) iterator.next();            if (entry.getKey().equals(key)) {                return entry.getValue();            }        }        return null;    }    /**     * @param key     * @param value     * @return 此前与key关联的值     */    @Override    public Object put(Object key, Object value) {        int index = key.hashCode() % SLOT;        if (index < 0) index = -index;        SimpleEntry entry = new SimpleEntry(key, value);        Object prev = null;        if (bucket[index] == null) bucket[index] = new LinkedList();        LinkedList list = bucket[index];        boolean found = false;        ListIterator iterator = list.listIterator();        while (iterator.hasNext()) {            SimpleEntry simpleEntry = (SimpleEntry) iterator.next();            if (simpleEntry.equals(entry)) {
//一对一 found = true; prev = simpleEntry.getValue(); iterator.set(entry); break; } } if (!found) { size++; bucket[index].add(entry); } return prev; } @Override public Object remove(Object key) { SimpleEntry entry = null; int index = key.hashCode() % SLOT; if (index < 0) index = -index; if (bucket[index] == null) return null; LinkedList linkedList = bucket[index]; Iterator iterator = linkedList.iterator(); while (iterator.hasNext()) { SimpleEntry simpleEntry = (SimpleEntry) iterator.next(); if (simpleEntry.getKey().equals(key)) { entry = simpleEntry; iterator.remove(); size--; break; } } return entry; } @Override public void putAll(Map m) { Set set = m.entrySet(); for (Object object : set) { Map.Entry oo = (Map.Entry) object; put(oo.getKey(), oo.getValue()); } } @Override public void clear() { for (Object key : keySet()) { remove(key); } size = 0; } @Override public Set keySet() { Set set = new HashSet(); for (int i = 0; i < SLOT; i++) { if (bucket[i] != null) { Iterator iterator = bucket[i].iterator(); while (iterator.hasNext()) { set.add(((SimpleEntry) iterator.next()).getKey()); } } } return set; } @Override public Collection values() { List list = new ArrayList(); for (int i = 0; i < SLOT; i++) { if (bucket[i] != null) { Iterator iterator = bucket[i].iterator(); while (iterator.hasNext()) { list.add(((SimpleEntry) iterator.next()).getValue()); } } } return list; } @Override public Set
entrySet() { Set set = new HashSet(); for (int i = 0; i < SLOT; i++) { if (bucket[i] != null) { Iterator iterator = bucket[i].iterator(); while (iterator.hasNext()) { set.add(((SimpleEntry) iterator.next())); } } } return set; } @Override public int hashCode() { int j = 0; for (int i = 0; i < SLOT; i++) { if (bucket[i] != null) { Iterator iterator = bucket[i].iterator(); j += ((SimpleEntry) iterator.next()).getKey().hashCode(); } } return j; } /** * 为了测试显示map内容 * * @return */ @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); for (int i = 0; i < SLOT; i++) { if (bucket[i] != null) { Iterator iterator = bucket[i].iterator(); while (iterator.hasNext()) { SimpleEntry entry = (SimpleEntry) iterator.next(); stringBuilder.append(entry.getKey() + "," + entry.getValue() + "\n"); } } } return stringBuilder.toString(); }}

 

转载于:https://www.cnblogs.com/fht-litost/p/9716437.html

你可能感兴趣的文章
OpenSessionInViewFilter原理以及为什么要用OpenSessionInViewFilter
查看>>
决策树
查看>>
微服务实战(六):选择微服务部署策略
查看>>
mybatis入门教程(二)
查看>>
Java NIO(一)
查看>>
UIWebView类的调用
查看>>
MongoVE连接MongoDB 不显示数据问题
查看>>
npm 更新模块
查看>>
PhalApi 2.4.2 - 接口,从简单开始!(为了更好的接口开发体验,2019重新出发)...
查看>>
Docker介绍
查看>>
数组重复数去重
查看>>
清除旧版本kernel[Fedora/CentOS/RHEL]
查看>>
php_ldap.dll扩展加载
查看>>
Hadoop-2.0命令手册
查看>>
高级装配小笔记--环境与profile
查看>>
Java 只有传值
查看>>
Jenkins部署Web项目到远程tomcat
查看>>
在线支付资料
查看>>
iMatrix6.0.0功能更新说明
查看>>
js 中的 Data() 对象
查看>>