java编程-JDK集合-Map体系及Map接口类概

    阅读源码并且总结笔记,是一个技术人员学习和积累技术的好的方式。尤其通过阅读一些久经考验的源码库,比如JDK、C++ STL这些都能从中领悟到很多软件设计模式、设计思路,甚至小到一个API该怎么定义更兼具扩展性、性能考虑。这些源码的设计可以借鉴应用到我们平时的软件代码中去,产出健壮、高性能、具备可扩展性的软件代码,如果某一天能够在这些源码设计应用中,悟出改进之处,再回到应用中去,那必定是受益无穷的!

    Map集合是java程序中使用频度比较高的JDK提供的特性,熟悉理解Map体系构建以及Map中衍生的一系列场景的集合结构实现,对开发java应用程序有帮助,这就跟c++程序员需要熟悉一系列相应数据结构实现一样。
这里我们借助梳理Map结构体系,剖析两个最常用的HashMap和ConcurrentHashMap,来了解和掌握各类实现map结构以及使用场景。(本笔记主要以JDK1.7版本为例)

1.Map结构体系在JDK体系中位置

    Map体系位于java标准库的util包中,其中单线程处理类Map数据结构实现在util目录下,并发多线程Map数据结构实现位于其concurrent并发包中。

2.Map体系基本结构

    Map集合最顶层为Map接口类,该类统一定义了一个Map结构的基本操作方法,没有任何数据成员,纯抽象的接口定义。对于一个程序员开发者来讲熟悉了解这些JDK库中的接口封装,有利于理解熟悉一个数据结构基本抽象能力是如何定义的。
1)Map接口体系中Map是顶层的集合接口类,无任何定义实现,纯粹的接口定义。
2)AbstractMap抽象Map类,其中定义了后续继承该Map实现的公共基础方法的实现。
3)抽取两个Map实现类HashMap和ConcurrentHashMap来简单说明Map结构体系。
    其中HashMap继承至AbstractMap,同时实现Map接口(关于这种实现思路,网络上讨论很多,相信可以从java的interface和抽象类定义中理解一下这种设计的考虑,包括结合近期java8中interface支持default方法实现来理解。相信后续这种实现思路会发生一些小的变化)。
    其中ConcurrentHashMap是直接从Map接口继承体系而来的,实现ConcurrentMap接口,而了ConcurrentMap接口继承至Map接口,在接口层扩展了并发HashMap支持的几个方法。

3.Map顶层接口类

    Map顶层接口类主要定义了五大类接口以及一个实现Map集合元素的Entry<k,v>内部接口类。
后续具体实现类剖析可以看到这些一个个方法接口的设计实现,当然接口的定义某种程度上也约束了内部实现的考虑,Map顶层接口类这五类接口分别是:

1)查询操作
a.查询Map集合的size
    该接口定义,返回当前Map集合的key-value元素的数量。
    隐含条件:返回值类型为int,因此最大返回值数量不会超过Integer.MAX_VALUE。


int size();

b.判断Map集合是否为空
    该接口定义,用于判断当前Map集合是否为空。
    返回值为boolean类型,Map元素为空则true,否则返回false。


boolean isEmpty();

c.查询Map集合是否包含指定对象key
    该接口定义,主要用于查询指定key是否存在于Map集合中。
    返回值为boolean类型,查询到指定key对象则返回true,否则返回false。


boolean containsKey(Object key);

d.查询Map集合是否包含指定对象value
    该接口定义,主要用于查询指定对象value是否存在于Map集合中。
    返回值为boolean类型,查询到指定value对象则返回true,否则返回false。


boolean containsValue(Object value);

e.查询Map集合指定key对应的对象value
    该接口定义,主要用于查询指定Map集合中指定key,返回相应的value对象。
    返回类型为V,则返回的是value对象类型,那么该方法通常需使用者自己判断查询的value是否为空。


V get(Object key);

2)修改操作
    对于Map集合数据结构,Map接口类中涉及修改的就定义两个操作方法,添加和删除kv的操作,他们都是单笔kv的操作。

a.添加kv元素方法
    该方法设计返回值为value的对象类型
    注意:这里添加元素是否成功,对于使用者来讲,就根据返回的value的对象类型的对象来判断了。


V put(K key, V value);

b.删除kv元素方法
    该方法根据传入的key对象,查找并删除整个kv元素。
    注意:同样根据V类型的返回对象来判断删除的是否为null。


V remove(Object key);

3)批量处理
    Map接口类对于批量操作,规约了批量添加kv元素和clear清理整个Map集合内容的方法。

a.批量添加Map的KV元素
    通过拷贝一个已经存在的map数据集合。
    注意:该接口无返回类型,对于外部使用者通过异常捕获方式来判断是否方法使用异常。


void putAll(Map<? extends K, ? extends V> m);

b.批量清理Map集合元素
    注意:该接口无返回类型定义,外部使用者通过捕获定义的异常来判断方法执行情况。
    异常默认定义类型:UnsupportedOperationException


void clear();

4)数据集视图
    对于Map集合来讲,很多情况需要在不同的维度来查询map中的kv元素集,这种在很多情况下抽象定义成视图。视图可以从不同的角度来查询集合的数据结构元素集。
a.查询Map集合结构中key的集合数据
    注意:该接口方法返回类型为Set,将key的元素以Set的数据结构方式存放返回。另外该方法实现需要确保Map集合中元素的任何修改,都与该方法视图保持同步(想象下,数据库中的物化视图的概念)


Set keySet();

b.查询Map集合结构中Value的集合数据
    注意:该接口方法返回类型为Collection,将value的元素以Collection的数据结构方式存放返回。同样,该方法实现需要确保Map集合中元素的任何修改,都与该方法视图保持同步。(后续分析map具体实现类时,可以重点研究分析下如何保持修改同步的思路的)


Collection values();

c.查询Map集合结构中KV的集合数据
    注意:该接口方法返回类型为Set,将kv的键值对以Set的数据结构方式存放返回。该方法也要确保Map中任何元素修改会和Set视图同步。


Set<Map.Entry<K, V>> entrySet();

5)比较和散列操作(继承至Object超级类)
    比较和散列的方法在Java的超类Object中都有相应的定义,每个Java自定义的类都会默认继承超类Object。那么比较和散列的操作,只要各个自定义的类中有属于自己实现逻辑的定义,那么就可以重写这些方法,在编译运行会覆盖超类相应方法。

a.比较方法
    重写比较方法,该方法返回值类型为boolean类型。这个方法因为是超类Object的基本操作方法,因此输入参数也为通用Object对象,不同的元素对象输入会完成自动转换。
    比如该方法重写时,输入的参数对象内部会和Map进行转换,确保实现是输入的Map对象和当前Map进行比较。
两个Map内部元素完全相同则返回true,否则返回false。(在Map接口实现类AbstractMap中会有详细的定义实现)


boolean equals(Object o);

b.散列操作方法
    散列的操作和上述比较方法类似,都是根据需要重写覆盖的方法。hashcode方法主要用于对象寻址和比较上面,两个Map对象的比较,其中hashcode一定会相同,如果重写了equals方法,那么相应的hashcode也需要尽量重写。
    该方法在Map接口类中表示Map中所有的Entry元素的内部的hashcode值之和。


int hashCode();

6)内部元素Entry内部接口类 另外Map接口类中针对存放KV结构元素定义了相应的Entry<K,V>内部接口类,该接口类为默认访问权限,支持在同一个包定义中访问。
    Entry接口类同样定义了该接口中抽象方法接口,大概包括如下几类:
a.获取Entry元素中的key对象


K getKey();

b.获取Entry元素中的value对象


V getValue();

c.设置Entry元素中的value对象


V setValue(V value);

d.比较当前Entry元素对方方法重写定义


boolean equals(Object o);

e.当前Entry元素的hashcode计算方法重写定义


int hashCode();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值