何时在java中使用hashhashmap而不是hashmap?

问题描述 投票:7回答:5

在linkedhashmap和hashmap中选择的实际场景是什么?我已经完成了每个工作并得出结论,linkhashmap维护插入的顺序,即元素将以与插入顺序相同的顺序检索,而hashmap将不维护顺序。那么有人可以告诉在什么实际场景中选择其中一个集合框架以及为什么?

java data-structures types hashmap linkedhashmap
5个回答
10
投票
  1. LinkedHashMap将按照条目放入地图的顺序进行迭代。
  2. LinkedHashMap中允许使用Null值。
  3. 实现不同步并使用双链接桶。
  4. LinkedHashMap与HashMap非常相似,但它增加了对添加或访问项的顺序的感知,因此迭代顺序与插入顺序相同,具体取决于构造参数。
  5. LinkedHashMap还为通过覆盖removeEldestEntry()方法创建Cache对象提供了一个很好的起点。这使您可以使用您定义的某些条件创建可以使数据到期的Cache对象。
  6. 基于链表和散列数据结构,链接列表(想想indexed-SkipList)能够以插入树中的方式存储数据。最适合实施LRU(最近最少使用)。 LinkedHashMap扩展了HashMap。

它按照插入顺序维护地图中条目的链接列表。这允许在地图上进行插入顺序迭代。也就是说,当迭代LinkedHashMap的集合视图时,元素将按插入顺序返回。此外,如果再次将密钥插入LinkedHashMap,则保留原始订单。这允许在地图上进行插入顺序迭代。也就是说,在迭代LinkedHashMap时,元素将按插入顺序返回。您还可以创建一个LinkedHashMap,它按照上次访问的顺序返回其元素。 - 以下是它的构造函数:

LinkedHashMap( )

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

LinkedHashMap(int capacity)

此构造函数构造具有指定初始容量的空LinkedHashMap。

 LinkedHashMap(int capacity, float fillRatio)

此构造函数使用指定的初始容量和加载因子构造一个空的LinkedHashMap。

LinkedHashMap(Map m)

此构造函数构造一个插入顺序的Linked HashMap,其映射与指定的Map相同。

LinkedHashMap(int capacity, float fillRatio, boolean Order)

此构造函数构造一个具有指定初始容量,加载因子和排序模式的空LinkedHashMap实例。

LinkedHashMap支持的重要方法

 Class clear( )

从地图中删除所有映射。

containsValue(object value )>

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

 get(Object key)

返回指定键映射到的值,如果此映射不包含键的映射,则返回null。

removeEldestEntry(Map.Entry eldest)

下面是如何使用LinkedHashMap的示例:

Map<Integer, String> myLinkedHashMapObject = new LinkedHashMap<Integer, String>();  
myLinkedHashMapObject.put(3, "car");  
myLinkedHashMapObject.put(5, "bus");  
myLinkedHashMapObject.put(7, "nano");  
myLinkedHashMapObject.put(9, "innova");  
System.out.println("Modification Before" + myLinkedHashMapObject);  
System.out.println("Vehicle exists: " +myLinkedHashMapObject.containsKey(3));  
System.out.println("vehicle innova Exists: "+myLinkedHashMapObject.containsValue("innova"));  
System.out.println("Total number of vehicles: "+ myLinkedHashMapObject.size());  
System.out.println("Removing vehicle 9: " + myLinkedHashMapObject.remove(9));  
System.out.println("Removing vehicle 25 (does not exist): " + myLinkedHashMapObject.remove(25));  
System.out.println("LinkedHashMap After modification" + myLinkedHashMapObject);  

7
投票

购物车是一个真实的例子,我们看到购物车号码与我们选择的物品相对应。所以地图可能是LinkedHashMap<Cart Number Vs Item Chosen>


5
投票
  • HashMap绝对不保证迭代顺序。当添加新元素时,它甚至可以(并且将)完全改变。
  • LinkedHashMap将按照条目放入地图的顺序进行迭代
  • 由于这种排序功能,LinkedHashMap还需要比HashMap更多的内存。正如我之前所说,LinkedHashMap使用双重LinkedList来保持元素的顺序。

4
投票

LinkedHashMap维护密钥的插入顺序,即密钥插入LinkedHashMap的顺序。另一方面,HashMap不保留任何订单或键或值。在性能方面,HashMapLinkedHashMap之间没有太大区别,但是LinkedHashMap比HashMap有更多的内存占用,以维护用于跟踪键的插入顺序的双向链表。

HashMapLinkedHashMap具有更好的性能,因为LinkedHashMap需要维护链表的费用。 LinkedHashMap实现了一个普通的哈希表,但是哈希表的键的附加好处是存储为双向链表。他们的两种方法都不同步。我们来看看他们的API文档:

HashMap是一个哈希表,每个哈希槽都有桶。

API文档:

假设散列函数在桶之间正确地分散元素,该实现为基本操作(get和put)提供了恒定时间性能。对集合视图的迭代需要与HashMap实例的“容量”(桶的数量)加上其大小(键 - 值映射的数量)成比例的时间。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。

LinkedHashMap是一个实现地图界面的链表。如API文档中所述:

Map接口的哈希表和链表实现,具有可预测的迭代顺序。此实现与HashMap的不同之处在于它维护了一个贯穿其所有条目的双向链表。此链接列表定义迭代排序,通常是键插入映射的顺序(插入顺序)。


3
投票

在大多数情况下,使用Map时,您不关心是否保持插入顺序。如果你不在乎,请使用HashMap,并且你关心的是LinkedHashMap。

但是,如果您查看使用映射的时间和位置,在许多情况下它只包含少量条目,不足以使不同实现的性能差异产生差异。

© www.soinside.com 2019 - 2024. All rights reserved.