自定义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> mapkey对应的value

 * 自定义map接口,包括putget方法

 * 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) {

       //计算要查找的keyhash

       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算法

     * 算出传入keyhash

     */

    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实现的主要内容,如果未能解决你的问题,请参考以下文章

自定义HashMap的键

如何使用包含 Hashmap 和 SparseArray 的自定义类实现 parcelable?

HashSet的自定义实现

HashMap实现原理及自定义

HashMap实现原理及自定义

利用自定义泛型,自己简单实现HashMap