- 浏览: 256506 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
qingtingchen:
请问下如果只有uid/emial 和密码的话要怎样进行认证
【总结】Spring LDAP整理 -
cylboke:
太给力了,搞了一下午,一直换jar版本,不起作用,用楼主的方法 ...
【学习】spring MVC之返回JSON数据(Spring3.0 MVC+Jackson+AJAX) -
hu3625067:
楼主写的很精辟,言简意赅,非常实用
【总结】Spring LDAP整理 -
hu3625067:
写的很精辟,很实用
【总结】Quartz整理 -
Mr小血:
找了好久,终于找到解决办法了,谢谢
formvalidator4.1.3 - 校验时不能自定义向后台传值的BUG问题
Map是Java最常用的集合类之一。它有很多实现类,我总结了几种常用的Map实现类,如下图所示。本篇文章重点总结几个Map实现类的特点和区别:
特点总结:
1、HashMap: Map最常用的实现类
a、HashMap可以存空的key和空的value。
b、HashMap线程不安全,在多线程的情况下,需要额外方法实现数据的同步。Collections提供了同步的方法,如下:返回了一个线程安全的HashMap类。(PS:这时候可以考虑ConcurrentHashMap,下文有介绍)。
2、LinkedHashMap: HashMap子类
a、LinkedHashMap作为HashMap的子类,同样也可以存空的key和空的value。
b、LinkedHashMap会按存入顺序存放元素(迭代器顺序)。
现实中很多情况下都可以使用LinkedHashMap,例如购物车的实现:按用户添加的时间顺序显示购物车中的元素。
以下map的输出是有顺序的,而map1是无序的。
c、LinkedHashMap有个方法叫:removeEldestEntry(Map.Entry) ,用户可以重写该方法来制定添加元素时的策略。方法内部返回true时,当要往该map中存放(put\putAll)元素时,就先删除最老的对象,然后再添加新对象。使用实例:在设计Cache(缓存)时,可以重写该方法来制定键值的过期规则。
API:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry)
例子:在新建一个LinkedHashMap对象时,重写了其removeEldestEntry方法,如果map的容易大于2时,就返回true,于是最老的键aaa就被删除了。
所以如果不是为了键值的顺序,还是使用HashMap最好,因为LinkedHashMap需要额外的空间去维护键值之间的链表关系。
3、Hashtable类
Hashtable是JDK1.0就有的,算是很古老的Map实现了,前辈们设计的初衷就是为了线程安全考虑的(有点类似List里的一个实现类,叫Vector)。
另外就是Hashtable不能存放空的key/value,会报java.lang.NullPointerException错误。
值得一提的是,现在很少会用到Hashtable类,如果要在多线程的情况下使用线程安全类,那会考虑ConcurrentHashMap,下文有介绍。
4、SortedMap的实现类:TreeMap
TreeMap红黑树的一个实现。其键值按照自然顺序排序的。它的构造函数中提供了参数Comparator,可以自定义实现排序。
另外,TreeMap也是线程不安全的。
构造器API:
排序的例子:
5、ConcurrentMap的实现类:ConcurrentHashMap
ConcurrentHashMap是1.5版本引进的。Concurrent的意思是同时发生的,所以这个实现类的重点是线程安全。(有点类似于Hashtable,但也有区别)。
ConcurrentHashMap的默认并发级别是16。
ConcurrentHashMap的设计初衷是优化线程安全中的读操作,ConcurrentHashMap在取元素的操作(包括get)通常没有加锁,而对于另外一个线程安全的Hashtable来说,是所有方法都加同步锁的。
一般来说,在JAVA1.5版本以后,推荐使用的是ConcurrentHashMap,而Hashtable有点像是历史遗留的类而已。
以下是国外的一篇文章中摘录的ConcurrentHashMap和Hashtable的性能对比:
-------------------------------------------
参考:
1、JDK API doc online: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html
2、ConcurrentHashMap and CopyOnWriteArrayList offer thread safety and improved scalabilityhttp://www.ibm.com/developerworks/java/library/j-jtp07233/index.html
特点总结:
实现类 | HashMap | LinkedHashMap | TreeMap | Hashtable | ConcurrentHashMap |
允许key/value为空 | 允许为空 | 允许为空 | 允许为空 | 不允许为空 | 不允许为空 |
线程安全 | 不安全 | 不安全 | 不安全 | 安全(全部锁) | 安全(部分锁) |
排序 | 无序 | 迭代器顺序 | 红黑树顺序(可以自定义) | 无序 | 无序 |
1、HashMap: Map最常用的实现类
a、HashMap可以存空的key和空的value。
public void nullKeyTest() { Map<String, Object> map = new HashMap<String, Object>(); map.put(null, "value"); System.out.println(map); // {null=value} }
public void nullValueTest() { Map<String, Object> map = new HashMap<String, Object>(); map.put("key", null); System.out.println(map); // {key=null} }
b、HashMap线程不安全,在多线程的情况下,需要额外方法实现数据的同步。Collections提供了同步的方法,如下:返回了一个线程安全的HashMap类。(PS:这时候可以考虑ConcurrentHashMap,下文有介绍)。
public void synchMapTest() { Map<String,Object> map = Collections.synchronizedMap(new HashMap<String,Object>()); // returned a synchoronized HashMap }
2、LinkedHashMap: HashMap子类
a、LinkedHashMap作为HashMap的子类,同样也可以存空的key和空的value。
b、LinkedHashMap会按存入顺序存放元素(迭代器顺序)。
现实中很多情况下都可以使用LinkedHashMap,例如购物车的实现:按用户添加的时间顺序显示购物车中的元素。
以下map的输出是有顺序的,而map1是无序的。
public void iterateOrderTest() { Map<String, Object> map = new LinkedHashMap<String, Object>(); map.put("ccc", "value"); map.put("bbb", "value"); map.put("aaa", "value"); System.out.println(map); // {ccc=value, bbb=value, aaa=value} Map<String, Object> map1 = new HashMap<String, Object>(); map1.put("ccc", "value"); map1.put("bbb", "value"); map1.put("aaa", "value"); System.out.println(map1); // {aaa=value, ccc=value, bbb=value} }
c、LinkedHashMap有个方法叫:removeEldestEntry(Map.Entry) ,用户可以重写该方法来制定添加元素时的策略。方法内部返回true时,当要往该map中存放(put\putAll)元素时,就先删除最老的对象,然后再添加新对象。使用实例:在设计Cache(缓存)时,可以重写该方法来制定键值的过期规则。
API:http://docs.oracle.com/javase/6/docs/api/java/util/LinkedHashMap.html#removeEldestEntry(java.util.Map.Entry)
例子:在新建一个LinkedHashMap对象时,重写了其removeEldestEntry方法,如果map的容易大于2时,就返回true,于是最老的键aaa就被删除了。
public void removeEldestEntryTest() { Map<String, Object> map = new LinkedHashMap<String, Object>() { private int MAX_ENTRIES = 2; protected boolean removeEldestEntry(Map.Entry<String, Object> eldest) { return size() > MAX_ENTRIES; } }; map.put("aaa", "value"); map.put("bbb", "value"); map.put("ccc", "value"); System.out.println(map); // {bbb=value, ccc=value} }
所以如果不是为了键值的顺序,还是使用HashMap最好,因为LinkedHashMap需要额外的空间去维护键值之间的链表关系。
3、Hashtable类
Hashtable是JDK1.0就有的,算是很古老的Map实现了,前辈们设计的初衷就是为了线程安全考虑的(有点类似List里的一个实现类,叫Vector)。
另外就是Hashtable不能存放空的key/value,会报java.lang.NullPointerException错误。
值得一提的是,现在很少会用到Hashtable类,如果要在多线程的情况下使用线程安全类,那会考虑ConcurrentHashMap,下文有介绍。
4、SortedMap的实现类:TreeMap
TreeMap红黑树的一个实现。其键值按照自然顺序排序的。它的构造函数中提供了参数Comparator,可以自定义实现排序。
另外,TreeMap也是线程不安全的。
构造器API:
TreeMap(Comparator<? super K> comparator) // 返回一个空的tree map,按传入的comparator规则进行排序。
排序的例子:
public void orderTest() { Map<String, String> treeMap = new TreeMap<String, String>(); treeMap.put("aaa", "value1"); treeMap.put("bbb", "value2"); treeMap.put("ccc", "value3"); System.out.println(treeMap); // {aaa=value1, bbb=value2, ccc=value3} } // 自定义排序器:按键值的倒序排序: public void comparatorTest() { Map<String,String> treeMap1 = new TreeMap<String,String>(new Comparator<String>(){ public int compare(String o1, String o2) { return -o1.compareTo(o2); } }); treeMap1.put("aaa", "value1"); treeMap1.put("bbb", "value2"); treeMap1.put("ccc", "value3"); System.out.println(treeMap1); // {ccc=value3, bbb=value2, aaa=value1} }
5、ConcurrentMap的实现类:ConcurrentHashMap
ConcurrentHashMap是1.5版本引进的。Concurrent的意思是同时发生的,所以这个实现类的重点是线程安全。(有点类似于Hashtable,但也有区别)。
ConcurrentHashMap的默认并发级别是16。
ConcurrentHashMap的设计初衷是优化线程安全中的读操作,ConcurrentHashMap在取元素的操作(包括get)通常没有加锁,而对于另外一个线程安全的Hashtable来说,是所有方法都加同步锁的。
一般来说,在JAVA1.5版本以后,推荐使用的是ConcurrentHashMap,而Hashtable有点像是历史遗留的类而已。
以下是国外的一篇文章中摘录的ConcurrentHashMap和Hashtable的性能对比:
Threads | ConcurrentHashMap | Hashtable |
1 | 1.00 | 1.03 |
2 | 2.59 | 32.40 |
4 | 5.58 | 78.23 |
8 | 13.21 | 163.48 |
16 | 27.58 | 341.21 |
32 | 57.27 | 778.41 |
-------------------------------------------
参考:
1、JDK API doc online: http://docs.oracle.com/javase/6/docs/api/java/util/Map.html
2、ConcurrentHashMap and CopyOnWriteArrayList offer thread safety and improved scalabilityhttp://www.ibm.com/developerworks/java/library/j-jtp07233/index.html
发表评论
-
【总结】Java日志类工具整理
2017-09-25 21:01 734关于Java日志的总结,知 ... -
《软技能——代码之外的生存指南》阅读整理
2017-03-09 23:10 1179本书的原版叫《Soft Skill ... -
吴军《数学之美》第二版阅读整理
2017-03-07 22:34 7151吴军的《数学之美》第一版于2012年出版,并获得国家图书馆第八 ... -
O'Reilly出版《微服务设计》阅读整理
2017-02-26 16:49 1740《微服务设计》原版是O'Reilly Media, Inc在2 ... -
Maven技术书之《Maven实战》阅读整理
2017-02-20 21:04 1059Maven是一个实用且优秀的构建工具,我之于Maven只能算入 ... -
【总结】Hazelcast之Distributed Map介绍(续)
2016-12-22 21:49 0目录: 1. Distributed Map ... -
【总结】Hazelcast之Distributed Map介绍
2016-12-19 22:21 2715通过Hazelcast入门简介(http://angelbil ... -
【总结】Matlab调用Java代码
2016-11-07 22:46 2514Matlab调用Java代码,这个比较简单,步骤如下: 1. ... -
【总结】JAVA编码日常会忽略的小错误
2016-10-15 15:54 0偏基础的文章,很多都是可能很多coder日常都会遇上的问题。 ... -
【总结】Spring LDAP整理
2016-08-29 21:53 11706如果要总结Spring的LDAP(Spring开发的操作LDA ... -
【总结】Quartz整理
2016-08-28 14:00 1351官网:http://www.quartz-schedule ... -
【总结】Java基础之String
2016-03-26 15:46 0总结关于String的问题和特点。 1、contains() ... -
【总结】java.util.Date vs. java.sql.Date
2016-03-19 21:06 1726本文总结了java.util.Date和java.sql.Da ... -
【总结】Java基础之Set:HashSet vs. LinkedHashSet vs. TreeSet
2016-02-28 17:24 1755总结平时常用的Collection子接口:Set接口以及其实现 ... -
【总结】Java基础之List:ArrayList vs. LinkedList vs. Vector
2016-02-27 17:41 906总结平时常用的Collection ... -
【总结】正则表达式
2016-01-09 15:13 835正则表达式(Regular Expre ... -
【总结】Redis Vs Hazelcast
2015-11-04 22:36 0Redis官网:http://redis.io ----- ... -
【总结】servlet mapping url 配置中的 / 和 /* 的区别
2015-03-28 16:48 1955web.xml的配置中,关于<url-pattern&g ... -
【总结】<context:annotation-config> vs <context:component-scan>
2015-03-25 22:35 1129Spring mvc3中的<context:annota ... -
ant
2014-12-29 15:23 0https://ant.apache.org/manual/t ...
相关推荐
### Java中HashMap, LinkedHashMap, TreeMap,HashTable的区别 在Java编程语言中,`Map`接口是集合框架中的一个重要组成部分,用于存储键值对。本文将详细分析四种常用的`Map`实现类:`HashMap`, `LinkedHashMap`, ...
总之,“Java基础第11天-04.Map集合-集合整理”这一课程涵盖了Map集合的基础知识,通过学习,开发者不仅可以掌握Map的基本用法,还能了解到不同实现类的差异和适用场景,进一步提升Java编程技能。在后续的学习中,...
Java中的Map接口是Java集合框架的重要组成部分,它用于存储键值对的数据结构。Map不同于List,List是以索引来访问元素,而Map则是通过键(key)来查找对应的值(value)。Map接口定义了一系列方法,使得我们可以对...
在Java编程语言中,Map接口是集合框架的重要组成部分,它提供了键值对的存储功能。Map集合不按照特定顺序存储元素,而是通过键(Key)来查找对应的值(Value)。以下是对Map接口及其常用实现类的详细说明: 1. **...
常见的Map实现包括HashMap、TreeMap、LinkedHashMap等。在这个视频中,重点是HashMap,它是基于哈希表的数据结构,通过哈希函数来实现快速查找。 哈希原理的核心在于将键(Key)转化为一个唯一的哈希码(Hash Code...
2. Map 的常用实现类:HashMap、TreeMap、HashTable、LinkedHashMap、ConcurrentHashMap。 集合框架的实现类 List 实现类 1. ArrayList:Object 数组 2. Vector:Object 数组 3. LinkedList:双向循环链表 Set ...
JAVA中的Map类有:HashMap、ConcurrentHashMap、HashTable、LinkedHashMap、TreeMap等。每种Map类都有其特点和适用场景,HashMap是非线程安全的,ConcurrentHashMap是线程安全的,HashTable是线程安全的,...
Java集合框架中的Map接口是Java编程中非常重要的一个部分,它提供了一种存储键值对数据的方式。在Map中,每个键(key)都是唯一的,用于标识对应的值(value),而值可以重复出现。这种数据结构广泛应用于各种场景,...
- Map:键值对存储,Key唯一,Value可重复,如HashMap、TreeMap、Hashtable、LinkedHashMap和ConcurrentHashMap。 7. **底层数据结构**: - List: - ArrayList:基于Object数组实现。 - Vector:与ArrayList...
这个“java集合总结副本共19页.pdf.zip”压缩包很可能是对Java集合框架的详细讲解,涵盖了重要的知识点,包括ArrayList、LinkedList、HashSet、HashMap、TreeSet、TreeMap等主要集合类,以及它们的特点、性能和应用...
标题中的“Map地图”可能指的是Java编程语言中的Map接口,它是集合框架的一部分,用于存储键值对的数据结构。Map不维护元素的特定顺序,但提供了根据键进行查找、添加和删除元素的方法。在这个主题中,我们可以深入...
25 JAVA8 与元数据.................................................................................................................................25 2.4. 垃圾回收与算法 .................................
4. LinkedHashMap:它继承自HashMap,并且维护了一个双向链表来记录元素的插入顺序。因此,尽管它比HashMap有额外的开销,但仍然比TreeMap有较好的性能。 5. ConcurrentHashMap:这个类是为了解决HashMap线程不安全...
总结,本篇Java学习笔记主要围绕Map接口展开,深入讲解了Map的基本概念、方法、实现类以及遍历方式。同时,也提到了Java Web开发中的相关知识,如Cookie、Session、localStorage和sessionStorage的使用,以及Java 8...
Java的核心类库提供了多种Map实现,如HashMap、TreeMap、LinkedHashMap、Hashtable等。HashMap是默认的无序、非同步实现,适合大多数情况;TreeMap基于红黑树,提供了有序的键值对,但性能略低于HashMap;...
此外,了解Map的实现类,如`HashMap`、`TreeMap`、`LinkedHashMap`等,它们在遍历顺序、性能和线程安全方面有所不同。例如,`HashMap`是非排序的,遍历顺序可能不固定;`TreeMap`按照键的自然顺序或比较器顺序排序;...
最常用的`Map`实现类包括`HashMap`、`TreeMap`、`LinkedHashMap`等。 #### 三、Map的基本用法 1. **声明一个Map**: ```java Map, String> map = new HashMap(); ``` 2. **向Map中添加元素**: ```java map....