2014-10-29 86 views
2

在链接的hashmap和hashmap中进行选择的实际场景是什么?我已经完成了每项工作,并得出结论,即链接映射保持插入的顺序,即元素将以与插入顺序相同的顺序检索,而散列映射不会维护顺序。 那么有人可以告诉在实际场景中选择其中一个集合框架,为什么?什么时候在java中通过hashmap使用linkedhashmap?

+0

的([HashMap的,LinkedHashMap的和TreeMap之间的不同]可能的复制http://stackoverflow.com/questions/2889777/difference -Hashmap-linkedhashmap-and-treemap) – Jimmar 2016-10-26 01:14:41

+0

LinkedHashMap的常见用法是LRUCache:http://stackoverflow.com/questions/23772102/lru-cache-in-java-with-generics-and-o1-operations – 2017-02-28 21:03:27

回答

2

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

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

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

API文档:

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

LinkedHashMap是一个实现地图接口的链表。

哈希表和Map接口的链接列表实现,具有 预知的迭代顺序:作为 API文档中说。该实施方式与HashMap 的不同之处在于其保持通过其所有 条目运行的双向链表。此链接列表定义了迭代排序,通常是键被插入到地图 (插入顺序)中的顺序。

+0

什么可能是每个的实际情况?为什么我们会选择它? – nikhil 2014-10-29 05:13:12

+0

请通过突出显示的部分。我希望你能得到答案 – 2014-10-29 05:16:29

2
  • 的HashMap使有关迭代顺序绝对没有保证。它可以(并且将)甚至在添加新元素时完全改变。
  • 的LinkedHashMap将迭代在沃德中的R其中的条目被放进地图
  • LinkedHashMap中也需要比HashMap的,因为这种排序功能的更多的内存。正如我之前所说LinkedHashMap使用双重LinkedList来保持元素的顺序。
1

在大多数情况下,当使用Map时,您并不在乎是否保留插入顺序。如果您不在意,请使用HashMap,并且您关心LinkedHashMap。但是,如果您查看使用地图的时间和地点,在很多情况下,它只包含少量条目,不足以满足不同实现的差异。

4

购物车是一个现实生活中的例子,我们看到购物车号码与我们选择的物品相对应,以便我们选择该物品。因此,地图可能是LinkedHashMap<Cart Number Vs Item Chosen>

4
  1. 的LinkedHashMap将在该项目中投入了地图的顺序进行迭代。

  2. 在LinkedHashMap中允许空值。

  3. 该实现不同步并使用双链接桶。

  4. LinkedHashMap与HashMap非常相似,但增加了对项目添加或访问项目的顺序的了解,因此迭代顺序与插入顺序相同,具体取决于构造参数。

  5. LinkedHashMap通过重写removeEldestEntry()方法为创建Cache对象提供了一个很好的起点。这使您可以使用您定义的某些条件创建可使数据过期的Cache对象。

  6. 基于带链接列表的链接列表和哈希数据结构(思考索引SkipList)以数据插入树中的方式存储数据。最适合实施LRU(最近最少使用)。 LinkedHashMap扩展了HashMap。

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

LinkedHashMap() 

此构造具有默认初始容量(16)和负载因子(0.75)的空插入顺序LinkedHashMap实例。

LinkedHashMap(int capacity) 

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

LinkedHashMap(int capacity, float fillRatio) 

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

LinkedHashMap(Map m) 

此构造函数使用与指定的Map相同的映射构造插入顺序Linked HashMap。

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); 
相关问题