Java之LinkedHashMap

本文详细介绍了 Java 中的 LinkedHashMap 类,包括它的类继承和实现关系、构造方法、方法摘要以及与 HashMap、Hashtable 和 TreeMap 的比较。LinkedHashMap 通过双向链表维护插入顺序或访问顺序,提供了有序迭代的特性。此外,文章还探讨了基于 LinkedHashMap 的 LRU 缓存实现以及源码分析,展示了如何通过重写 removeEldestEntry 方法实现缓存淘汰策略。
摘要由CSDN通过智能技术生成

——————————————————————————————————————————————

一、类的继承和实现关系:

public class LinkedHashMap<K,V> 

extends HashMap<K,V>

implements Map<K,V>

——————————————————————————————————————————————

二、构造方法摘要:

LinkedHashMap() 

          构造一个带默认初始容量 (16) 和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。 

LinkedHashMap(int initialCapacity) 

          构造一个带指定初始容量和默认加载因子 (0.75) 的空插入顺序 LinkedHashMap 实例。 

LinkedHashMap(int initialCapacity, float loadFactor) 

          构造一个带指定初始容量和指定加载因子的空插入顺序 LinkedHashMap 实例。 

LinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) 

          构造一个带指定初始容量、指定加载因子和排序模式的空 LinkedHashMap 实例。

          accessOrder - 排序模式 - 对于访问顺序,为 true;对于插入顺序,则为 false

LinkedHashMap(Map<? extends K,? extends V> m) 

          构造一个映射关系与指定映射相同的插入顺序 LinkedHashMap实例。 所创建的 LinkedHashMap 实例具有默认的加载因子 (0.75) 和足以容纳指定映射中映射关系的初始容量。

——————————————————————————————————————————————

三、方法摘要:
 void clear() 
          从该映射中移除所有映射关系。 

 boolean containsValue(Object value) 

          如果此映射将一个或多个键映射到指定值,则返回 true。 

 V get(Object key) 

          返回此映射中映射到指定键的值。 如果此映射中没有该键的映射关系,则返回 null。返回 null 值并不一定 表明此映射不包含该键的映射关系;

也可能此映射将该键显式地映射为 null。可使用 containsKey 操作来区分这两种情况。

protected  boolean removeEldestEntry(Map.Entry<K,V> eldest) 

          如果此映射移除其最旧的条目,则返回 true。 

——————————————————————————————————————————————

四、相对于Map的其他实现类的一些特性:

(常用的四个实现类:HashMap、Hashtable、LinkedHashMap、TreeMap)

  • Map主要用于存储健值对,并根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复。

1.一般情况下,我们用的最多的是HashMap。

2.在Map 中插入、删除和定位元素,HashMap 是最好的选择。

3.如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。

4.如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。


HashMap:

1.HashMap是一个最常用的Map,它根据键的hashCode值存储数据,具有很快的访问速度。

2.HashMap允许一条记录的键为NULL,允许多条记录的值为NULL。

3.HashMap不支持线程同步,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致性。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。

4.HashMap里面存储的数据是无序的,HashMap在put的时候是根据key的hashcode进行排序,然后放入对应的地方。

所以在按照一定顺序put进HashMap中,然后遍历出HashMap的顺序跟put的顺序不同(除非在put的时候key已经按照hashcode排序号了,这种几率非常小)。

单纯的HashMap是无法实现排序的,这儿的排序是指,我们将键值对按照一定的顺序put进HashMap里,然后在进行取键值对的操作的时候,是按照put进去的顺序把键值对取出来的。

5.因为HashMap无法排序,为了解决这个问题,JAVA在JDK1.4以后提供了LinkedHashMap来帮助我们解决排序问题。


Hashtable:

1.Hashtable与HashMap类似,Hashtable继承自Dictionary类,Java 2以后才实现了Map接口。

2.Hashtable与HashMap不同的是:Hashtable不允许记录的键或者值为空。

3.Hashtable支持线程同步,因此也导致了Hashtable在写入时会比较慢。

LinkedHashMap:

1.LinkedHashMap是HashMap的一个子类,但是不同的是LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的。

2.LinkedHashMap在遍历的时候会比HashMap慢,不过当容量很大,实际数据较少时例外,遍历起来可能会比HashMap快,

因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。

链接的哈希映射具有两个影响其性能的参数:初始容量和加载因子。为初始容量选择非常高的值对此类的影响比对 HashMap 要小,因为此类的迭代时间不受容量的影响。

3.如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步

4.它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。

5.LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。

6.重写 removeEldestEntry(Map.Entry) 方法来实施策略,以便在将新映射关系添加到映射自动移除旧的映射关系

7.LinkedHashMap与 HashMap 的不同之处在于,LinkedHashMap维护着一个运行于所有条目的双重链接列表。

此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。


TreeMap:

1.TreeMap在遍历的时候会比HashMap慢

2.TreeMap能够把它保存的数据根据键排序,默认是按升序排序,也可以另外指定排序的比较器。

3.当用Iterator遍历TreeMap时,得到的记录是排过序的。

4.Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。

5.TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。

6.TreeMap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。


HashMap与HashTable的区别:

1.同步性:Hashtable是同步的,而HashMap则是异步的。

2.执行效率:因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率.............

3.值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。

HashMap最多只有一个key值为null,但可以有无数多个value值为null,而Hashtable不允许键和值为null。

注意:

1.用作key的对象必须实现hashCode和equals方法。
2.两者都不能保证其中的键值对的顺序
3尽量不要使用可变对象作为它们的key值。


EnumMap类:

1.EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。

2.EnumMap根据key的自然顺序,即枚举值在枚举类中定义的顺序,来维护键值对的次序。

3.EnumMap不允许使用null作为key值,但value可以。


WeakHashMap:

1.WeakHashMap与HashMap的用法基本相同,区别在于:

 后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。

 但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。

2.WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。

IdentityHashMap类:

1.IdentityHashMap也HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。

2.IdentityHashMap也允许使用null,但不保证键值对之间的顺序。

——————————————————————————————————————————————

五、LinkedHashMap里面使用的LRU算法:

LRU算法摘自:http://blog.csdn.net/scelong/article/details/7187142

LRU(Least Recently Used),又叫:最近最少使用算法

1.将最近一段时间内最少被访问过的行淘汰出局。

2.因此需要为每行设置一个计数器,LRU算法是把命中行的计数器清零,其他各行计数器加1

3.当需要替换时淘汰行计数器计数值最大的数据行出局。

4.这是一种高效、科学的算法,其计数器清零过程可以把一些频繁调用后再不需要的数据淘汰出Cache,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值