java中几种Map在什么情况下使用,并简单介绍原因及原理
一、Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。所以通过指定的key就可以取出对应的value。Map接口定义了如下常用的方法:
1、void clear():删除Map中所以键值对。
2、boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true。
3、boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
4、Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
5、Object get(Object key):返回指定key所对应的value,如Map中不包含key则返回null。
6、boolean isEmpty():查询Map是否为空,如果空则返回true。
7、Set keySet():返回该Map中所有key所组成的set集合。
8、Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
9、void putAll(Map m):将指定Map中的键值对复制到Map中。
10、Object remove(Object key):删除指定key所对应的键值对,返回可以所关联的value,如果key不存在,返回null。
11、int size():返回该Map里的键值对的个数。
12、Collection values():返回该Map里所有value组成的Collection。
Map中包含一个内部类:Entry。该类封装了一个键值对,它包含了三个方法:
1、Object getKey():返回该Entry里包含的key值。
2、Object getValeu():返回该Entry里包含的value值。
3、Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
二、HashMap和Hashtable实现类:
1、HashMap与HashTable的区别:
1) 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
2) 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因为它是同步的)
3、注意:
1)用作key的对象必须实现hashCode和equals方法。
2)不能保证其中的键值对的顺序
3)尽量不要使用可变对象作为它们的key值。
三、LinkedHashMap:
它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
四、TreeMap:
Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
2、Object firstKey():返回最小key,如果为空,则返回null。
3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
4、Object lastKey():返回最大key,如果为空,则返回null。
5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。
五、WeakHashMap:
WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。
六、IdentityHashMap类:
IdentityHashMap与HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null,但不保证键值对之间的顺序。
七、EnumMap类:
1、EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。
2、EnumMap根据key的自然顺序,即枚举值在枚举类中定义的顺序,来维护键值对的次序。
3、EnumMap不允许使用null作为key值,但value可以。
map是以键值对来存储数据的,例如:
Map map = new HashMap();
map.put("移动","10086");
String c = map.get("移动");
结果c="10086”;
简单来说,map就像我们手机的电话本,用map.put("移动","10086"),就是在电话本保存了移动的电话,然后当你想拿移动的电话时候就用String c = map.get("移动");就可以拿到电话号码了。其实学习结合生活实际比较容易理解,也学得快。
1、void clear():删除Map中所以键值对。
2、boolean containsKey(Object key):查询Map中是否包含指定key,如果包含则返回true。
3、boolean containsValue(Object value):查询Map中是否包含指定value,如果包含则返回true。
4、Set entrySet():返回Map中所包含的键值对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
5、Object get(Object key):返回指定key所对应的value,如Map中不包含key则返回null。
6、boolean isEmpty():查询Map是否为空,如果空则返回true。
7、Set keySet():返回该Map中所有key所组成的set集合。
8、Object put(Object key,Object value):添加一个键值对,如果已有一个相同的key值则新的键值对覆盖旧的键值对。
9、void putAll(Map m):将指定Map中的键值对复制到Map中。
10、Object remove(Object key):删除指定key所对应的键值对,返回可以所关联的value,如果key不存在,返回null。
11、int size():返回该Map里的键值对的个数。
12、Collection values():返回该Map里所有value组成的Collection。
Map中包含一个内部类:Entry。该类封装了一个键值对,它包含了三个方法:
1、Object getKey():返回该Entry里包含的key值。
2、Object getValeu():返回该Entry里包含的value值。
3、Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
二、HashMap和Hashtable实现类:
1、HashMap与HashTable的区别:
1) 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销,从而提高效率。
2) 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
2、性能:HashMap的性能最好,HashTable的性能是最差(因为它是同步的)
3、注意:
1)用作key的对象必须实现hashCode和equals方法。
2)不能保证其中的键值对的顺序
3)尽量不要使用可变对象作为它们的key值。
三、LinkedHashMap:
它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
四、TreeMap:
Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
2、Object firstKey():返回最小key,如果为空,则返回null。
3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
4、Object lastKey():返回最大key,如果为空,则返回null。
5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。
五、WeakHashMap:
WeakHashMap与HashMap的用法基本相同,区别在于:后者的key保留对象的强引用,即只要HashMap对象不被销毁,其对象所有key所引用的对象不会被垃圾回收,HashMap也不会自动删除这些key所对应的键值对对象。但WeakHashMap的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被回收。WeakHashMap中的每个key对象保存了实际对象的弱引用,当回收了该key所对应的实际对象后,WeakHashMap会自动删除该key所对应的键值对。
六、IdentityHashMap类:
IdentityHashMap与HashMap基本相似,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null,但不保证键值对之间的顺序。
七、EnumMap类:
1、EnumMap中所有key都必须是单个枚举类的枚举值,创建EnumMap时必须显示或隐式指定它对应的枚举类。
2、EnumMap根据key的自然顺序,即枚举值在枚举类中定义的顺序,来维护键值对的次序。
3、EnumMap不允许使用null作为key值,但value可以。
HashMap,TreeMap,HashTable,ConcurrentHashMap
HashMap用的比较多.通过KEY的hashcode确定key.内部是无序的,线程非安全.平时写代码用这个就足够了.如果需要有序的画有一个LinkedHashMap,这个只比HashMap多了个有序
TreeMap就是按树来构建的..既然是树选一种遍历方式就是有序的了.同样线程不安全.
HashTable跟HashMap差不多..但是是线程安全的..主要用在多线程程序中的临界区数据类型..
原理:里面有一个bucket,用来存储键对象和值对象.有一个Entry,构建了一个Entry对象的链表,可以通过getEntrySet来获取.方法主要就是算这个key对象的散列码(hashCode)确定key值,再在Entry中寻找看看有没有这个Key值,然后设置Value..
拙见.不足之处请各路大神指正..
二〇一七年八月十四日 15:48:58
4、 忆江南 白居易
java中map的常用遍历方法有哪些?
ava中map的常用遍历的具体方法有:一 、在for-each循环中使用entries来遍历。这是最常见的并且在大多数情况下也是最可取的遍历方式。在键值都需要时使用。二、 在for-each循环中遍历keys或values。如果只需要map中的键或者值,你可以通过keySet或values来实现遍历,而不是用entrySet。三、使用Iterator遍历。
在java的Map集合中,怎样更改value的值?
avaMap集合 Map集合没有继承Collection接口,,Map中不能包含相同的key值,每个key只能影射一个相同的value。key值还决定了存储对象在映射中的存储位置。但不是key对象本身决定的,而是通过散列技术进行处理,可产生一个散列码的整数值,散列码通常用作一个偏移量,该偏移量对应分配给映射的内存区域的起始...
Java根据键(Key)输出值(value)应该怎么办?小白刚接触Map
ava中遍历MAP的几种方法 Java代码Map<String,String> map=new HashMap<String,String>(); map.put("username", "qq"); map.put("passWord", "123"); map.put("userID", "1"); map.put("email", "qq@qq.com"); Map<String,String> map=new HashMap<String,String>(...
AVA里有几个文件夹,分别叫什么名字?
Binaries Engine QQLogin 以上是文件夹名 还有 ava_closebeta_0522 Uninstall version version
AVA战地之王狙击镜开镜模糊怎么办?
不知道楼主你的显卡是ATI的还是NVIDIA的,如果是ATI的请打开ATI显卡控制面板,就是俗称的CCC或者显卡属性,在3D选项里将Mipmap的值不要选“高性能”,建议调到“性能”。如果是NVIDIA的显卡,设置跟这个差不多,选项里不要为了追求性能而将所有的值都调成最高性能,这样你游戏里画面全开也没用,因为...
AVA机械、峡谷破解如何使用啊,直接解压到AVA目录吗?那个相同的文件呢...
不是,你直接点解压,然后点下面的确定,意思就是不选择解压路径!然后再把相应的文件覆盖到相应的文件上
CS地图前缀都是什么意思?
\\x0d\\x0aTEX Textures 材质 \\x0d\\x0aVA Vehicle Maps 车辆地图 \\x0d\\x0aXP ApophisXP Style Map 不清楚 \\x0d\\x0a18+ Adults Only 成人限制\\x0d\\x0azm
玩AVA都很顺畅的机器,为什么玩CS的时候,FPS就不能稳定在100,人群多...
r_novis "0"r_traceglow "1"r_wateralpha "1"r_mirroralpha "0"r_bmodelhighfrac "5.0"r_lightmap "0"gl_max_size "256"precache "1"mp_decals "20"gl_affinemodels "0"gl_alphamin "0.25"gl_clear "0"gl_dither "1"gl_flipmatrix "0"gl_flashblend "0"gl_lightholes "0"...
AVA改图BUG现在还行不?求大神帮助
把Map文件夹备份,改回时直接替换。战地之王互助一团、迪洛电竞Op.华北支队谛组Op.0105很荣幸为您解答。更多攻略关注196 865 7075空间。祝游戏愉快,望采纳
为什么我的CF老是和主机MAP不一致? 我网速又好。。。不卡 一改版到V5.8...
在TX面前,全部秒杀。我之前玩个DNF。挂多个不像样。我放弃了。转干CF。来CF之前还挺好的。。自从第三章5.7放出来之后,CPU100% 网速比别人慢,开枪打不死人 这完全就是TX的服务器问题,我玩其它游戏也没这样过。所以CF我也放弃了。。现在正在潜水AVA呢。。看能不能也像CF一样 ...
陟菊今君: 一、Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复.所以通过指定的key就可以取出对应的value.Map接口定义了如下常用的方法:1、void clear():删除Map中...
三穗县15330667583: java中的map容器常在什么情况下使用呢? - ?
陟菊今君: 需要映射的情况下 Hashtable 就是一种map 你可以把Map看成一种字典 根据Key查得Value这种形式就算一个Map 各种map所不同的只是实现方法 有什么不明白的欢迎发信息给我
三穗县15330667583: Java Map 在什么场景什么情况下使用求大神用简单的一两句话回答一下. - ?
陟菊今君: map可以根据key来获取value.类似的结构在json或者xml里都有大量的应用.当然用什么集合还是要看实际的场景的.
三穗县15330667583: java中list、set和map 在什么场景下使用? - ?
陟菊今君: list 列表 set 集合 map 映射从词义上可以看出来它们的大概作用:列表是顺序存放对象的,可以有相同的对象,通过索引存取;集合是无序存放对象的,其中不能有重复的对象(唯一的,回忆高中时候数学中学习的集合特性),集合没有索引...
三穗县15330667583: Java实际开发中set,Map,List分别用在什么情况? - ?
陟菊今君: 其实实际开发中 就list和map用的多点 list嘛 比如你从数据库里读了很多条记录 经过处理封装成对象 就可以装在一个该对象类型的list里面 就可以迭代访问里面每个对象,里面的对象是有顺序的,只有索引,你不能通过对他们取别的名字之类的得到她 ;map呢 是key-value组成的键值对;value可以是任意object;key是一个String;你可以通过key访问value;比如在servlet技术中 放在request里的东西 response 里的东西这些都是map;还有比如解析xml的时候 你读到的东西 也可以用map来保存
三穗县15330667583: java中map的常用遍历方法 - ?
陟菊今君: 方法一 在for-each循环中使用entries来遍历这是最常见的并且在大多数情况下也是最可取的遍历方式.在键值都需要时使用.Map<Integer, Integer> map = new HashMap<Integer, Integer>();for (Map.Entry<Integer, Integer> entry : map.entrySet(...
三穗县15330667583: 在java中怎么迭代 以及在什么情况下需要使用map?
陟菊今君: 举例来说,计算 S =1 +2 +3 +4 +.....+ n 可以使用迭代 public int sum(int n){ if(n==1) return n; return n+sum(n-1); } map的使用一般在数据库访问的时候使用,map的key放置数据库的字段名,value放置字段名对应的值,这是比较常见的
三穗县15330667583: Java中,map分为哪些种类? - ?
陟菊今君: Map有:HashMap、TreeMap、Hashtable.1、HashMap:线程不安全,键、值不允许为null,并且没顺序.2、Hashtable:线程安全,键、值允许为null,并且没顺序.3、TreeMap:线程不安全、键、值不允许为null,并且没顺序. 备注:当前用的最多的是HashMap,因为线性不安全,也就是说读取和存储效率要更高一些.
三穗县15330667583: JAVA中线程安全的map有哪些? - ?
陟菊今君: JAVA中线程安全的map有:Hashtable、synchronizedMap、ConcurrentHashMap.java中map中线程安全怎么实现:1. 同步的map就是Hashtable, concurrenthashmap.2. 你看到的Hashtable就是直接在hashmap上加了个锁,concurrenthashmap...
三穗县15330667583: java 中Map的用法和含义? - ?
陟菊今君: map就像是list差不多.都是一个已经定义的对象要想使用可以像线面这样直接定义使用就行,但是map和list有一点不同的是,当你往list里面放东西的时候list不会管你放进去的东西有没有重复,但是map的时候就会检查你放的东西有没有重复,重复的就不在放进去..用法可以像下面的例子~ Map<String,UserVo> users=new HashMap<String,UserVo>();