HashMap和LinkedHashMap
HashMap和LinkedHashMap是Java平台中最常见和通用的两种Map实现。它们基本上是基于哈希的类,彼此非常相似,用于创建Map。 Map接口是主要的Collections Framework接口的最后一个,它定义了一组键值相关联所支持的操作,其中键是唯一的。这些Map实现基于散列算法。当HashMap类实现无序映射时,LinkedHashMap类实现有序映射。 LinkedHashMap实现是HashMap类的子类,这意味着它继承了HashMap类的功能。两者在性能方面没有太大差异。让我们来看看。
什么是HashMap?
HashMap是基于散列算法的Java中Map接口的最常见和四种通用实现之一。它类似于set类HashSet,但两个类中的元素都是无序的。它实现为哈希表,但与LinkedHashMap不同,它不会在键或值上维护任何顺序。通常,HashMap为put和get提供恒定时间性能。该类不是线程安全的,但它允许一个空键和多个空值。由于它不维持迭代顺序,因此需要较少的内存。
什么是LinkedHashMap?
LinkedHashMap是Map接口的四个通用实现之一,它是HashMap类的子类,意味着它继承了它的特性。虽然它在性能方面与HashMap非常相似,但它维护了键的插入顺序,无论是按键插入到Map中的顺序还是在Map中访问条目的顺序。它通过保证迭代器返回其元素的顺序来细化其父类的合约。但是,它需要比HashMap更多的内存,因为它在Java中维护一个双向链表。
HashMap和LinkedHashMap之间的区别
HashMap是Java中基于哈希的Map接口实现。映射是键值对的集合,在列表为有序集合时使用。 HashMap是一个Collection类,它将值存储在键值对中。简单来说,它将键映射到值意味着它可以根据键定位值。 LinkedHashMap是Map接口的链接列表实现,就像HashMap一样,除了它维护插入其中的元素的顺序。它是HashMap的一个子类,它继承了它的功能。 LinkedHashMap通过保证迭代器返回其元素的顺序来细化其父类HashMap的契约。
HashMap和LinkedHashMap之间的关键区别在于顺序。 HashMap的元素不是有序的,完全是随机的,而LinkedHashMap的元素是有序的。 LinkedHashMap的条目是按键插入顺序,这是键在Map中插入的顺序。这意味着首先枚举插入到Map中的第一个键,与之关联的值以及最后枚举中插入的最后一个条目也是如此。 LinkedHashMap具有可预测的迭代顺序,这意味着它还可以按访问顺序维护其元素,访问顺序是访问条目的顺序。
HashMap和LinkedHashMap类都使用散列来实现Java中的Map接口,除了HashMap是作为哈希表实现的,而LinkedHashMap维护着一个双向链接的Buckets列表。这就是为什么LinkedHashMap需要比HashMap更多的内存,因为与HashMap不同,它维护一个顺序。它消除了HashMap的混乱排序,而不会产生因TreeMap而产生的额外成本。除此之外,LinkedHashMap类在许多方面与HashMap类非常相似,例如同步和空键/值,因为它们都允许一个空键和多个空值。
虽然这两个类提供了相当的性能,但如果排序不是问题,HashMap类被认为是首选,因为它不能保证Map的迭代顺序。基于密钥添加,删除或查找条目等操作是固定时间,因为它们会对密钥进行散列。因此,在LinkedHashMap中添加,删除和查找条目可能比在HashMap中稍微慢一些,因为它在Java中维护了一个双向链接的Buckets列表。此外,HashMap比LinkedHashMap需要更少的内存,因为没有维护订单。
HashMap与LinkedHashMap:比较图表
HashMap的概述。 LinkedHashMap的
虽然HashMap和HashMap类的性能几乎相似,但HashMap需要的内存少于LinkedHashMap,因为它不能保证地图的迭代顺序,这使得在HashMap中添加,删除和查找条目的速度比使用HashMap相同。 LinkedHashMap。但是,两者之间的关键区别在于顺序:HashMap的元素不是有序的,而LinkedHashMap的元素默认是按键插入顺序,这意味着键被插入到地图中的顺序。 LinkedHashMap还可以按访问顺序维护其元素,这意味着访问条目的顺序。与LinkedHashMap一样,必须维护双向链表,它的性能低于HashMap。