Java集合框架 -- 02 Map详讲

目录导读:
  • Map 概述
  • HashMap(线程不安全)
  • LinkedHashMap
  • Hashtable(线程安全)
  • Properties(可用于读写属性文件,如ini文件)
  • TreeMap(类比于TreeSet)
  • WeakHashMap
  • IdentityHashMap
  • EnumMap
  • 各个Map实现类的性能分析
1.Map 概述
Map 保存的是键值对数据的集合,也被称为字典,或关联数组

Map类似于一个瓶子,因此,里面的元素不允许重复, 且无序的。

将Map的key-value中的key单独拿出来看时,它们就是一个Set集合,故不可以重复
value单独拿出来看时,它们类似一个List集合(可以重复,可以为null),只是索引不再是整数值,而是另一个对象key

注意:
    HashMap允许有一个null作为key
    Hastable不允许null做为其key和value

1.Map 集合的操作
由于是key-value,则操作时针对key和value的一些增、删、判断等

(1)增
    Object put(Object key, Object value); //添加一个key-value对,如Map中已存在key,则新的键值对会覆盖原来的键值对,并返回被覆盖的value
    void putAll(Map m); //将m中的键值对复制到本Map中
    
(2)删
    void clear(); //删除该Map对象中的所有key-value对
    Object remove(Object key); //删除指定key所对应的键值对,并返回该键值对的值,若key不存在,则返回null
    boolean remove(Object key, Object value); //Java8新增的方法,删除指定的key-value,

(3)判断
    boolean containsKey(Object key); //判断Map中是否有指定的key,有则返回true
    boolean containsValue(Object value); //判断Map中是否包含一个或多个value
    boolean isEmpty(); //判断该Map是否为空

(4)获取
    Object get(Object key); //返回指定key所对应的value,若不包含该key则返回null      
    int size(); //返回Map里键值对的个数,即元素个数
    Set keySet(); //返回该Map中的所有key组成的Set集合
    Collection values(); //返回该Map里所有的value组成的Collection
    Set<Map.Entry<K,V>> entrySet(); //返回key-value对所组成的Set集合,每个集合元素都是Map.Entry对象
        注:Entry是Map对象的内部类,该类封装了一个key-value对,Entry包含如下三个方法:
            1.Object getKey(); //返回Entry里包含的key值
            2.Object getValue(); //返回Entry里包含的value
            3.Object setValue(V value); //设置Entry里包含的value值,并返回新设置的value值
(5)遍历
    就要借助上面的提到的方法,再结合foreach循环即可完成遍历
    Set keySet(); //返回该Map中的所有key组成的Set集合
2.HashMap 和 Hashtable 实现类
它们都是Map接口的典型实现类,Hashtable是个古老的类(从名字里就可以看出的),线程安全

Hashtable和HashMap的区别?
1.Hashtable是线程安全,HashMap是线程不安全的,因此,HashMap的性能好一点。但对于多线程
情况下,Hashtable会更好。但为了达到线程安全,建议使用Collections工具类将HashMap包装成线程安全的
2.Hashtable不允许null做为key和value,如果将null作为key或value放入Hashtable均会引
发java.lang.NullPointerException; HashMap则可以将null作为key或value存入, 且key只能有一个为null,
value可以有无数多个


为了成功的在Hashtable和HashMap中存储、获取对象,用作key的对象必须实现hashCode()和equals()方法(尤其是那些自定义的类)

Hashtable和HashMap判断两个key相等的标准是:两个key通过equals()返回true,且hashCode()返回值也相等
Hashtable和HashMap判断两个value相等的标准是: 同equals()方法比较返回true即可
3.LinkedHashMap 实现类
是HashMap的子类,同LinkedHashSet一样,也是双向链表来维护key-value对的次序,

由于它是有序,如果添加元素时按顺序添加,就可"排序"访问,这就省去了用HashMap和Hashtable存储后再进行排序的尴尬。

由于需要维护其插入顺序,因此,性能略低与HashMap。但在迭代访问Map里的全部元素时有较好的性能(因为内部是链表维护的顺序)
4.Properties 类
是Hashtable的子类,用于处理属性文件的。它在Map对象和属性文件之间起桥梁作用
相关方法:
    String getProperty(String key); // 获取Properties中指定属性名对应的属性值
    String getProperty(String key, String defaultValue); //与前面的方法类似,只是如果该key不存在,则返回该默认值defaultValue
    Object setProperty(String key, String value); //设置属性值
    //读写属性文件的方法
    void load(InputStream inStream); //从属性文件中加载key-value对大Properties里
    void store(OutputStream out, String comments); //将Properties中的key-value输出到指定的属性文件中,comments是注释次信息
5.TreeMap 实现类
·如同Set接口派生出了SortedSet接口一样,Map接口也派生出了SortedMap接口,其实现类:TreeMap

·由于TreeMap具有排序性,因此在Map方法的基础上增加了一些访问第一个、最后一个、截取某部分等的方法
    如:
    Map.Entry firstEntry(); //返回该Map中最小的key对应的key-value对,若为空,返回null
    Object firstKey(); //返回Map中最小key值,如为空,返回null
    Map.Entry lastEntry(); 
    Object lastKey();
    SortedMap subMap(Object fromKey, Object toKey); //

·TreeMap同行TreeSet一样也有两种排序状态:
    自然排序:   
    定制排序:
6.WeakHashMap 实现类
用法基本同HashMap,只是它的key保留了对实际对象的弱引用。而HashMap的key保留了对实际对象的强引用,
即只要该HashMap对象不被销毁,该HashMap的所有key引用的对象就不会被垃圾回收,HashMap也不会自动删除
这些key所对应的key-value对。而WeakHashMap对象的key所引用的对象如果没有被其他变量强引用,则这些key
所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。

注意:
    1.不要让WeakHashMap的key所引用的对象具有任何强饮用,否则将失去WeakHashMap的意义
        WeakHashMap whm = new WeakHashMap();
        whm.put("java", new String("200")); //具有强引用, "java"
        whm.put(new String("android"), new String("200")); //弱引用
7.IdentityHashMap 实现类
用法基本同HashMap,只是它在处理两个key是否相等时等价严格:当且仅当 key1==key2 时,才认为它们相等
普通的HashMap则只要key1和key2通过equals()方法返回true,hashCode()值相等即可。
    
如:
    IdentityHashMap ith = new IdentityHashMap();
    ith.put(new String("java"), 78);
    ith.put(new String("java"), 45); //两个均能添加进去,因为是new的,肯定不相等,便认为是两个对象
    ith.put("android", 45);
    ith.put("android", 51); //只能存在一个(最后这个)
8.EnumMap 实现类
·添加的key-value对的key须是枚举类的枚举值。
·按枚举类中的顺序维护key的有序性
·不允许null作为key,否则引发NullPointerException异常;如果查询是否包含null的key,或删除值为null的key,都不会抛异常(尽管不会成功)
·内部以数组形式保存key-value,因此很高效,紧凑
9.各个Map实现类的性能分析
1.HashMap和Hashtable的实现机制几乎一样(都是基于hash算法),但Hashtable是一个古老、线程安全的类,因此
性能不如HashMap
2.TreeMap底层是基于红黑树实现,要维护key-value的有序性,因此性能不如HashMap和Hashtable。但它的key-value对
的有序性,使得在查找方面有优势
3.LinkedHashMap底层因采用链表来维护有序性,因此它的性能不如HashMap。但它能保证有序性
4.EnumSet的实现性能最好,底层是基于数组实现的,但key只能是枚举值
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 目录 Collection、List、Set、Map概述CollectionMapHashMap的实现原理Tree...
    蓝灰_q阅读 500评论 0 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashM...
    Ruheng阅读 10,430评论 2 38
  • Java SE 基础: 封装、继承、多态 封装: 概念:就是把对象的属性和操作(或服务)结合为一个独立的整体,并尽...
    Jayden_Cao阅读 2,095评论 0 8
  • 相同点:都不能编辑 不同点: readonly可以触发事件,能作用于text、password、textarea,...
    xiaolin_188阅读 285评论 0 0