自定义HashMap实现
Posted 夕冰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了自定义HashMap实现相关的知识,希望对你有一定的参考价值。
坚持一件事·第三十三期 |
HashMap
Hash:散列将一个任意的长度通过hash函数算法转换成一个固定值。
HashMap基本原理:通过Hash函数算法转换出来一个值,然后通过这个值定位到map中的位置,将value存储到这个位置。
自定义实现HashMap
package org.cgx.util; /** * @author Xice * @param<K> map中的key * @param<V> map中key对应的value * 自定义map接口,包括put和get方法 * entry是执行put时,值的存储位置 */ public interface Map<K,V> {
public V put(K k,V v);
public V get(K k);
publicint size();
public interface Entry<K,V>{ public K getKey();
public V getValue(); } } |
实现自定义Map接口,重写具体实现方法 |
package org.cgx.util;
public class HashMap<K,V> implements Map<K, V> {
//map集合默认大小 private static intdefaultLength = 16; //当存储的值达到默认大小的0.75时,进行扩容 private static doubledefaultLoader = 0.75; //值存储位置 private Entry[] table = null; //统计当前map集合大小 private intsize=0;
/** * 无参构造 * 传入map集合默认大小和扩容阀门值 */ public HashMap() { this(defaultLength,defaultLoader); }
/** * 两参构造,初始化变量 */ public HashMap(int length,double loader){ defaultLength = length; defaultLoader = loader; table = new Entry[defaultLength]; }
/** * get方法,获取map中的值 */ @Override public V get(K k) { //计算要查找的key的hash值 int index = hash(k); if(table[index]==null){ //hash值为空时返回null return null; } //hash值为不空时,查找map中对应的值 return find(k,table[index]); }
/** * 查找map中对应的值 */ private V find(K k, Entry<K,V> entry) { //当key存在时 if(k==entry.getKey()||k.equals(entry.getKey())){ //查看是否有重复值 if(entry.next!=null){ System.out.println("原始值:"+entry.next.getValue()); }else{ if(entry.next!=null){ //递归查询 return find(k, entry.next); } } //返回key对应的值 return entry.getValue(); } //未找到时返回空 return null; }
/** * 向map中存入值 */ @Override public V put(K k, V v) { //添加当前map大小 size++; //计算hash值 int index = hash(k); //获取计算出的hash值对应的位置 Entry<K,V> entry = table[index]; if(entry==null){ //创建新值,当此位置为空直接存入 table[index] = newEntry(k,v,null); }else{ //当此位置不为空,将新值的next指针指向原始值 table[index] = newEntry(k,v,entry); }
return (V)table[index].getValue(); }
/* * 存入值 * 先查看hashhash值对应的位置是否为空 * 当此位置为空直接存入 * 当此位置不为空,将新值的next指针指向原始值 */ private Entry<K,V> newEntry(K k, V v, Entry<K,V> next) {
return new Entry<K,V>(k,v,next); }
/** * hash算法 * 算出传入key的hash值 */ public int hash(K k){ int m = defaultLength; int i = k.hashCode() % m; return i>=0?i:-1; }
/** * 统计当前map大小 */ @Override public int size() { return size; }
class Entry<K,V> implements Map.Entry<K, V>{
K k; V v; Entry<K,V> next;//指向原始值的指针
public Entry(K k, V v, Entry<K, V> next) { super(); this.k = k; this.v = v; this.next = next; }
@Override public K getKey() { return k; }
@Override public V getValue() { return v; } } } |
测试以上自定义HashMap
package org.cgx.util;
public class Test {
public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("夕冰", 22); map.put("夕冰", 25); System.out.println("当前值:"+map.get("夕冰")); System.out.println("当前map大小:"+map.size()); } } |
运行结果
原始值:22 当前值:25 当前map大小:2 |
以上是关于自定义HashMap实现的主要内容,如果未能解决你的问题,请参考以下文章