Java之HashMap源码分析(第六篇:结点对象分析)

本文深入探讨了HashMap中Node类的结构与方法,包括构造方法、getKey、getValue、toString、hashCode、setValue和equals方法,揭示了Node作为HashMap底层实现的关键角色。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(注意:本文源码基于JDK1.8) 

 

继承结构

    static class Node<K,V> implements Map.Entry<K,V> {
    ………………省略很多代码…………
}

    Node类定义在HashMap中,以静态内部类形式存在,HashMap对象持有的底层数组对象,它的每一个元素都是Node对象,而每个Node对象又持有Key对象、持有Value对象、持有称为hash的一个int值、也负责持有下一个Node对象(单链表结构使用)

    Node类实现了Map.Entry接口,这是个泛型接口,规范了作为结点类的能力!接下来先学习Node的构造方法,看看可以如何创建一个Node对象

 

Node构造方法分析

        Node(int hash, K key, V value, Node<K,V> next) {
            this.hash = hash;
            this.key = key;
            this.value = value;
            this.next = next;
        }

用于创建Node对象的构造方法时,需传入4个参数,传入一个hash值(Key对象生成的)、传入Key对象、传入Value对象、传入一个Node对象

传入的对象会赋值给Node对象的四个同名实例变量持有

重要的四个实例变量:表示Node对象持有静态方法hash()计算后的int值、持有key对象、持有value对象,以及持有表示指向下一个Node对象

 

getKey()方法分析

        public final K getKey()        { return key; }

用于返回Node对象持有的key对象

 

getValue()方法分析

        public final V getValue()      { return value; }

用于返回Node对象持有的Value对象

 

toString()方法分析

        public final String toString() { return key + "=" + value; }

重写toString()方法,返回一个由key对象toString方法+"="+value对象toString方法的字符串,方便字符串调试

 

hashCode()方法分析

        public final int hashCode() {
            return Objects.hashCode(key) ^ Objects.hashCode(value);
        }

重写hashCode()方法,定义自己的规则,使用Key对象与Value对象的异或结果作为返回结果

 

setValue()方法分析

 

        public final V setValue(V newValue) {
            V oldValue = value;
            value = newValue;
            return oldValue;
        }

用于改变Node对象持有的Value对象为传入的newValue,最后再返回旧的Value对象

 

equals()方法分析

 

public final boolean equals(Object o) {
            if (o == this)
                return true;
            if (o instanceof Map.Entry) {
                Map.Entry<?,?> e = (Map.Entry<?,?>)o;
                if (Objects.equals(key, e.getKey()) &&
                    Objects.equals(value, e.getValue()))
                    return true;
            }
            return false;
        }

重写了equals()方法,定义了Node对象的相等性规则

 

总结

1、Node对象持有的四个实例变量,hash、key、value、next,缺一不可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值