Java·Collection内部细剖

1. Java·Collection内部细剖


花了一下午时间,大致整理了一下Java的Collection接口内部的各个接口和实现类。由于时间和精力因素,只能将Collection宏观上的一些接口与实现类进行简单总结,至于实现类里都是如何运作以及运行机制,本文不会涉及。


最近使用了一款思维导图软件,推荐给大家,并且本文就用它来完成了大纲和注释部分。遗憾的是它仅支持IOS和MacOS系统上,如果有条件,大家可以试一试:MindNote,如果你正在寻找一款思维导图软件,可以尝试使用一下。

IOS端

MacOS端


1.1. 大纲

先来一张大纲图

image

如图所示,Collection接口中,实现了Iterable接口,从此可得出结论:有Collection派生出的子类和子接口的实现类,都有iterator()方法。该方法多用于遍历集合内部的元素。
从Collection接口中,派生出了两类,分别是:集合类、Map类。list类用于存放单个元素,Map类用于存放键值对结构的数据。

接下来,我们从Collection内部的点点滴滴说起。

1.1.1. Collection

Collection是最基本的集合接口,一个Collection代表一组Object集合,这些Object被称作Collection的元素。Collection是一个接口,用以提供规范定义,不能被实例化使用。

1.1.2. Iterable

迭代器接口,这是Collection类的父接口。实现这个Iterable接口的对象可使用foreach遍历。也就是说,所有Collection结合都具有foreach遍历方法。

1.1.3. 集合

1.1.3.1. Set

  1. Set是一个接口,继承自Collection,集合中对象皆为无序。且不能包含有重复元素,这是Set类层的共有属性
  2. 判断两个对象相同不能使用==运算符,而是根据equals方法。在Set中加入新元素时,如果在新增时,新元素和Set中已有的对象进行比较都返回false,则Set就会接受这个新元素对象。否则插入失败。
  3. 由于以上Set的制约,在使用时应注意:①为Set集合中的元素类中实现一个有效地equals方法;②对Set的构造函数,传入的Collection参数不能包含重复的元素。
1.1.3.1.1. HashSet

HashSet是Set接口的实现,使用HASH算法来存储集合中的元素,存取和查找性能良好。当向HashSet中存入元素时,HashSet会调用该对象的hashcode()方法得到hashCode值,然后据此决定该对象在HashSet中的存储位置。

1.1.3.1.1.1. LinkedHashSet
  1. LinkedHashSet继承自HashSet
  2. LinkedHashSet也是根据元素的HashCode决定元素的存储位置,和HashSet不同的是,它同时使用链表维护元素次序,这样使元素看起来是以插入时的顺序保存的。
  3. 当遍历LinkedHashSet集合时,会按元素的添加顺序来访问集合的元素。
  4. 由于LinkedHashSet需要维护元素的插入顺序,因此性能地狱HashSet,但在迭代访问全部元素时会有很好的性能(链表遍历性能高)
1.1.3.1.2. SortedSet
  1. SortedSet是一个接口,不可实例化
  2. 顾名思义,此接口用于排序操作,实现此接口的子类都属于排序的子类。
1.1.3.1.2.1. TreeSet
  1. TreeSet是SortedSet接口的实现类,他可以确保集合元素处于排序状态
1.1.3.1.3. EnumSet
  1. EnumSet是一个专门为枚举类设计的集合类
  2. 所有元素都必须指定枚举值,在创建EnumSet时显式或隐式地指定。
  3. EnumSet中元素也是有序的,他们以枚举在EnumSet类内的定义顺序来决定集合元素的顺序

1.1.3.2. List

  1. List是一个接口;
  2. 代表元素有序、可重复的集合。
  3. 集合中每个元素都有对应的顺序索引。
  4. 允许加入重复元素,因为它可以通过索引来访问指定位置的集合元素。
  5. List集合默认按元素的添加顺序设置元素的索引。
1.1.3.2.1. ArrayList
  1. ArrayList是List的实现类
  2. 基于数组实现的List类
  3. 它封装了一个动态增长的、允许再次分配的Object[]数组
1.1.3.2.2. LinkedList
  1. LinkedList是List和Deque接口的实现
  2. 能对他进行队列操作,即:可以根据索引来随机访问集合中的元素,同时他还是先了Deque接口,能将LinkedList当做双端队列使用,自然也可以被当做栈来使用。
1.1.3.2.3. Vector
  1. Vector是List的实现类,用法集合和ArrayList几乎完全相同;
  2. Vector线程安全
1.1.3.2.3.1. Stack
  1. Stack继承自Vector
  2. Stack用于模拟’栈‘这种数据结构(Last In First Out后进先出)

1.1.3.3. Queue

  1. Queue是Collection的子类接口
  2. 用于模拟队列这种数据结构(先进先出First In First Out)。
  3. 队列的头部保存着队列中存放时间最长的元素,队列尾部保存着队列中存放时间最短的元素。新元素插入到队列尾部,访问元素会返回队列头部的元素,且不允许随机访问队列中的元素。
1.1.3.3.1. PriorityQueue

不了解,暂不做介绍

1.1.3.3.2. Deque

Deque是Queue的子类接口

1.1.3.3.2.1. ArrayDeque

不了解,暂不做介绍

1.1.3.3.2.2. LinkedList
  1. LinkedList是List和Deque接口的实现
  2. 能对他进行队列操作,即:可以根据索引来随机访问集合中的元素,同时他还是先了Deque接口,能将LinkedList当做双端队列使用,自然也可以被当做栈来使用。

1.1.4. Map

  1. Map
  2. Map用于保存具有映射关系的数据,因此Map集合保存了key与value两组值;
  3. Key和Value都可以使任何引用类型的数据,但Key不允许重复。即:同一个Mao对象的任何两个key通过equals比较结果总是返回false
  4. Map的这些实现类和子接口中value的存储行事和List非常相似(即value可以重复,根据索引来查找)

1.1.4.1. HashMap

  1. HashMap是Map的实现类
  2. HashMap和HashSet一样也不能保证元素顺序,也是以hashCode值来存放位置,并且也是通过key值得equals比较两个key是否相等
1.1.4.1.1. LinkedHashMap
  1. LinkedHashMap继承自HashMap
  2. LinkedHashMap也使用双向链表来维护键值对的次序,该链表只负责维护Map迭代的顺序,其顺序就是Map插入的顺序

1.1.4.2. Hashtable

  1. 是Map的实现类
  2. 支持同步,线程安全
1.1.4.2.1. Properties
  1. Map的实现类
  2. 其在处理属性文件时很方便(例如win平台的.ini文件)
  3. Properties可以把Map对象和属性文件关联起来,从而可以把Map对象中的键值对写入到属性文件中,也可以加载到Map对象中

1.1.4.3. SortedMap

  1. 是Map的一个子接口
  2. 如Set接口派生出SortedSet、SortedSet有一个TreeSet实现类一样,Map接口中也派生出一个SortedMap、SortedMap也有一个TreeMap实现类
1.1.4.3.1. TreeMap
  1. TreeMap是SortedMap的实现类
  2. TreeMap是一个红黑树数据结构,每个键值对作为红黑树的一个节点。
  3. TreeMap存储键值对时,需要根据Key对节点进行排序。
  4. 因此TreeMap可以保证所有键值对处于有序窗台。同样,TreeMap也有两种排序方式:自然排序、定制排序

1.1.4.4. WeakHashMap

  1. WeakHashMap是Map的实现类
  2. WeakHashMap与HashMap的用法基本相似。区别在于,HashMap的key保留了对实际对象的"强引用",这意味着只要该HashMap对象不被销毁,该HashMap所引用的对象就不会被垃圾回收。
  3. WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,当垃圾回收了该key所对应的实际对象之后,WeakHashMap也可能自动删除这些key所对应的key-value对

1.1.4.5. IdentityHashMap

IdentityHashMap的实现机制与HashMap基本相似,在IdentityHashMap中,当且仅当两个key严格相等(key1 == key2)时,IdentityHashMap才认为两个key相等

1.1.4.6. EnumMap

EnumMap是一个与枚举类一起使用的Map实现,EnumMap中的所有key都必须是单个枚举类的枚举值。创建EnumMap时必须显式或隐式指定它对应的枚举类。EnumMap根据key的自然顺序(即枚举值在枚举类中的定义顺序)


最后放一张长图,各位可以在卫生间的时候学习~:

image


版权申明:未经作者同意,禁止转载。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页