详解Java中AbstractMap抽象类-创新互联

jdk1.8.0_144 下载地址:https://www.jb51.net/softs/551512.html

创新互联建站专注于企业全网整合营销推广、网站重做改版、沙河口网站定制设计、自适应品牌网站建设、HTML5商城网站制作、集团公司官网建设、成都外贸网站建设、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为沙河口等各大城市提供网站开发制作服务。

AbstractMap抽象类实现了一些简单且通用的方法,本身并不难。但在这个抽象类中有两个方法非常值得关注,keySet和values方法源码的实现可以说是教科书式的典范。

抽象类通常作为一种骨架实现,为各自子类实现公共的方法。上一篇我们讲解了Map接口,此篇对AbstractMap抽象类进行剖析研究。

Java中Map类型的数据结构有相当多,AbstractMap作为它们的骨架实现实现了Map接口部分方法,也就是说为它的子类各种Map提供了公共的方法,没有实现的方法各种Map可能有所不同。

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

在Map接口中其内部定义了一个Entry接口,这个接口是Map映射的内部实现用于维护一个key-value键值对,key-value存储在这个Map.Entry中。AbstractMap对这个内部接口进行了实现,一共有两个:一个是可变的SimpleEntry和一个是不可变的SimpleImmutableEntry。

public static class SimpleEntry implements Entry, java.io.Serializable

实现了Map.Entry接口,并且实现了Serializable(可被序列化)。

它的方法比较简单都是取值存值的操作,对于key值的定义是一个final修饰意味着是一个不可变的引用。另外其setValue方法稍微特殊,存入value值返回的并不是存入的值,而是返回的以前的旧值。需要重点学习的是它重写的equals和hashCode方法。

public boolean equals(Object o) {
  if (!(o instanceof Map.Entry))    //判断参数是否是Map.Entry类型,要equals相等首先得是同一个类型
    return false;
  Map.Entry<?,?> e = (Map.Entry<?,?>)o;    //将Object类型强转为Map.Entry类型,这里参数使用“?”而不是“K, V”是因为泛型在运行时类型会被擦除,编译器不知道具体的K,V是什么类型
  return eq(key, e.getKey()) && eq(value, e.getValue());    //key和value分别调用eq方法进行判断,都返回ture时equals才相等。
}

当前题目:详解Java中AbstractMap抽象类-创新互联
网站地址:http://cdiso.cn/article/dossgp.html

其他资讯