java中的各种集合-下篇

映射表集合关系图

引言:集是一个集合,它可以快速的查找现有的元素。但是要查看一个元素,我们需要有想要查找元素的精确的副本;这并不是一种非常通用的查找方式;

映射表的概念就由此而来;我们知道某些键的信息;并想要查找与之对应的元素;映射表数据结构就是为此设计的;键值对!;

1:Map:映射表集合的顶级父类:它是一种键值对的形式存储数据的集合,根据键值我们就可准确查询我们想要查询的值;

<1>:HashMap:一种对键进行散列的映射表。散列或者函数只能作用于键,对键对应的值不能散列也不能进行比较;

<2>:TreeMap:树映射表是使用键的正顺序对值进行排列,并将其组织成搜索树;和集合一样如果集合中的元素必须要按照顺序访问我们最好采用散列映射表;查询元素时;散列表相对而言要更快一点

<3>:WeakHashMap:主要是用来删除没用其他引用的集合中的元素;配合Java的垃圾回收机制;

如果有一个值对应的键已经不再使用了,由于程序中的任何部分没有再出现这个键;所以这个键/值便无法从映射表中删除;此时就要由WeakHashMap去完成这件事情了;当某个键的唯一引用来自于散列表条目时,这张数据结构将和垃圾回收器协作工作一起删除键/值对。

具体机制:WeakHashMap使用弱引用(weak references)保存键;WeakReference对象将引用保存到另外一个对象中,即使是散列表键;如果某个对象仅仅使用WeakReference引用,就将这个对象的弱引用放入到队列中;WeakHashMap将周期性地检查队列;以便查找新添加的弱引用;

<4>:LinkedHashMap:连接映射表:主要使用来记住插入元素的顺序;每次插入元素时,该集合都会为待插入元素找到合适位置;使得表面上看该集合中的元素是无序的;没当调用get或者put时受影响的条目都会从当前位置删除,并将该条目放大链表的尾部;只有条目在链表中的位置会受影响;而散列表中的桶并不会受影响;一个条目总是位于散列码对应的桶中;

链接散列映射表将用访问顺序,而不是插入顺序;对映射表的条目进行迭代;

访问顺序对于实现高速缓存的“最近最少使用”原则十分重要。例如:可能希望将访问频率高的元素放在内存中;而访问频率低的元素就从数据库中读取;当在表中找不到元素项目并且表有已经满时,就可以将迭代器加入到表中;并将枚举的前几个匀速删除,这些就是最近最少使用的几个元素;

<5>:EnumMap:枚举集合映射表:是一个键类型为枚举类型的映射表。它可以直接高效的使用一个值数组实现;使用时需要在构造器中指定键类型;

EnumMap<Weekday,Employee> personIncharge = new EnumMap<>(Weekday.class)

<6>:表示散列集映射表:IdentityHashMap,在这个类中,键的散列值不是用hashCode函数计算而来的,而是使用System.identityHashCode方法计算的;这种方式是Object.hashCode方法根据兑现的内存地址来计算散列码时所使用的方式;而且在对两个对象进行比较时,IdentityHashMap类使用==而不是equals;

也就是说不同的键对象,即使内容相同,也被视为是不同的对象;在实现对象遍历算法时(如对象序列化),这个类十分有用;可以用来跟踪每个对象的遍历情况;

<7>:SortedMap:是一个集合接口,暴露了用于排除的比较器对象;并且定义方法可以获取集合中的子视图;

<8>:HashTable:和hashMap基本上差不多,以键值对形式存储数据;这里我们主要讲他和HashMap的区别:

        A:HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。

        B:HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。

        C:另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。

        D:由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。

        E:HashMap不能保证随着时间的推移Map中的元素次序是不变的

<9>:Properties:Java.util.Properties是对properties这类配置文件的映射。支持key-value类型和xml类型两种。

总结:Java集合框架的本身并没有将映射表本身视为一个集合;然而却可以获得映射表的视图;这是实现了一组Collection接口的对象;或者它的子接口视图;

有三个视图:分别为键集合,值集合,和键值对集合;(键和键值对形成了一个集合),这是因为在映射表中一个键只能有一个副本;下面的三种方法将返回3个视图:

Set keySet();获取映射表中所有的键

Collection values();获取映射表中所有的值集合

Set<Map.Entry<K,V>>   entrySet();获取映射表中所有的键集合和键值对集合;

当然还有其他返回视图的方法此处不再赘述!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容

  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 870评论 0 1
  • 标签(空格分隔): Java集合框架 问题思考 什么是集合框架? 为什么用集合框架? 怎么用集合框架? 问题解决 ...
    outSiderYN阅读 672评论 0 13
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,598评论 18 399
  • 前面已经介绍完了Collection接口下的集合实现类,今天我们来介绍Map接口下的两个重要的集合实现类HashM...
    Ruheng阅读 10,444评论 2 38
  • 人思考的操作系统是由一个个概念组成。 聪明不是天生的,是习得的,积累的,是可以不断成长的,是没有尽头的。 衡量一个...
    风吹燕尾阅读 190评论 0 0