Collection体系原理了解

Collection体系简介

  • Collecion的体系
    • Collection的体系结构
      集合体系
      集合体系中有2大类,Collection和Map,其中Collection下又有List和Set。
    • List/Set约定
      List有序,Set无序。

有序无序意味着存在索引且从0开始

  • Collection体系提供的常用方法
    • new: new ArrayList(Collection), new ArrayList()
    • R: size()/ isEmpty()/ contains() / for() / stream()
    • C/U: add()/ addAll()/ retainAll()
    • D: clear()/ remove()/ removeAll()

List

  • 最常用的ArrayList
    • 本质上就是一个数组,但是在add的时候会去动态的增加自己的长度(即创建一个新的数组)
  • 常见面试题: 动态扩容的实现
    • 创建一个更大的空间,然后把原先的所有元素拷贝过去

Set

  • 不允许有重复元素的集合
    • 判断重复调用的是equals()
  • 如果要自己实现一个Set,怎么实现?
    1.如果要自己实现一个Set,肯定能想到的是一个简单思路就是每次添加新元素时,查看现有的元素中存不存在目标元素,如果有则不加入。这样的思路的问题是,如果现有的元素已经有很多了的话,那么会比较很多次,性能会受影响。
    2.所以举个例子:假设我们要把所有用户的姓名加入到一个自己实现的Set中来时,我们可以先根据用户的姓来进行比较添加,比如现有赵钱孙李四种姓氏,要添加赵四时,就只需要去跟赵姓中的元素们进行比较,如有相同则不添加,不需要跟整个现有集合进行比较。提高了性能。
    3.上述的例子,就是hashCode的含义,对于Set集合,将Object们对应为一个个的int值,相同的int值对应的就相当于是一个姓氏,新加Object时,就只需要跟相同int值的Object们进行equals比较就好了。而这个将Object对应为int值的方法,就是hashCode()

上述的一个个int值对应的小集合,称为hash桶

  • Java世界里的又一重要约定: hashCode
    • 同一个对象必须始终返回相同的hashCode
    • 两个对象的equals返回true,必须返回相同的hashCode
    • 两个对象不等,也可能返回相同的hashCode

哈希算法

  • 哈希就是一个单向的映射
    因为int值是有限度的,总共也就42亿中hash值,而对象可能有更多种,所以只能从对象映射到int值,不能反向映射,所以是单向的。
  • 例子:见从姓名到姓的哈希运算
  • 从任意对象到一个整数的hashCode

HashSet

  • 最常用,最高效的Set实现
  • HashSet的高效性
    使用Hash算法使得HashSet的查找性能特别高
  • 使用HashSet可以进行去重
  • HashSet是无序的!如果需要排序得使用LinkedHashSet

Map

  • Map的简介与实战:
    • C/U: put()/ putAll()
    • R:
      • get()/ size()
      • containsKey()/ containsValue()
      • keySet()/ values()/ entrySet()

关于keySet(),返回的是一个包含所有key的set,任何对这个set的修改都会反映到原先的Map上,反之亦然,切记!!

  • D: remove()/ clear()

HashMap

  • 最常用,最高效的Map实现
  • 常见面试题:
    • HashMap的扩容(resize()方法,本质思路还是一样的,创建一个更大的HashMap)
    • HashMap的线程不安全性(使用ConcurentHashMap)
    • HashMap在Java7+后的改变: 链表 -> 红黑树
      是为了防止大量对象的hashCode值一样导致性能下降改变的。
  • HashMap和HashSet在本质上其实是一种东西

HashMap的key就是一个HashSet

有序集合TreeSet和TreeMap

和LinkedHashSet不同的是,TreeSet会对内部的元素进行一次默认的排序,而不是仅仅按照插入的顺序存储。
另外TreeSet其内部结构是一个二叉树,可以把查找的算法复杂度从o(n)下降到o(logn)(和ArrayList对比)。

Collections工具类的常用工具方法

  • emptySet,emptyMap
  • synchronizedCollection: 将一个集合变成线程安全的。
  • unmodifiableCollection: 将一个集合变成不可变的(Guava的Immutable)。

Collection的其他实现

  • Queue/Deque
  • Vector/Stack
  • LinkedList
  • ConcurrentHashMap
  • PriorityQueue

Guava

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

推荐阅读更多精彩内容

  • Java集合类可用于存储数量不等的对象,并可以实现常用的数据结构如栈,队列等,Java集合还可以用于保存具有映射关...
    小徐andorid阅读 1,849评论 0 13
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 707评论 0 2
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,334评论 0 4
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX阅读 820评论 0 1
  • 集合类框架的介绍: ![Java 集合类框架](https://upload-images.jianshu.io/...
    LynnGuo阅读 736评论 0 1