Java集合(16)——Map源码、AbstractMap源码、SortedMap源码、NevigatableMap源码解析

类图

这里写图片描述

  • 小圆圈:表示接口。
    • 与Map集合有关的有4个接口:Map接口、SortedMap接口、NevigatableMap接口和DIirectionary接口
  • 粉色方框:表示抽象类AbstractMap
  • 肉色方框:表示具体类。Map集合下包含4个类:TreeMap类、HashMap类、WeakHashMap类和HashTable类

类图的详细介绍

  • Map接口:
    • 用于保存具有映射关系的数据结构,实现该接口的类可以通过键来获取对应的值。
    • 可以将给定一个键值对存储在Map接口的实现类实例中,如:map.put("key", "value");
    • 当访问的值不存在的时候,会抛出NoSuchElementException异常
    • 当对象的类型和Map里元素类型不兼容时,会抛出ClassCastException异常
    • 当在不允许使用NULL对象的Map中使用NULL对象,会抛出NullPointerException异常
    • 当尝试修改一个只读的Map时,会抛出一个UnSupportedOperationException异常
    • 如果把Map里的所有key放在以一起,就是一个Set集合
  • AbstractMap类:
    • 类实现了Map接口中的很多通用的API,开发人员想要实现Map接口时,只需要继承该类然后重写对应的方法就可以实现自己需要的功能。而不需要将Map接口中的所有API都实现。
  • SortedMap接口:
    • 继承Map接口,它与Map的主要区别是:它拥有有序的键值对,实现有序的方式是通过实现Comparator接口
  • NevigableMap接口:
    • 该接口继承于SortedMap接口,因此该接口也是有序的键值对,但是它比SortedMap多增加一些导航的功能。

  • TreeMap类
    • 实现了NavigableMap接口,因此它拥有一些导航功能。
    • NavigableMap接口继承于SortedMap接口,因此它是一个有序键值对集合,并且是通过红黑树实现的。
    • TreeMap类实现了Cloneable接口,意味着它
    • TreeMap类实现了java.io.Serializable接口,意味着它支持序列化,它是有序的。
  • HashMap类
    • 继承于AbstractMap,只保证是键值对
  • WeakHashMap类
    • 只继承于AbstractMap类,它与HashMap不同的是,它的键的类型是弱引用。
    • 弱引用:即使没有显示的添加或者删除任何元素也也可能发生下列情况:
    • (1) 调用两次size()方法返回不同的值。
    • (2) 两次调用isEmpty()方法,第一次返回false,第二次返回true
    • (3) 两次调用containsKey()方法,第一次返回true第二次,第二次返回,尽管两次使用的是同一个key.
    • (4) 两次调用get()方法的,第一次返回value,第二次返回null,尽管两次使用的是同一个对象
  • HashTable类
    • 该类是一个过时的集合类,存在于Java API中很久了,在Java4中被重写了,实现了Map接口,自此以后也成为Java集合框架的一部分。
    • 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

Map接口

Map接口的源码
package java.util;

import java.util.function.BiConsumer;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.io.Serializable;


public interface Map<K,V> {

    int size();
    boolean isEmpty();//如果此映射不包含键-值映射关系,则返回 true。
    boolean containsKey(Object key);//如果此映射包含指定键的映射关系,返回true
    boolean containsValue(Object value);//如果此映射将一个或多个键映射到指定值,返回true
    V get(Object key);//返回指定key所对应的value,如果此Map不包含该key,则返回null。
    V put(K key, V value);
    V remove(Object key);
    void putAll(Map<? extends K, ? extends V> m);
    void clear(); //删除该Map对象中所有key-value对
    Set<K> keySet();  //返回该Map中所有key所组成的Set集合。
    Collection<V> values();//保存value的Collection集合
    Set<Map.Entry<K, V>> entrySet();//返回Map中所包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象。
    interface Entry<K,V> {
  //Map内部的一个接口,Entry中封装着key和value
        K getKey();//返回该Entry里包含的key值。
        V getValue();//返回该Entry里包含的value值。
        V setValue(V value);//设置该Entry里包含的value值,并返回新设置的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());
        }
    }


    boolean equals(Object o);//比较指定的对象与映射是否相等
    int hashCode();//返回此映射的哈希码
}
Map的三种遍历方式

Map可以根据键、值和键值对进行遍历

        Map map = new HashMap();
        map.put("fujie"
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值