Java中详解AbstractMap抽象类

  

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

  

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

  

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

  

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

  

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

  

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

  

公共静态类SimpleEntry实现Entry java.io.Serializable

  

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

  

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

        公共布尔=(对象o) {   如果(!(o instanceof map . entry))//判断参数是否是map . entry类型,要等于相等首先得是同一个类型   返回错误;   Map.Entry<& # 63; & # 63;比;e=(Map.Entry<& # 63; & # 63;祝辞)o;//将对象类型强转为map . entry类型,这里参数使用“& # 63;而不是“K、V”是因为泛型在运行时类型会被擦除,编译器不知道具体的K、V是什么类型   返回eq(键,e.getKey ()),,eq(价值,e.getValue ());//键和值分别调用情商方法进行判断,都返回真正的平等时才相等。   }            私有静态布尔eq (o1,对象o2) {   返回o1==null & # 63;o2==null: o1.equals (o2);//这个三目运算符也很简单,只不过需要注意的是尽管这里o1、o2是对象类型、对象类型的=方法是通过“==北冉系囊?所以不要认为这里有问题,因为在实际中,o1类型有可能是字符串,尽管被转为了对象,所以此时在调用=方法时还是调用的字符串#=方法。   }      

要想正确重写=方法并能正确使用,通常还需要重写hashCode方法。

        公共int hashCode () {   返回(关键==null & # 63;0:key.hashCode()) ^(值=https://www.yisu.com/zixun/=零?0:value.hashCode ());//键和值的值不为空时,将它们的hashCode进行异或运算。   }      

公共静态类SimpleImmutableEntry实现Entry io。Serializable SimpleImmutableEntry

  

定义为不可变的条目,其实是事实不可变,因为它不提供setValue方法,在多个线程同时访问时自然不能通过setValue方法进行修改。它相比于SimpleEntry其键和值成员变量都被定义为了最后的类型。调用setValue方法将会抛出UnsupportedOperationException异方式常。

  

它的equals和hashCode方法和SimpleEntry一致。

  

接下来查看AbstractMap抽象类实现了哪些地图接口中的方法。

  

<强>公共int大小()

  

地图中定义了一个entrySet方法,返回的是Map . entry集的组合,直接调用设置集合尺寸的方法即是地图的大小。

  

<强>公共布尔isEmpty()

  

调用上面大小的方法,等于0即为空。

  

<强>公共布尔containsKey(对象键)

  

这个方法的实现较为简单,通过调用entrySet方法获取组集合的迭代器遍历Map . entry,与参数键比较. Map可以存储为零的关键值,由于关键=零在地图中存储比较特殊(不能计算hashCode值),所以在这里也做了判断参数的关键是否为空。

  

<强>公共布尔containsValue(对象值)

  

这个方法实现和containsKey一致。

  

<强>公共V(对象键)

  

这个方法实现和上面两个也类似,不同的是上面相等返回布尔,这个方法返回值值。

  

Java中详解AbstractMap抽象类