hashmap的那些事

  1. 什么是hash
    它是把一个任意长度的二进制值通过一个映射关系转化成一个固定长度的二进制值

    1.1、任意长度的二进制值
    1.2、一一映射关系(哈希算法)
    1.3、固定的二进制值(哈希值)
    定义中三个关键元素的理解以及三者之间的相关联系。
    固定长度的二进制值相当于一个任意长度的二进制值的摘要
    固定长度的二进制值相当于一个关键字(有且仅有一个,一一对应)
    key-----value; hash 只是确定了一个key和value的映射关系

  2. 什么是hash表
    特点:它的存取效率特别高,取数据的时间复杂度为1;
    hash: 通过一个key的输入,来获取数组中与之对应的唯一映射value
    根据hash函数找到数组中的这个value的下标;

  3. 哈希函数是什么
    根据key值找存储位置的下标。有哪些方法可以找到下标‘
    3.1 除留取余数法(取模)
    int index = key%m
    m的取值规则:取比数组长度小的最大质数

  4. hash表处理冲突
    4.1 线性探测法,步长为1;说通俗点就是挨个去找一个空位置,把值放进去。
    4.2 链表形式。在位置冲突时,把当前位置的值与新值形成链表,去存储。如下图所示
    在这里插入图片描述

  5. 以上就是hashmap的简单原理基础,附上简单实例一看便知
    5.1 map的接口类

public interface PMap<K,V> {

    V put(K key,V value);
    V get(K key);
    int size();

    interface Entry<K,V>{
        K getKey();

        V getValue();
    }
**5.2 map的实现类**
package practicemap;
public class PHashMap<K,V> implements PMap<K,V> {

    private static Integer defaultLength = 16;
    private static Double defaultLoad = 0.75;
    private Entry<K,V>[] table = null;

    //記錄數組的長度
    private Integer size = 0;

    public PHashMap(int defaultLength, double defaultLoad) {
        this.defaultLength = defaultLength;
        this.defaultLoad = defaultLoad;
        this.table = new Entry[defaultLength];
    }

    public PHashMap(){
        this(defaultLength,defaultLoad);
    }

    private int getIndex(K key){
        //除留餘數法
        int m = this.defaultLength-1;
        return key.hashCode()%m;
    }
    @Override
    public V put(K key, V value) {

        //1、根據key取得數組中的下標
        int index = getIndex(key);
        Entry<K, V> kvEntry = table[index];
        if (kvEntry == null) {

            table[index] = new Entry<>(key,value,null,index);
            size++;
        }else {
            Entry newEntry  = new Entry(key,value,kvEntry,index);
            table[index] = newEntry;
        }
        return table[index].getValue();
    }

    @Override
    public V get(K key) {
        //1、根據key取得數組中的下標
        int index = getIndex(key);
        return table[index]==null? null:table[index].getValue();
    }

    @Override
    public int size() {
        return size;
    }


    class Entry<K,V> implements PMap.Entry<K,V>{

        K key;
        V value;
        Entry<K,V> next;
        int index;

        public Entry(K key, V value, Entry<K, V> next, int index) {
            this.key = key;
            this.value = value;
            this.next = next;
            this.index = index;
        }

        @Override
        public K getKey() {
            return key;
        }

        @Override
        public V getValue() {
            return value;
        }
    }
}

5.3 map的简单测试类

public class PHashMapTest {

    public static void main(String[] args) {

        PHashMap map = new PHashMap();
        map.put("watet","haodoua");
        map.put("star","haozhuanga");
        System.out.println(map.size());
        System.out.println(map.get("star"));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值