LinkedHashMap和HashMap的区别

2019-03-15 23:18|来源: 网络

java为数据结构中的映射定义了一个接口java.util.Map;它有四个实现类,分别是HashMap Hashtable LinkedHashMap 和TreeMap.


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


Hashmap 是一个最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。 HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力,或者使用ConcurrentHashMap。


Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空;它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。


LinkedHashMap 是HashMap的一个子类,保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。


TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列.


本文链接:LinkedHashMap和HashMap的区别,本文转自:http://honphenc.blog.163.com/blog/static/189617345201272892126638/

相关问答

更多
  • 一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列. HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。 HashMap不支持线程同步,即任一 ...
  • 一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列. HashMap是一个最常用的Map,它根据键的hashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为NULL,允许多条记录的值为NULL。 HashMap不支持线程同步,即任一 ...
  • HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用Collections的synchronizedMap方法使HashMap具有同步的能力。 LinkedHashMap LinkedHashMap也是一个HashMap,但是内部维持了一个双 ...
  • 顾名思义LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重 链表的HashMap,LinkedHashMap支持2中排序一种是插入排序,一种是使用排序,最近使用的会移至尾部例如 M1 M2 M3 M4,使用M3后为 M1 M2 M4 M3了,LinkedHashMap输出时其元素是有顺序的,而HashMap输出时是随机的,如果Map映射比较复杂而又要求高效率的话,最好使用 LinkedHashMap,但是多线程访问的话可能会造成 ...
  • LinkedHashMap将占用更多内存。 正常HashMap每个条目都只有键和值。 每个LinkedHashMap条目都有这些引用和对下一个和前一个条目的引用。 还有一点家务要做,尽管这通常是无关紧要的。 LinkedHashMap will take more memory. Each entry in a normal HashMap just has the key and the value. Each LinkedHashMap entry has those references and re ...
  • 所有三个类都实现了Map界面,并提供了大部分相同的功能。 最重要的区别是将通过条目进行迭代的顺序: HashMap绝对不能保证迭代顺序。 当添加新元素时,它可以(并且将)甚至完全改变。 根据它们的compareTo()方法(或外部提供的Comparator ),按照“自然排序”键将重新生成TreeMap 。 另外,它实现了SortedMap接口,其中包含依赖于此排序顺序的方法。 LinkedHashMap将按照将条目放入地图的顺序进行迭代 “哈希表”是基于哈希的地图的通用名称。 在Java API的上下文中 ...
  • 所有提示您可以从HashMap创建LinkedHashMap的答案在技术上都是正确的,但不会给你想要的结果:-( 当然,您可以从HashMap创建LinkedHashMap ,但不能保证LinkedHashMap的顺序与您的原始顺序相同。 问题在于,当LinkedHashMap作为普通的无序Map存储到持久性存储中时,它会被序列化,这不会持续单个项目的排序。 然后,当你从持久存储中提取对象时,它将作为普通的HashMap返回,并且已经失去了“排序”(这就是你首先想要的LinkedHashMap )。 如果你 ...
  • 从Class.getMethods()的javadoc中: 返回的数组中的元素没有排序并且没有任何特定的顺序。 但是,您的代码假定索引0处的元素是方法Foo() 。 不要做这个假设。 找到名称为Foo的方法。 这就是说,反思可能不是你想要做的工作的正确工具。 你应该在更高层次上解释你想要做什么以及为什么你认为使用反射是一个好主意。 通常情况下,不是。 From the javadoc of Class.getMethods(): The elements in the array returned are ...
  • 保持插入顺序与其相关的成本,无论是在需要更多的内存和额外的CPU周期: 您需要额外的内存来保留额外的链接, 您需要额外的CPU周期来维护它。 虽然渐近的复杂性是相同的,但增加的便利性不是免费的。 如果您不需要维护插入顺序,则不必为其付费,而是使用轻量级HashSet和HashMap 。 Keeping the insertion order has its associated costs, both in terms of needing more memory, and spending ...