专栏首页Vi的技术博客Java基础系列(四十七):集合之AbstractMap

Java基础系列(四十七):集合之AbstractMap

通知

亲爱的读者们,以后我每周更新两篇,周一更新基础底层,周五框架实战,上次投票的结果是JVM,我会在周一这一档等到基础系列完结后进行更新,周五目前更新的是spring boot 2.1.0系列,敬请期待~

AbstractMap

AbstractMapAbstractListAbstractCollection等抽象类类似,它实现了Map接口的部分方法,提供了一些基础的实现,我们耳熟能详的HashMap, TreeMap, ConcurrentHashMap 都是他的子类。

构造

AbstractMap提供了一个protected修饰的无参构造方法,意味着只有它的子类才能访问(当然它本身就是一个抽象类,其他类也不能直接对其实例化),也就是说只有它的子类才能调用这个无参的构造方法。

源码分析

可以看出AbstractMap提供了一些基础方法的实现,用于到增加/修改元素的put()putAll(),用于删除元素的remove()clear(),以及其他的一些用于判断或者获取这个Map的属性的一些方法。其中需要注意的是,put()putAll()子类必须重写,因为这里的实现仅仅是抛出一个异常,如果子类不进行重写,调用该方法就会抛出一个异常。

通过源码我们不难看出,这个类的方法基本是都是通过Entry这个对象来完成的,而获取这个对象的方法是entrySet()

这里的entrySet()方法却是一个抽象方法,具体的实现需要子类来完成,这是很典型的设计模式中的模板方法模式,那么何为模板方法模式呢?其实很好理解,就是在一个方法中定义一个算法的骨架,而将一些步骤的实现延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中某些步骤的具体实现。这里因为entrySet()AbstractMap中并未实现,而是交给了它的子类去完成,但是对于该类中的方法却可以对它进行一个“算法骨架” 实现,这就是模板方法模式。

还有两个我们经常会用到的视图属性

这两个视图分别是用于键构成的集合keySet以及值构成的集合values,在JDK 8 中将volatile的关键字给去掉了,不知道为毛,有知道的朋友可以私信我,我给添上~ 下面来看看怎么获取这两个视图:

可以看出,实际上它的实现是通过一个AbstractSet的匿名内部类,而该内部类的迭代器实际上就是该entrySet()的迭代器(没错,是它是它,就是它,我们的英雄小哪吒~),只不过在next()的时候调用了getKey(),而其他方法的实现都是调用了AbstractMap的中的方法,而values()方法的实现也与这个差不多,大家可以自己去源码中看一下,这里就不多占篇幅去说了。

两个内部类

没错,就是这两个货SimpleEntrySimpleImmutableEntry,他们都实现了Entry接口,那么问题来了,他们为什么是两个呢,因为从这个图上看,这俩货是一样的。。其实区别就在于setValue()这个方法。

这是SimpleEntry的setValue方法

这是SimpleImmutableEntry的setValue方法 可以看出,这两个类一个是可以修改的(SimpleEntry),而另一个是不能修改(SimpleImmutableEntry)的。这就是他们的区别所在。

视图是个啥

这节课,我们频繁的提到了一个词———集合视图,集合视图是什么? 简单的来说,就是有一定限制(只读,同步,受查,只能删除不能增加等等)的集合类,被限制的是视图,而不是集合,比如*.subList()Map.keySet()Map.values()Map.entrySet()Arrays.asList()这些都是集合视图,其实就是对原集合的一层包装 ,不同的集合视图有不同的用途,有的是只读有的是同步的。针对视图的操作会影响到集合的数据。

原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。

本文分享自微信公众号 - Vi的技术博客(viyoungblog),作者:ViYoung

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Java基础系列(十五):final关键字

    有时候,我们可能希望阻止其他人利用我们的编写的类来创建一个子类,可以将 final关键字放到类定义的前面,final类被称为无法扩展的类,定义方式如下所示:

    山禾说
  • Java基础系列(三十九):集合之Collection

    可以看出,作为顶级的框架,Collection仅仅是继承了Iterable接口,接下来,我们来看一下Iterable的源码,看看有什么收获。

    山禾说
  • 【两万字】面试官:听说你精通集合源码,接我二十个问题!

    这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这里的意思是指Map的KeySet获取到的一个...

    山禾说
  • 2018春秋圣诞欢乐赛web题解

    Do you know .swp file? 非正常关闭vi编辑器时会生成一个.swp文件

    安恒网络空间安全讲武堂
  • 如何使用SPSS快速上手商业数据分析

    SPSS,全称Statistical Product and Service Solutions 。最权威的标准统计软件之一,最初为社会科学统计软件,后更名为统...

    CDA数据分析师
  • 经典算法题:高楼扔鸡蛋

    今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼。国内大厂以及谷歌脸书面试都经常考察这道题,只不过他们觉得...

    帅地
  • 经典动态规划:高楼扔鸡蛋

    今天要聊一个很经典的算法问题,若干层楼,若干个鸡蛋,让你算出最少的尝试次数,找到鸡蛋恰好摔不碎的那层楼。

    五分钟学算法
  • Java配置文件的使用

    版权声明:本文为博主汪子熙原创文章,未经博主允许不得转载。 https://jerry.blog.csdn.net/article/detai...

    Jerry Wang
  • CSS居中:完全指南(译)

    CSS的居中是众多CSS难点的代表。为啥用CSS居中这么难呢?但是我认为这个问题其实并没有那么难啦,就是有很多种不同的方式可以达到居中的目的,这取决于不同的情景...

    用户1667431
  • 呆伯特(Dilbert) 的职场百态

    突然对 Dilbert manifestations 很好奇。维基百科上是这么说的,后来发现了这篇用来讽刺职场的《职场百态》,看了很有感触,和大家分享。

    顾宇

扫码关注云+社区

领取腾讯云代金券