有关Java的HashMap的实现的问题

问题描述

在Java中,对于HashMap的定义是这样的:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable 我想知道的是,为什么HashMap的父类AbstractMap已经implements了Map<K,V>接口,而在HashMap的定义中又再一次的声明implements Map<K,V>接口呢,这么做有什么意义呢? 我记得我学长给我的答案是为了更好的面向接口编程,但有些模糊,请大家指导一下;

解决方案

从编译和运行的角度来说,没有意义。但是从读者的角度来说,有意义。你可以考虑一下如下场景:1,你定义了一个接口,里面有10个抽象方法(接口里面的都是抽象方法)2,你有9个抽象类,抽象类1继承接口,实现了1个方法(可以只实现接口的部分方法)3,抽象类2继承抽象类1,同时又多实现了一个方法4,依次类推,每个抽象类依次继承上面的抽象类,每个都多实现一个方法。5,最后你的实现类实现抽象类9,把最后一个未实现的方法实现了。那么问题来了这时候你读源代码或者文档的时候,你根本不知道你这个类实现了什么接口,如果想知道的话,就要依次把抽象类9,8。。。一直找到抽象类1的时候,你才知道你的这个实现类实际上是实现了你第一步定义的接口,这样是不是对读者很不友好?如果每一层都明确声明实现了第一步的接口,那么你看实现类或者任一层次的抽象类的时候,你都不需要再找别的继承关系的类了,因为你可以直接跳到接口去看定义就可以了。这就是对读者友好的体现,推荐你以后的开发中注意这一点,代码主要是给人看的,对于机器来说,他只需要2进制字节就可以了。#你学长是忽悠你的,愿意钻研是好习惯,希望保持下去!
解决方案二:
学习下~~~~~~~~~~~~
解决方案三:
1、与面向接口编程没什么关系,因为不管是否声明implements Map<K,V>,对于使用者来说都没有什么影响;2、这个模式在JDK的很多集合类里面都在使用,我本人更倾向于增强可读性的说法 。看了HashMap的Javadoc马上就知道是实现了Map的接口(当然,通过AbstractMap也是可以知道的) 。对Map接口的Javadoc,能够明确的知道哪些类实现了这个接口:我没有测试过,猜想可能是生成Javadoc的时候对于接口的Implement只识别了一层,这样的情况下如果不明确声明的情况下接口的实现类列表里面就没有HashMap了。
解决方案四:
对“更好的面向接口编程”表示同意。通过源码可知:1:AbstractMap<K,V>对“实现Map接口所需做的工作”进行了最小化,即当需实现“unmodifiable不可修改”/“modifiable可修改”的Map时只需少量工作;2:HashMap<K,V>实现了Map接口的所有方法,除了clone()外无其他方法使用super,实现了AbstractMap中的entrySet方法;所以HashMap代码逻辑与AbstractMap的关系很小,类之间只有extend关系。另概念:父类引用指向子类对象代码:HashMap<String, String> map = new HashMap<String, String>();AbstractMap<String, String> aMap = map;Map<String, String> mMap = map;HashMap实例可以被AbstractMap或Map引用,实际使用更灵活。
解决方案五:
AbstractMap 和 Hashmap 里面都有对map的实现, 如果HashMap不implements Map, 那就是HashMap对AbstractMap 方法的覆盖.如果implements Map, 那就是对Map接口的实现.这个从语法方面讲,还是有些区别的.

时间: 2024-12-25 09:29:35

有关Java的HashMap的实现的问题的相关文章

java.utils.HashMap数据结构分析(转)

  上图为Hashmap的数据结构图,具体实线是采用数组结合链表实现,链表是为了解决在hash过程中因hash值一样导致的碰撞问题. 所以在使用自定义对象做key的时候,一定要去实现hashcode方法,不然hashmap就成了纯粹的链表,查找性能非常的慢,添加节点元素也非常的慢.如 import java.util.HashMap; import java.util.Map; public class User { private String username; public boolean

Javascript实现Java的HashMap(链表散列)

前言 如果你研究过Java中HashMap的源码,你就会知道HashMap底层的存储结构.Java中的HashMap是以链表散列的形式存储的,也就是数组+链表:HashMap中有一个Entry数组,默认的数组长度是16.这个值必须是2的整数次幂,以保证在通过key的hash值来计算entry应该放置的数组下标时可以尽量做到平均分配.而Entry数组中的每一个非空Entry都是一个Entry链表的头结点.这样做的好处就是HashMap结合了数组在寻址(查找)上的优势和链表在放置和删除上的优势.当一

聊聊 Java 中 HashMap 初始化的另一种方式

如果你接触过不同的语言,从语法和代码层面来说,Java 是一种不折不扣的"臃肿.啰嗦"的语言,从另一方面来说这种臃肿和啰嗦也体现了它严谨的一面,作为适合构建大型.复杂项目的理由之一. 1.HashMap 初始化的文艺写法 HashMap 是一种常用的数据结构,一般用来做数据字典或者 Hash 查找的容器.普通青年一般会这么初始化: HashMap<String, String> map = new HashMap<String, String>(); map.p

java.util.HashMap源码要点浅析

1.散列表要解决的一个问题就是散列值的冲突问题,通常是两种方法:链表法和开放地址法.链表法就是将相同hash值的对象组织成一个链表放在hash值对应的槽位:开放地址法是通过一个探测算法,当某个槽位已经被占据的情况下继续查找下一个可以使用的槽位.java.util.HashMap采用的链表法的方式,链表是单向链表,因此在删除过程中要自己维持prev节点,我想不采用双向链表是从节省空间考虑.一个典型的查找过程: for (Entry<K,V> e = table[indexFor(hash, ta

AngularJS操作键值对象类似java的hashmap(填坑小结)_AngularJS

前言: 我们知道java的hashmap中使用最多的是put(...),get(...)以及remove()方法,那么在angularJS中如何创造(使用)这样一个对象呢 思路分析: 我们知道在java中可以采用链式访问和"[]"访问hashmap的某一个值 具体实现: 链式访问: .factory('ParamsServices', function () { var params = {}; return { get: function (key) { return params.

java使用hashMap缓存保存数据的方法_java

本文实例讲述了java使用hashMap缓存保存数据的方法.分享给大家供大家参考,具体如下: private static final HashMap<Long, XXX> sCache = new HashMap<Long, XXX>(); private static int sId = -1; public static void initAlbumArtCache() { try { //... if (id != sId) { clearCache(); sId = id

Java的HashMap源码实现分析教程

1.简介 通过上面的一篇随笔我们知道了HashSet的底层是采用Map实现的,那么Map是什么?它的底层又是如何实现的呢?这下我们来分析下源码,看看具体的结构与实现.Map 集合类用于存储元素对(称作"键"和"值"),其中每个键映射到一个值.Map.Entry是其的内部类,描述Map中的按键/数值对.需要指出的是 Map,允许null的键也允许null的值.它的实现主要有HashMap和sortedMap,其中SortedMap扩展了Map使按键保持升序排列,下面我

java遍历HashMap简单的方法_java

本文实例讲述了java遍历HashMap简单的方法.分享给大家供大家参考.具体实现方法如下: import java.util.HashMap; import java.util.Iterator; import java.util.Set; public class HashSetTest { public static void main(String[] args) { HashMap map = new HashMap(); map.put("a", "aa"

Java中HashMap和TreeMap的区别深入理解_java

首先介绍一下什么是Map.在数组中我们是通过数组下标来对其内容索引的,而在Map中我们通过对象来对对象进行索引,用来索引的对象叫做key,其对应的对象叫做value.这就是我们平时说的键值对. HashMap通过hashcode对其内容进行快速查找,而 TreeMap中所有的元素都保持着某种固定的顺序,如果你需要得到一个有序的结果你就应该使用TreeMap(HashMap中元素的排列顺序是不固定的). HashMap 非线程安全 TreeMap 非线程安全 线程安全 在Java里,线程安全一般体

Oracle+ibatis的&amp;amp;lt;select&amp;amp;gt;中resultClass是java.util.HashMap 返回结果key都是大写的变量名 如何解决

问题描述 如题:Oracle+ibatis的<select>中resultClass是java.util.HashMap 返回结果key都是大写的变量名 如何解决如果用resultClass用自定义的class可以解决,那么不同的多表查询岂不是要定义多个class来装这些结果集,即便是用resultMap还是得定义相关的配置,总不会每定义一个<select>(假设都是多表查询,而且都是不同的表),都要定义一个resultClass或者resultMap吧?我现在的问题是:用ibat