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)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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