从源码分析:Java中的Map(一)Map接口与AbstractMap抽象类

本文主要探讨了Java中的Map接口,分析了HashMap的继承结构,并深入研究了AbstractMap抽象类的实现方法,包括get、put、remove等操作。尽管AbstractMap提供了许多便利的实现,但某些关键方法如putAll、entrySet并未实现,需要具体实现类完成。此外,文章还重点讲解了equals方法的实现逻辑,强调了高效判断Map相等性的策略。

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

HashMap的继承结构

Java中,我们最常用的map类型可能就是HashMap了,这一次介绍的重点也在HashMap上面。但是,在我们详细分析HashMap之前,我们先来看一下HashMap的继承结构:

在这里插入图片描述

Java中的Map接口

从上面的继承结构中,可以看出,Java中的HashMap是接口Map的一个实现类,因此,在我们分析HashMap之前,不妨先来看看Map接口。

首先,我们来看一下Map中定义的方法:

在这里插入图片描述

可以看到,我们常用的方法,如get、set、size、isEmpty、remove、keySet、entrySet等,在map接口中都有定义,因此我们无论使用map接口的哪个具体实现类,都可以使用这个方法。

同时,注意到Map接口中还有着一个内部类的接口Entry,那么我们再来看看这个内部类的接口中定义了哪些方法吧

在这里插入图片描述

从Entry的接口方法中可以看到,我们对于Entry的常用的方法,在这里也都有定义。

AbstractMap类

除了实现了Map的接口外,Java中的Map的具体类多数还继承了一个叫做AbstractMap的抽象类,这个抽象类是Java中为了实现Map所写的一个便利类,其中已经实现了很多Map所需的方法,也就是说如果我们需要其它的一个具体类,只需要完成抽象类AbstractMap中所没有实现的方法即可(当然,也可以重写已实现的方法来实现具体的功能)。

我们先来看一下AbstractMap中实现的方法:

在这里插入图片描述

这些方法都是已经有具体实现的方法,这里把其中一些常见的方法的实现贴出来:

public abstract class AbstractMap<K,V> implements Map<K,V> {
   
   

    transient Set<K>        keySet;
    transient Collection<V> values;

    protected AbstractMap() {
   
   
    }

    public int size() {
   
   
        return entrySet().size();
    }

    public boolean isEmpty() {
   
   
        return size() == 0;
    }

以上几个方法的实现都比较简单,需要注意的是,entrySet()方法在这个抽象类中并没有实现。

    public boolean containsValue(Object value) {
   
   
        Iterator<Entry<K,V>> i = entrySet().iterator();
        if (value==null) {
   
   
            while (i.hasNext()) {
   
   
                Entry<K,V> e = i.next();
                if (e.getValue()==null)
                    return true;
            }
        } else {
   
   
            while (i.hasNext()) {
   
   
                Entry<K,V> e = i.next();
                if (value.equals(e.getValue()))
                    return true;
            }
        }
        return false;
    }

    public boolean containsKey(Object key) {
   
   
        Iterator<Map.Entry<K,V>> i = entrySet().iterator();
        if (key==null) {
   
   
            while (i.hasNext()) {
   
   
                Entry<K,V> e = i.next();
                if (e.getKey()==null)
                    return true;
            }
        } else {
   
   
            while (i.hasNext()) {
   
   
                Entry<K,V> e = i.next();
                if (key
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值