zoukankan      html  css  js  c++  java
  • 自己写一个HashMap

    package cn.aresoft;

    /**
    * HashMap原理
    *
    * @author develp
    * HashMap是一种以键值对存储数据的数据结构,简单的来说是这样。内部怎么实现的呢?实际上使用一个数组(entries),
    * 然后数组中的每一个元素可以看成是一个链表(entry)。当存储一个键值对时,你拿着一个Key和Value,
    * 哈希算法会根据你的Key来计算出一个值,我们把这个值当作内部数组(entries)的索引值(index),
    * 然后找这个索引值下的元素来存储value值,如果此索引下已经存在元素,但因为每个数组元素(entry)可以看作是链表可以连着存储,
    * 故可以插入该索引。只不过这里是头插法,因为某种不可抗力会更有可能查询刚插入的元素。先看一下代码,虽然写的很糟,如果实在不能理解,请看一下【
    * 码农翻身】上面给了链接。
    * @param <K>
    * @param <V>
    */
    public class MyHashMap<K, V> {
    private static int default_length = 16;
    private MyEntry<K, V>[] entries;

    public MyHashMap() {
    super();
    entries = new MyEntry[default_length];
    }

    public V put(K key, V value) {
    int index = key.hashCode() % default_length;
    MyEntry<K, V> previous = entries[index];
    for (MyEntry entry = entries[index]; entry != null; entry = entry.next) {
    if (entry.getKey().equals(key)) {
    V oldValue = (V) entry.getValue();
    entry.setValue(value);
    return oldValue;
    }
    }
    MyEntry<K, V> entry = new MyEntry<>(key, value);
    entry.next = previous;
    entries[index] = entry;
    return null;
    }

    public V get(K key) {
    int index = key.hashCode() % default_length;
    for (MyEntry<K, V> entry = entries[index]; entry != null; entry = entry.next) {
    if (entry.getKey().equals(key)) {
    return entry.getValue();
    }
    }
    return null;
    }

    private final class MyEntry<K, V> {
    private K key;
    private V value;
    private MyEntry next;

    public MyEntry(K key, V value) {
    super();
    this.key = key;
    this.value = value;
    }

    public MyEntry() {
    super();
    }

    public MyEntry(K key, V value, MyEntry next) {
    super();
    this.key = key;
    this.value = value;
    this.next = next;
    }

    public K getKey() {
    return key;
    }

    public void setKey(K key) {
    this.key = key;
    }

    public V getValue() {
    return value;
    }

    public void setValue(V value) {
    this.value = value;
    }

    public MyEntry getNext() {
    return next;
    }

    public void setNext(MyEntry next) {
    this.next = next;
    }
    }

    public static void main(String[] args) {
    MyHashMap<String, Integer> mhm = new MyHashMap();
    mhm.put("lmy", 20);
    System.out.println(mhm.get("lmy"));
    }
    }

    https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665514069&idx=1&sn=2996d864bbe596d0af763fba3d244fa7&chksm=80d67c16b7a1f500ec6a191eb4a0beac0e95dbd5a7bf8ee01f5ed2cb17960b9ab32c0b965949&mpshare=1&scene=23&srcid=1223e7BQGb04LAH3YZ1zDXAQ#rd

    ******未经允许,禁止转载 否则追究法律责任******
  • 相关阅读:
    iptables的例子1
    Nginx教程
    bash编程基础
    centos7 PXE自动安装环境搭建
    矛盾破裂了
    20200823-矩阵的收尾与离散控制的跌跌撞撞
    20200817-三大公式的结束-频域法的再探
    markdown换行
    由二〇二〇新冠疫情引发的对于开源、分享这一理念的看法
    Windows简单使用记录
  • 原文地址:https://www.cnblogs.com/demo-tt/p/11065650.html
Copyright © 2011-2022 走看看