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

nik*_*hil 7 java types hashmap linkedhashmap data-structures

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

sTg*_*sTg 11

  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( )
Run Code Online (Sandbox Code Playgroud)

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

LinkedHashMap(int capacity)
Run Code Online (Sandbox Code Playgroud)

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

 LinkedHashMap(int capacity, float fillRatio)
Run Code Online (Sandbox Code Playgroud)

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

LinkedHashMap(Map m)
Run Code Online (Sandbox Code Playgroud)

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

LinkedHashMap(int capacity, float fillRatio, boolean Order)
Run Code Online (Sandbox Code Playgroud)

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

LinkedHashMap支持的重要方法

 Class clear( )
Run Code Online (Sandbox Code Playgroud)

从地图中删除所有映射.

containsValue(object value )>
Run Code Online (Sandbox Code Playgroud)

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

 get(Object key)
Run Code Online (Sandbox Code Playgroud)

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

removeEldestEntry(Map.Entry eldest)
Run Code Online (Sandbox Code Playgroud)

下面是如何使用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);  
Run Code Online (Sandbox Code Playgroud)

  • 他询问的是实际用例,而不是它是如何工作的。你读过问题了吗? (3认同)

Sub*_*der 8

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


小智 5

LinkedHashMap保持键的插入顺序,即键插入的顺序LinkedHashMap。另一方面HashMap,不维护任何顺序,键或值。在性能方面,两者之间HashMap并没有太大区别,LinkedHashMap但是,LinkedHashMap具有比HashMap维护双向链接列表更多的内存占用空间,可用来跟踪按键的插入顺序。

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

HashMap是一个哈希表,在每个散列时隙桶。

API文档:

假设哈希函数将元素正确分散在存储桶中,则此实现为基本操作(获取和放置)提供恒定时间的性能。集合视图上的迭代所需的时间与HashMap实例的“容量”(存储桶数)及其大小(键-值映射数)成正比。因此,如果迭代性能很重要,则不要将初始容量设置得过高(或负载因子过低),这一点非常重要。

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

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

  • 每种情况的实际情况如何?为什么我们会选择它? (2认同)

Aru*_*air 5

  • HashMap绝对不保证迭代顺序。添加新元素时,它甚至可以(并将)完全改变。
  • LinkedHashMap将在将条目放入地图的顺序中进行迭代
  • 由于此排序功能,LinkedHashMap还比HashMap需要更多的内存。如前所述,LinkedHashMap使用双重LinkedList来保持元素顺序。