聊下java集合

从整体说下集合

首先集合分为Collection、Map两大块, 前者每个位置只能保存一个元素,后者可以保存两个元素。
Collection又可分为List、Set、Queue
List下常用的有ArrayList、LinkedList、Vector、Stack
Set下常用的有HashSet、TreeSet
Queue又有Deque、Stack、LinkedList

看图更直观


Collection 继承体系


Map 继承体系

大的区别

提供这么多的集合类,总的来说也就是为了实现不同的功能,比如Set元素不能重复,List可以重复,Queue先进先出,不允许随机访问队列中的元素,Map含健值对,每个里面又可以再细分一些类可以排序,或支持并发等。
像LinkedList实现了List和Queue,既能作为 先进先出队列,又能作为 双端队列,还具备的能力。
LinkedHashSet继承HashSet,ArrayDeque实现Queue,用数组实现双端队列。
Stack 基于 Vector 实现。TreeSet 基于 TreeMap 实现,支持排序。

挑几个细说

HashMap

1.初始化. 默认16,如果指定容量的话,内部会自动调整为大于或等于指定容量的最小的一个2的倍数,比如指定10,会给16.
2.扩容. 非线程安全,扩容可能有并发问题,扩容会发生reHash,即会先将新的hash表设置为旧的hash表容量的2倍,再将旧的hash表的元素迁移过去,发生冲突时采用头插法形成链表,这样的设计思路是新数据默认更热,然后删除旧的hash表,再重新新建一个新的hash表以备下次使用。扩容可能产生链表环,jdk1.8之后有改进,改用尾插法加红黑树。
3.为什么容量得是2的倍数呢,因为是2的倍数时,我们查找一个元素时,hashCode%容量可以简化为一个与操作,h%length==h&(length-1),执行效率好,而且是2的倍数的话length-1二进制都为1,进行与操作得到的位置会比较均匀,发生hash碰撞的几率小。

Queue

Queue的使用一般用offer和poll,而不是add和remove,因为后者其实调用了前者,但是后者会在失败的时候抛出异常,这个在AbstractQueue里面体现的。还有put,take两种,放和取,当队列满或空的时候会阻塞。

TreeMap

这个map实现了SortedMap,默认对key升序排列,也可以自己指定规则,基于红黑树实现。
红黑数又是基于二叉查找树来的,因为二叉查找树有大长腿问题,所以在上面定义了一些红色节点、黑色节点和一些规则,在路径比较长的时候可以通过一定的旋转达到最长路径比较短的一个效果。保证最长路径不超过最短路径的2倍长。

LinkedHashMap

继承HashMap,但是它重新定义了Entry,在它的基础上加入before和after两个属性,所以它可以记录元素添加的顺序,默认可以按元素添加的顺序输出。而且当accessOrder属性初始化指定为ture的话也可以记录元素的访问顺序,即每次访问后会将被访问的元素移动到链表的尾部,这个特性就可以来做LRU缓存。

参考:

Java 集合包源码分析
LinkedHashMap 的实现原理

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

推荐阅读更多精彩内容

  • 从最基础的数据结构 数组|链表|树 开始,基于这些基础数据结构通过各种设计组合成具备特定功能的数据结构,这些结构是...
    轩居晨风阅读 1,213评论 2 31
  • hashmap实现的数据结构,数组、桶等。 如图所示 JDK 1.7,是以数组+链表组成的,链表为相同hash的键...
    不需要任何阅读 829评论 0 1
  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,939评论 0 13
  • ​ 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处...
    Java帮帮阅读 1,420评论 0 6
  • fg、bg、jobs、&、nohup、ctrl + z命令 一、& 加在一个命令的最后,可以把这个命令放到后台执行...
    Ada_Corner阅读 1,444评论 0 0