Java集合(十二)--非同步集合总结

经过十一篇文章的分析,终于把一些主要的集合类的实现原理分析完了。本文,我们将对之前分析的知识点做一次总结。

集合框架:集合有两个根接口,分别是Collection和Map。其中Collection中又分为List、Set和Queue。

Java集合(一)--集合框架简析

List

List是一种有序不唯一的元素集合,有ArrayList和LinkedList等多个实现类。

ArrayList

ArrayList实现了RandomAccess等接口,支持快速随机访问。它是基于数组实现的,内部维护了一个默认初始容量为10的elementData数组。此数组是一个动态数组,在数组容量不足以容纳当前元素的时候会进行扩容,扩容到原数组的3/2,但是容量最大不超过0x7fffffff(是一个16进制的数,值为:2^31 - 1,是最大的int数值)。ArrayList的get和set方法都是通过操作角标完成对数组的操作,所以相对来说比较快。而add和remove方法,由于涉及到数组的拷贝,所以会比较慢。尤其是在add方法执行的过程中,如果当前数组容量不足以容纳元素,会进行扩容。所以,在知道最大容量的情况下,最好给它一个初始容量值。

Java集合(二)--ArrayList简析

LinkedList

LinkedList实现了Deque等接口,可以当作双端队列来使用。它是基于私有的内部类Node完成的对数据的操作,而Node是一个双向链表类型的类,所以LinkedList是基于双向链表实现的。在Node中存储着上个节点和下个节点的信息以及当前节点的值。对于LinkedList来说,它的get和set方法执行过程中,会先将要操作的索引与(当前链表长度/2)做比较,以确定是从前往后遍历链表还是从后往前遍历链表,然后再执行相关的操作。而add和remove方法中,则是通过改变链表中节点指针的指向来完成操作。因此它是的特点是增删块,改查慢。LinkedList没有大小限制,可以无限扩容。

Java集合(四)--LinkedList简析

集合中,还有一种集合Vector,它是一个线程同步的集合。不过现在很少用它,现在不做具体分析了。之后,我们还会将线程同步的集合类,到时候,再将它们做比较。

Set

Set是一种无序且唯一的元素集合,对两个元素的比较不是使用"=="而是使用"equals"。它包含HashSet、TreeSet即EnumSet等等。

HashSet

HashSet是基于HashMap实现的,它的构造函数的作用就是初始化一个HashMap对象。对其中元素的操作都是通过调用HashMap对应的方法完成的。HashSet的元素就是底层HashMap的key,而底层HashMap的value是一个Object类型的PRESENT对象。

Java集合(九)--基于Map实现的Set简析

LinkedHashSet

LinkedHashSet是HashSet的子类,与其不同的是,LinkedHashSet维护了一个贯穿其所有条目的双向链表,链表中的元素按照其插入顺序排序,且LinkedHashSet是基于LinkedHashMap实现的。

Java集合(九)--基于Map实现的Set简析

TreeSet

TreeSet是基于TreeMap实现的,内部的元素通过其自然顺序或者是构建时传入的Comparator进行排序,它不支持null元素。它的构造方法就是实例化一个TreeMap对象,且对元素的操作都是通过调用TreeMap中的相关方法实现的。它的元素就是底层TreeMap的key,而底层TreeMap的value是一个Object类型的PRESENT对象。

Java集合(九)--基于Map实现的Set简析

EnumSet

不同于上面的Set类,EnumSet不是基于Map实现的。它继承了Enum类,实现了AbstractSet等接口。EnumSet中的所有元素必须来自单个枚举类型,枚举集在其内部表示为位向量,即使用一个位表示一个元素的状态。它不允许有空值,但可以检测是否有空值。EnumSet元素按照在枚举类中的枚举常量的顺序进行排序,且在迭代过程中,不会出现fail-fast。

EnumSet是一个抽象类,以枚举类中是否包含64个枚举常量为分界线,EnumSet分别会实例化RegularEnumSet(小于等于64)和JumboEnumSet(大于64)两种EnumSet的实现类的对象来进行实际的操作。在RegularEnumSet中使用long类型的elements,通过其二进制表现形式上不同位的状态来表述数据是否存储。而JumboEnumSet则是维护了一个long类型的elements数组,具体操作原理同RegularEnumSet类似。

Java集合(十一)--EnumSet简析

Map

Map是通过键值对的映射关系来存储数据的,它包含HashMap、TreeMap及EnumMap等多个实现类。

HashMap

HashMap中是一个基于拉链法实现的散列表,内部由数组、链表和红黑树实现。其中,数组用来通过索引确定键值对的位置,而链表和红黑树则用来保存数据,包括key所对应的hash值(进过处理),key、value和下个节点的地址。HashMap通过容量和加载因子来确定是否对数组扩容。其中,默认初始容量为16(容量的增长必须以2的次方式增长,且小于1<<30),默认加载因子为0.75。加载因子其实就是控制是时间换空间,还是空间换时间。

HashMap在扩容的时候,会判断链表长度,当链表长度为8的时候,会判断是扩容还是转为红黑树结构(判断依据是数组长度是否大于64)。而当链表长度小于6的时候,又会将红黑树转换为链表。

Java集合(五)--HashMap简析

LinkedHashMap

LinkedHashMap是HashMap的子类,与HashMap的不同的是它维护了一个贯穿其所有条目的双向链表。它通过布尔属性的accessOrder来决定迭代顺序,true为访问顺序,false为插入顺序。他在使用put或get等方法时,会判断如果是按照访问顺序排序,则会将刚刚操作的元素放到链表的尾部,这样就形成了一个简单的LRU。

Java集合(十)--LinkedHashMap简析

TreeMap

TreeMap是基于红黑树实现的,它的键根据自然顺序或者是创建时传入的Comparator进行排序,其key应该是实现了Comparable接口的对象。对其中的元素做增删操作后,需要对元素做修正,以保证还是红黑树结构。

Java集合(六)--TreeMap简析

WeakHashMap

WeakHashMap是一个带弱键的单链表的Map,与HashMap类似,他也是通过容量和加载因子来控制其扩容。当某个键不再正常使用的时候,对应的键值对就会被移除。这种操作是通过ReferenceQueue和Reference完成的。其原理为,当WeakHashMap的某个键被GC时,该键会被添加到queue中。然后,在执行某个操作的过程中,会先去删除与queue中对应的元素,接着再去执行相应的操作。

Java集合(七)--WeakHashMap简析

EnumMap

EnumMap是用于枚举类型键的专用Map实现。其映射中的所有键必须来自创建映射时显式或隐式指定的单个枚举类型,枚举映射在内部表示为数组。 EnumMap的键按其键的自然顺序(枚举常量的声明顺序)维护,且在迭代过程中,不会出现fail-fast。EnumMap不允许使用空键,但是,可以测试是否存在空键或删除空键,且允许空值。它内部维护了keyUniverse和vals两个数组。其中,keyUniverse数组中包含的元素,是指定的枚举类型中所有的枚举常量。vals数组长度与keyUniverse数组长度相同,且EnumMap的键值对的映射是keyUniverse数组与vals数组中相同位置的元素的映射。

Java集合(八)--EnumMap简析

还有一个HashTable,它继承自Dictionary类,是同步的,键值不可以为空。现在一般不用了,等分析ConCurrentHashMap的时候会把它拿出来说一说。

Collections

这是一个为集合提供的工具类,可以为集合提供排序、查找、替换及同步控制等辅助方法。比如,上面提到的集合都可以使用Collections提供的SynchronizedXXX(XXX代表:Collection、List、Set及Map)方法实现同步。

好了,到此非同步的集合类就分析完成了。年底要做项目了,博客先放一放。

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

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,915评论 0 13
  • 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 ...
    城市里永远的学习者阅读 751评论 0 49
  • Java集合框架 Java中封装了许多常用的数据结构,称为集合框架,可以有效组织数据,提高程序性能。最初Java只...
    Steven1997阅读 904评论 0 2
  • 昨日在高端英语启蒙学习群里,大家讨论到面对几百个句子记忆的各种问题,好几位妈妈都提到了用分类法进行记忆。...
    瞳小甜Rosie阅读 141评论 0 2
  • 羊绒,古代为贵族专属的奢侈面料,不仅因为这种面料珍贵如黄金,也因为它的穿着和洗护都非常讲究。如今,“软黄金”的纯度...
    熠羊绒阅读 2,108评论 0 0