您的位置:首页 > 编程语言 > Java开发

java里map相关子接口和实现类

2016-10-18 17:22 441 查看
今天写java缓存的时候,用到ConcurrentHashMap,突发想把是涉及到map相关的map子接口和实现列详细的讲解一下,希望对初学者有所帮助!

首先许多面试问题会经常问 在线程安全里会用到哪些map实现类啊,hashmap与hashtable与LinkedHashMap的区别啊等等。当你对map接口有所了解时,这些对你来所就是小ks啦

首先map是一个接口,他已知的子接口有

Bindings,
ConcurrentMap<K,V>,
ConcurrentNavigableMap<K,V>,
LogicalMessageContext,
MessageContext, NavigableMap<K,V>,
SOAPMessageContext,
SortedMap<K,V>;

这个经常不怎么会用到map的子接口

接着map的已知实现类有

AbstractMap,
Attributes, AuthProvider,
ConcurrentHashMap,
ConcurrentSkipListMap,
EnumMap,
HashMap, Hashtable,
IdentityHashMap, LinkedHashMap,
PrinterStateReasons,
Properties,
Provider, RenderingHints,
SimpleBindings,
TabularDataSupport, TreeMap,
UIDefaults,
WeakHashMap

其中经常会用到的是 ConcurrentHashMap,HashMap,HashTable,LinkedHashMap,TreeMap,WeakHashMap

其中ConcurrentHashMap和WeakHashMap在实现java缓存(建议初学者把这个弄懂,对面试和在工作上有很大的帮助的)的时候会用到,这里就不详解啦!

其中 HashTable,TreeMap是比较古老的Map实现类啦,现今也很少用啦,但有点公司还在用的,现在用的比较多的是HashMap,LinkedHashMap.

其中HashTable,HashMap,TreeMap,LinkedHashMap之间存在哪些的区别呢?

 HashMap:以key-value的形式存在。在HashMap中,key-value总是会当做一个整体来处理,系统会根据hash算法来来计算key-value的存储位置,我们总是可以通过key快速地存、取value..允许key值为空,在线程中,他是线程不安全的.

HashTable:也是已键值的方式存取数据,但是他的key不允许为空但是他是线程安全的,虽然性能上没有HashMap好,但是安全的.

LinkedHashMap:保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap,LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。

对于LinkedHashMap而言,它继承与HashMap、底层使用哈希表与双向链表来保存所有元素。其基本操作与父类HashMap相似,它通过重写父类相关的方法,来实现自己的链接列表特性.

注意:HashMap,HashTable,LinkedHashMap判断值是否相等都是用hashcode的算法,所以要真正判断值是否相等,从写hashcode和equal方法

LinkedHashMap
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息