01.HashMap源码学习整理思维导图

01.HashMap源码学习整理思维导图

蚂蚁课堂

参考学习视频资料: http://www.mayikt.com/

/** * 基于数组实现HashMap * * @author zx * @date 2021年05月05日 13:37 */
public class ArrayHashMap<K, V> {
   
    //先不考虑扩容 HashMap 初始容量为16. ;
    // 第一次;当存放的值 16*0.75 =12(容量 * 0.75) 进行扩容,扩容后得到的容量大小为: 16<<1 = 32;
    //第二次: 当存放的值32*0.75 = 25 进行扩容 ,扩容大小 32 << 1 = 64
    private final Entry[] entries = new Entry[1000];

    /** * 添加元素 * * @param k key值 * @param v value值 */
    public void add(K k, V v) {
   
        int index = hash(k);
        Entry oldEntry = entries[index];
        if (oldEntry == null) {
   
            entries[index] = new Entry<>(k, v);
        } else {
   
            if (index == 0) {
   
                entries[index] = new Entry<>(k, v);
            }
            oldEntry.next = new Entry<>(k, v);
        }
    }

    /** * 根据key值获取对应的value * * @param k key值 * @return 返回对应key的value值 */
    public V get(K k) {
   
        int index = hash(k);
        for (Entry oldEntry = entries[index]; oldEntry != null; oldEntry = oldEntry.next) {
   
            //hashcode相同,我们需要比较内容值
            if ((k == null && oldEntry.key == null) || oldEntry.key.equals(k)) {
   
                return (V) oldEntry.value;
            }
        }
        return null;
    }

    /** * 遍历Map */
    public void list() {
   
        if (entries == null) {
   
            System.out.println("集合中没有存放元素,不能为遍历");
        }
        for (Entry entry : entries) {
   
            if (entry != null) {
   
                Entry temp = entry.next;
                while (temp != null) {
   
                    System.out.println(temp.key + "---" + temp.value);
                    temp = temp.next;
                }
                System.out.println(entry.key + "---" + entry.value);
            }
        }
    }


    /** * 计算hash值 * * @param key key值 * @return hash值 */
    static int hash(Object key) {
   
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }


    private static class Entry<K, V> {
   
        K key;
        V value;
        Entry<K, V> next;

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

        @Override
        public String toString() {
   
            return "Entry{" +
                    "key=" + key +
                    ", value=" + value +
                    '}';
        }
    }

    public static void main(String[] args) {
   
        ArrayHashMap<Object, Object> map = new ArrayHashMap<>();
        map.add(null, "null value");
        map.add(null, "null value2");
        map.add("a", "a is hashcode 97");
        map.add(97, "97 is hashcode 97");
        map.add(98, "98 is hashcode 98");
        map.add("b", "b is hashcode 98");
        System.out.println("------------------");
        map.list();
        System.out.println("------------------");
        System.out.println(map.get(null));
        System.out.println(map.get("a"));
        System.out.println(map.get(97));
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100717.html原文链接:https://javaforall.net

(0)
上一篇 2021年7月13日 下午12:00
下一篇 2021年7月13日 下午1:00


相关推荐

  • html5将数组转换为字符串,JavaScript怎么将数组转字符串?

    html5将数组转换为字符串,JavaScript怎么将数组转字符串?JavaScript 允许数组与字符串之间相互转换 其中 Array 方法对象定义了 3 个方法 可以把数组转换为字符串 数组方法说明 toString 将数组转换成一个字符串 toLocalStrin 把数组转换成本地约定的字符串 join 将数组元素连接起来以构建一个字符串数组中 toString 方法能够把每个元素转换为字符串 然后以逗号连接输出显示 vara 1 2 3 4

    2026年3月17日
    4
  • 渝粤锂电一体机800A_渝粤锂电池怎么样

    渝粤锂电一体机800A_渝粤锂电池怎么样选择题题目:英国经济学家罗宾斯的著名论文《轮经济科学的性质和意义》发表于()题目:亚当˙斯密的《国富论》发表于()题目:西方经济学产生的根本原因是()题目:西方主流经济学家主要采用下列哪种方法论来进行经济学研究()题目:微观行为与宏观结果甚至可能是背离的。对此,萨缪尔森在他经典的教科书上曾打过一个精辟的比方。他说,好比在一个电影院看电影,有人被前面的人挡住了视线,如果他站起来的话,他看电影的效果将会改善。因此,站起来就微观而言是合理的。但是,如果大家都站起来的话,则大家看电影的效果都不能

    2025年8月13日
    4
  • n8n自动化测试教程 (1):环境搭建与初识n8n

    n8n自动化测试教程 (1):环境搭建与初识n8n

    2026年3月13日
    1
  • IDEA炫酷主题推荐!非常好看![通俗易懂]

    IDEA炫酷主题推荐!非常好看![通俗易懂]IntelliJIDEA介绍IDEA,全称IntelliJIDEA,是Java语言的集成开发环境,IDEA在业界被公认为是最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、Ant、JUnit、CVS整合、代码审查、创新的GUI设计等方面的功能可以说是超常的。*IDEA的官网下载地址:IDEA下载地址平时开发中由…

    2022年5月31日
    93
  • comboBox的SelectedValue为null

    comboBox的SelectedValue为null把自定义对象通过 comboBox Add 自定义对象 方法添加到 comboBox 中后 再分别制定其 DisplayMembe 和 ValueMember 想的到选择的值 使用 SelectedValu 得到 null 要使用 自定义对象类型 comboBox1 SelectedItem Id 来取得当前选择的值 如果是通过 combBox DataSource 来指定的 combBox 的数据源 I

    2025年6月24日
    5
  • 月之暗面Kimi K2.5发布:多模态架构升级,代码办公能力全面进阶

    月之暗面Kimi K2.5发布:多模态架构升级,代码办公能力全面进阶

    2026年3月12日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号