重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
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
实现了Map.Entry
它的方法比较简单都是取值存值的操作,对于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才相等。 }