Java集合-07Map接口及其抽象类

简介

前面把List基本记录完了,对于集合List,Map,Set,因为Set基于Map,故先记录Map。

这一篇主要记录Map接口及其抽象类(java version:1.8)

整体架构

参考上图,整体分析如下

  1. Map

    映射接口,定义了存储内容为键值对(key-value)及map的基本操作方法

  2. AbstractMap

    该抽象类对Map接口有了整体的实现,简化实现Map接口所需要的工作

  3. SortedMap

    该接口更一步的对key提供了一个排序,该Map通过Comparable针对keys提供了一个自然排序,

    或者在创建时候通过Comparator实现排序

  4. NavigableMap

    在SortedMap接口上拓展了一系列的导航方法

  5. HashMap

    基于hash表实现,key和value都允许null,非同步的且不能保证排序

  6. WeakHashMap

    和HashMap类似,不过它的键是"弱键"

  7. LinkedHashMap

    基于hash表和链表实现,和HashMap不同的是它维护了一个双向链表

  8. TreeMap

    基于红黑树实现,非同步,有序map

  9. Hashtable

    基于hash表,线程安全的,key不允许为null

深入分析接口和抽象类

Map

Map定义:public interface Map<K,V>

Map是一个键值对(key-value)映射接口,key不可重复,每个键至多映射一个值;

Map提供三个视图

  1. 键的Set集合视图
  2. 值得Collection集合视图
  3. 键值对的Set集合视图

Map部分源码


public interface Map&lt;K,V&gt;{
    int size();//返回键值对个数
    boolean isEmpty();//判断是否为空
    boolean containKey(Object key);//判断是否包含key
    boolean containsValue(Object value);//判断是否包含value
    V get(Object key);//根据key获取value,如果实现类map允许null,对应的key没有映射,返回null
    V put(K key, V value);//添加键值对,如果原来map中包含key,返回值为旧值
    V remove(Object key);//移除键为key的键值对,如果没有返回null
    void putAll(Map&lt;? extends K, ? extends V&gt; m);//添加键值对
    void clear();//清空map
    Set&lt;K&gt; keySet();//key视图
    Collection&lt;V&gt; values();//value视图
    Set&lt;Map.Entry&lt;K, V&gt;&gt; entrySet();//键值对视图
    interface Entry&lt;K,V&gt;{//保存键值对
        K getKey();
        V getValue();
        V setValue(V value);
    }
    Set&lt;Map.Entry&lt;K, V&gt;&gt; entrySet();//键值对视图
    default V getOrDefault(Object key, V defaultValue) {//@since 1.8 返回键值对key对应的值,如果key没有返回defaultValue
            V v;
            return (((v = get(key)) != null) || containsKey(key))
                ? v
                : defaultValue;
    }
    default V putIfAbsent(K key, V value) {//如果键值对key对应的值为null,key对应的值变为value
            V v = get(key);
            if (v == null) {
                v = put(key, value);
            }

            return v;
    }
}

AbstractMap

提供了Map接口的骨架实现,对于开发一个不可变的map,开发者只需要继承这个类且提供entrySet方法的实现,

通常entrySet方法返回的Set在AbstractSet上实现,该set不应该支持add()或者remove()方法,并且它的迭代器不支持remove()方法。

要开发一个可变的Map,开发者继承这个类提供entrySet方法的实现外还额外需要put方法,

不然会报UnsupportedOperationException(因为AbstractMap的put方法只是抛出了UnsupportedOperationException,

如果你想开发一个可变的Map,使用put方法是需要重写的);并且entrySet().iterator()返回的迭代器必须实现它的remove方法()

SortedMap

SortedMap接口继承Map接口,为一个有序的键值对映射。

添加到SortedMap的键必须实现Comparable接口或者被指定的comparator接受。此外,所有的key能够相互比较:k1.compareTo(k2)或者

comparator.compare(k1, k2)不能抛出ClassCastException。

其实现类需要提供四个构造函数

  1. 无参构造函数,keys排序按照自然排序
  2. 带有一个 Comparator 类型参数的构造方法,keys按照指定的比较器排序
  3. 带有一个Map类型参数的构造方法,keys按照自然排序,创建的SortedMap与给定的Map具有相同键值对
  4. 带有一个SortedMap类型参数的构造方法,keys按照参数SortedMap的比较器排序,

NavigableMap

NavigableMap扩展了 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法。

方法 lowerEntry、floorEntry、ceilingEntry 和 higherEntry 分别返回与小于、小于等于、大于等于、大于给定键的键关联的 Map.Entry 对象,如果不存在这样的键,则返回 null。

类似地,方法 lowerKey、floorKey、ceilingKey 和 higherKey 只返回关联的键。

所有这些方法是为查找条目而不是遍历条目而设计的。

可以按照键的升序或降序访问和遍历 NavigableMap。

descendingMap 方法返回映射的一个视图,该视图表示的所有关系方法和方向方法都是逆向的。

升序操作和视图的性能很可能比降序操作和视图的性能要好。

subMap、headMap 和 tailMap 方法与名称相似的 SortedMap 方法的不同之处在于:可以接受用于描述是否包括(或不包括)下边界和上边界的附加参数。

任何 NavigableMap 的 Submap 必须实现 NavigableMap 接口。

此接口还定义了 firstEntry、pollFirstEntry、lastEntry 和 pollLastEntry 方法,它们返回和/或移除最小和最大的映射关系(如果存在),否则返回 null。

subMap(K, K)、headMap(K) 和 tailMap(K) 方法被指定为返回 SortedMap,以允许现有 SortedMap 实现能相容地改进为实现 NavigableMap,但鼓励此接口的扩展和实现重写这些方法以返回 NavigableMap。

类似地,可以重写 SortedMap.keySet() 以返回 NavigableSet。

来源:https://blog.csdn.net/Jzedy/article/details/85157358

原文地址:https://www.cnblogs.com/thatme/p/10192956.html

时间: 2024-11-13 08:13:17

Java集合-07Map接口及其抽象类的相关文章

JAVA中的接口和抽象类(转)

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题领域进行分析. 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象. 比如:我们要描述“水果”,它就是一个抽象,它有质量.体积等一些共性(水果有质量),但又缺乏特性(苹果.橘子都是水果,它们有自己的特性),我们 拿不

Java集合Map接口与Map.Entry学习

Java集合Map接口与Map.Entry学习 Map接口不是Collection接口的继承.Map接口用于维护键/值对(key/value pairs).该接口描述了从不重复的键到值的映射. (1) 添加.删除操作: Object put(Object key, Object value): 将互相关联的一个关键字与一个值放入该映像.如果该关键字已经存在,那么与此关键字相关的新值将取代旧值.方法返回关键字的旧值,如果关键字原先并不存在,则返回null Object remove(Object

JAVA中的接口和抽象类

在面向对象的概念中,我们知道所有的对象都是通过类来描绘的,但是并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类往往用来表征我们在对问题领域进行分析. 设计中得出的抽象概念,是对一系列看上去不同,但是本质上相同的具体概念的抽象,我们不能把它们实例化(拿不出一个具体的东西)所以称之为抽象. 比如:我们要描述“水果”,它就是一个抽象,它有质量.体积等一些共性(水果有质量),但又缺乏特性(苹果.橘子都是水果,它们有自己的特性),我们 拿不

第6篇 Java中的接口与抽象类

接口 Interface 在JAVA编程语言中是一个抽象类型,是抽象方法的集合.接口通常以interface来声明.一个类通过实现接口(implements)的方式,从而实现接口的抽象方法. 接口通过interface关键字来定义 接口中不能实现方法,但是能声明方法 类通过implements关键字来实现接口 一个类如果实现了接口,就必须实现接口中的所有方法 一个类可以通过implements关键字实现多个接口,但只能继承一个父类 面向接口的多态(接口的引用指向其实现类) 接口不能被实例化 接口

Java基础——关于接口和抽象类的几道练习题

呃,一定要理解之后自己敲!!!这几道题,使我进一步了解了接口和抽象类. 1.设计一个商品类 字段: 商品名称,重量,价格,配件数量,配件制造厂商(是数组,因为可能有多个制造厂商) 要求: 有构造函数 重写 toString 方法 重写 equals方法,进行两件商品的比较 1 package TT; 2 3 import java.util.Arrays; 4 5 public class G { 6 private int 重量; 7 private String 商品名称; 8 privat

分清java中的接口和抽象类

抽象是面向对象设计的几大特点之一,在Java语言中的体现则是抽象类和接口.这两者十分的相似,想很多初学者甚至接触Java几年的人也很难分清他们.今天笔者在查看集合类相关的代码的时候,发现了有部分是接口如List.Map等,有部分是抽象类如AbstractList.AbstractSet等,由于对两者不是十分的清楚,比较迷惑.所以今天笔者在本文则主要介绍下这两者的区别. 抽象类 抽象方法 利用abstract修饰只有声明没有实现的方法,叫做抽象方法.如: abstract void fun();

interface,abstract class,abstract interface Java中的接口,抽象类和抽象接口的异同

接口与抽象类的比较 1.相同点: A. 两者都是抽象类,都不能实例化. B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法. 2. 不同点: A. interface需要实现,要用implements,而abstract class需要继承,要用extends. B. 一个类可以实现多个interface,但一个类只能继承一个abstract class. C. interface强调特定功能的实现,而abstract class强调所属关系. D.尽

java集合Collection接口

collection集合 Map集合 Collection接口 Collection接口是List.Set和Queue接口的父接口,该接口里定义的方法既可用于操作Set集合,也可用于操作List和Queue集Collection提供了大量添加.删除.访问的方法来访问集合元素.主要的方法如下:

Java基础(8) - 接口、抽象类

存在的意义接口 - 接口对维护和解耦代码有很很好的帮助 同时由于接口常用来约束对象的行为,可实现"多继承".抽象类 - 抽象类对于代码的维护和重用有很好的帮助. 参考:接口 - https://blog.csdn.net/googleoyyp/article/details/78912259抽象类 - https://blog.csdn.net/chenchaozzu/article/details/82785068 接口和抽象类的区别1.抽象类只能继承且只能继承一个,接口只能实现,但