LinkedHashMap是比HashMap多了一个链表的结构。与HashMap相比LinkedHashMap维护的是一个具有双重链表的HashMap,LinkedHashMap支持两种排序:一种是插入排序,一种是使用排序,最近使用的会移至尾部例如 M1 M2 M3 M4,使用M3后为 M1 M2 M4 M3了。
LinkedHashMap输出时其元素是有顺序的,而HashMap输出时是随机的,如果Map映射比较复杂而又要求高效率的话,最好使用LinkedHashMap,但是多线程访问的话可能会造成不同步,所以要用Collections.synchronizedMap来包装一下,从而实现同步。其实现一般为:
Map<String Object> map = Collections.synchronizedMap(new LinkedHashMap(<String Object));
HashMap,LinkedHashMap,TreeMap都属于Map:
Map 主要用于存储键(key)值(value)对,根据键得到值,因此键不允许键重复,但允许值重复。
HashMap 是一个最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为 Null;HashMap不支持线程的同步,即任一时刻可以有多个线程同时写HashMap;可能会导致数据的不一致。如果需要同步,可以用 Collections的synchronizedMap方法使HashMap具有同步的能力。
LinkedHashMap也是一个HashMap,但是内部维持了一个双向链表,可以保持顺序。
TreeMap 不仅可以保持顺序,而且可以用于排序 HashMap。
Hashtable与 HashMap类似,它继承自Dictionary类,不同的是:它不允许记录的键或者值为空,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了 Hashtable在写入时会比较慢。
LinkedHashMap 是HashMap的一个子类,在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比 LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
一般情况下,我们用的最多的是HashMap,在Map 中插入、删除和定位元素,HashMap 是最好的选择。但如果要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap 可以实现,它还可以按读取顺序来排列。
List是一个接口,而ArrayList是一个类。 ArrayList继承并实现了List。List list = new ArrayList();这句创建了一个ArrayList的对象后把上溯到了List。此时它是一个List对象了,有些ArrayList有但是List没有的属性和方法,它就不能再用了。而ArrayList list=new ArrayList();创建一对象则保留了ArrayList的所有属性。
为什么一般都使用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如 LinkedList或者Vector等等,这时你只要改变这一行就行了:List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。假设你开始用 ArrayList alist = new ArrayList(), 这下你有的改了,特别是如果你使用了 ArrayList特有的方法和属性。
举例说明三者区别如下所示:
package com.map.test; import java.text.CollationKey; import java.text.Collator; import java.util.Comparator; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; public class MapTestDemo { public void hashMapTest () { Map<String, Object> map = new HashMap<String, Object>(); map.put("a3", "aa"); map.put("a2", "bb"); map.put("b1", "cc"); for (Iterator<Object> iterator = map.values().iterator(); iterator.hasNext();) { Object name = iterator.next(); System.out.println(name); } } public void linkedHashMapTest () { Map<String, Object> map = new LinkedHashMap<String, Object>(); map.put("a3", "aa"); map.put("a2", "bb"); map.put("b1", "cc"); for (Iterator<Object> iterator = map.values().iterator(); iterator.hasNext();) { Object name = iterator.next(); System.out.println(name); } } public void treeMapTest () { Map<String, Object> map = new TreeMap<String, Object> (new Comparator<Object>(){ Collator collator = Collator.getInstance(); public int compare(Object o1, Object o2) { CollationKey key1 = collator.getCollationKey(o1.toString()); CollationKey key2 = collator.getCollationKey(o2.toString()); return key1.compareTo(key2); } }); map.put("a3", "aa"); map.put("a2", "bb"); map.put("b1", "cc"); for (Iterator<Object> iterator = map.values().iterator(); iterator.hasNext();) { Object name = iterator.next(); System.out.println(name); } } public static void main(String[] args) { MapTestDemo d = new MapTestDemo(); d.hashMapTest(); d.linkedHashMapTest(); d.treeMapTest(); } }
运行结果如下所示:
不同的遍历方式(输出Key及Value)如下所示:
package com.map.test; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; public class mapTestExample { public static void main(String args[]) { System.out.println("*************************LinkedHashMap*************"); Map<String,String> map = new LinkedHashMap<String,String>(); map.put("first", "apple"); map.put("second", "banana"); map.put("third","pear"); for (Iterator it = map.keySet().iterator();it.hasNext();) { String key = (String) it.next(); System.out.println( key+"="+ map.get(key)); } } }
运行结果如下图所示:
参考文章:
http://hi.baidu.com/chssheng2007/item/220de1151b39275c2b3e22cb
http://www.cnblogs.com/hubingxu/archive/2012/02/21/2361281.html
相关推荐
java中HashMap,LinkedHashMap,TreeMap,HashTable的区别
HashMap,HashTable,LinkedHashMap,TreeMap的区别
java中map简单实例,包含插入,读出,遍历代码。内含map使用实例及HashMap,LinkedHashMap,TreeMap的区别
对基础的掌握尤其重要,其中List,Set,Map的作用以及使用的场景和分类描述,其中Arraylist 与 LinkedList 区别,HashSet与TreeSet与LinkedHashSet对⽐,LinkedHashMap和HashMap,TreeMap对⽐,HashMap 和 Hashtable...
Map接口的实现类可以根据其内部数据结构的不同,分为几种类型,例如HashMap、TreeMap和LinkedHashMap等。不同的实现类具有不同的特点和性能特征,应该根据实际需求来选择合适的实现类。 Map接口中常用的方法 1. put...
// 常用的map接口的实现类有HashMap,LinkedHashMap和TreeMap // HashMap不保证集合中元素的顺序, // LinkedHashMap按插入顺序排序 // TreeMap按自己的意愿进行排序,默认按key值升序排序。 另包含一篇网文:在java...
HashMap LinkedHashMap TreeMap WeakHashMap Hashtable Collection 集合体系详解 Set 接口 AbstractSet 抽象类SortedSet 接口HashSet LinkedHashSet TreeSet List 接口 AbstractList 和 AbstractSequentialList ...
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。 TreeMap:基于红黑树(Red-Black tree)的 NavigableMap 实现,该映射根据其键的自然顺序进行排序,或者根据创建映射...
在Java中,容器(Container)指的是...Map用于存储键值对(Key-Value Pair)的数据,它的实现类有HashMap、TreeMap、LinkedHashMap等。Map中的键是唯一的,每个键对应一个值。通过键可以快速查找对应的值,这使得Map
Map是键值对的集合接口,它的实现类主要包括:HashMap,TreeMap,Hashtable以及LinkedHashMap等。这篇文章主要介绍了Java Map 按照Value排序的实现方法,需要的朋友可以参考下
Map虽然也叫集合,但是它却不是Collection的子接口。它的底层结构是链表散列,也...HashMap map = new HashMap<>(); map.put("name", "大妖怪"); map.put("age", "100"); 复制代码 查询元素:get(key) HashMap m
Java容器讲解PPT,Collection Map(HashMap TreeMap LinkedHashMap) List (ArrayList LinkedList Vector) Set (HashSet TreeSet LinkedHashSet)
LinkedHashMap ConcurrentHashMap TreeMap Hashtable Set源码系列 HashSet LinkedHashSet TreeSet HashSet Concurrent源码系列 待完善 JVM(Java虚拟机) 类加载 垃圾回收算法 JavaConcurrent(Java并发系列) 【Java...
GoDS(Go数据结构) Go中各种数据结构和算法的实现。 数据结构 货柜 所有数据结构都通过以下方法实现容器接口: type Container interface { Empty () bool Size () int Clear () Values () [] interface {} ...
Java的数据结构相关的类实现原理,比如LinkedList,ArrayList,HashMap, TreeMap这一类的。以下简单模拟一个数据结构的连环炮。 比如,面试官先问你HashMap是不是有序的? 你肯定回答说,不是有序的。那面试官就会...
该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等
java集合框架 3.6. LinkedHashSet类 4. Map接口 4.1. Map.Entry接口 ...4.4. HashMap类和TreeMap类 4.4.1. HashMap类 4.4.2. TreeMap类 4.5. LinkedHashMap类 4.6. WeakHashMap类 4.6. IdentityHashMap类
- HashMap - LinkedHashMap - TreeMap - WeakHashMap - Hashtable - Collection 集合体系详解 - Set 接口 - AbstractSet 抽象类 - SortedSet 接口 - HashSet - LinkedHashSet - TreeSet - List 接口 -...
Map和Set有什么区别 ArrayList和LinkedList有什么区别 有哪些线程安全的List 介绍一下ArrayList的数据结构 谈谈CopyOnWriteArrayList的原理 说一说TreeSet和HashSet的区别 说一说HashSet的底层结构 BlockingQueue是...
ArrayList、LinkedList、ArrayDeque、PriorityQueue、HashMap、LinkedHashMap、TreeMap 及并发容器类等。 3. 并发 并发:线程基础、JMM、AQS、CAS、锁与线程安全(Synchronized、ReentrantLock)、JUC、线程池、定时...