Java 集合类 4-集合类的另一把利器Map

本文介绍了Java集合框架中的Map接口,探讨了其与Collection接口的不同之处,以及Map如何通过键值对(key-value)的方式存储数据。文章列举了四种重要的Map实现类,并详细解释了Map的主要方法,如put、get、keySet等。

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

 集合类中除了Collection接口之外,还有另外一个非常重要的接口:Map。在接下来的的几篇文章里,将对Map接口进行介绍。

 Map接口不像Collection接口下面还有两个子接口,Map只有四个重要的实现类,分别是:

  • HashMap
  • Hashtable
  • ConcurrentHashMap
  • TreeMap

 Map比起Collection最大的特点在于保存的元素。Collection每次只能保存一个元素,而Map每次可以进行一对对象的保存,我们将这一对对象第一个称为key,第二个称为value,它们合起来组成了一个键值对(key-value,每个key对应为一个value)。

 因为两个对象的关系是一一对应的,所以可以很容易的通过一个key找到它对应的value。

 Map的定义如下:

public interface Map<K, V>

 Map中提供的方法有如下几种:

Map方法

 在以后的工程中,我们经常会使用如下几种:

// 添加元素,Collection中为add,而Map是put
public V value(K key, V value);

// 根据key获取其对应的value,如果没有对应关系,返回null
public V get(Object key);

// 获取Map对象中所有的key,以Set对象的形式进行返回
public Set<V> keySet();

// 获取Map对象中所有的value,以Collection对象的形式进行返回
public Collection<V> values();

// 将Map以Set的形式返回
public Set<Map.Entry<K, V>> entrySet();

 细心的同学肯定能发现,在entrySet()方法里,返回的Set对象泛型为 Map.Entry


interface Entry<K, V> {

    K getKey();

    V getValue();

    V setValue(V value);

    boolean equals(Object o);

    int hashCode();

    /* 
     * 以下为与数据比较相关的方法
     */
    public static <K extends Comparable<? super K>, V> Comparator<Map.Entry<K, V>> comparingByKey() {
        return (Comparator<Map.Entry<K, V>> & Serializable)
            (c1, c2) -> c1.getKey().compareTo(c2.getKey());
    }

    public static <K, V extends Comparable<? super V>> Comparator<Map.Entry<K, V>> comparingByValue() {
        return (Comparator<Map.Entry<K, V>> & Serializable)
            (c1, c2) -> c1.getValue().compareTo(c2.getValue());
    }

    public static <K, V> Comparator<Map.Entry<K, V>> comparingByKey(Comparator<? super K> cmp) {
        Objects.requireNonNull(cmp);
        return (Comparator<Map.Entry<K, V>> & Serializable)
            (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
    }

    public static <K, V> Comparator<Map.Entry<K, V>> comparingByValue(Comparator<? super V> cmp) {
        Objects.requireNonNull(cmp);
        return (Comparator<Map.Entry<K, V>> & Serializable)
            (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
    }
}

 我们可以很直观的感受到,接口Entry就是为了数据存在的一个接口。其实在Map接口的实现类中,Map的get/set方法也是调用了Entry接口中的方法。

 打开Map接口的实现类HashMap的定义我们可以发现,HashMap的get()方法在底层调用了getNode()方法,而在getNode()中,底层的数据是一个Node类型的对象。

P1

 我们跳转至Node,果不其然,Node是Entry接口的在HashMap子类中的内部类。

P2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值