查看: 105|回复: 1

【Java】一张神图让你了解集合的设计与实现(附代码实现)

[复制链接]

2

主题

9

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-1 15:52:10 | 显示全部楼层 |阅读模式
在我们日常开发中,经常会用到集合,你已经把它们都用得非常熟了,但是作为一名合格的程序员,你不仅要了解它的基本用法,还要了解它的源码,还有你要了解它是如何设计和实现的以及它的衍生过程。
      下面就详细介绍一下Collection这个庞大集合框架的家族体系和成员,让你了解它的设计与实现。是时候祭出这张神图了!



首先来介绍的就是列表爷爷辈儿的接口- Iterator
Iterable接口
实现此接口允许对象成为for-each 循环的目标,也就是增强for循环,它是Java中的一种语法糖。
List<0bject> list = new ArrayList();
for (object obj: list){}除了实现此接口的对象外,数组也可以用for-each循环遍历,如下:
Object[] list = new Object[10];
for (Object obj: list){}其他遍历方式
jdk 1.8之前Iterator只有iterator-个方法, 就是
Iterator<T> iterator();实现次接口的方法能够创建一个轻量级的迭代器,用于安全的遍历元素,移除元素,添加元素。这里面涉及到一个fail-fast 机制。
总之一点就是能创建迭代器进行元素的添加和删除的话,就尽量使用迭代器进行添加和删除。
也可以使用迭代器的方式进行遍历
for(Iterator it = coll.iteratorO; it.hasNextO;){
    System.out.println(it.next());
}顶层接口
Collection是一个顶层接口,它主要用来定义集合的约定
List接口也是一个顶层接口,它继承了Collection 接口,同时也是ArrayList、 LinkedList 等集合元素的父类
Set接口位于与List 接口同级的层次.上,它同时也继承了Collection 接口。Set 接口提供了额外的规定。它对add、equals、 hashCode 方法提供了额外的标准。
Queue是和List、Set 接口并列的Collection的三大接口之一。Queue 的设计用来在处理之前保持元素的访问次序。除了Collection 基础的操作之外,队列提供了额外的插入,读取,检查操作。
SortedSet接口直接继承于Set接口,使用Comparable对元素进行自然排序或者使用Comparator在创建时对元素提供定制的排序规则。set的迭代器将按升序元素顺序遍历集合。
Map是一个支持key-value 存储的对象,Map不能包含重复的key,每个键最多映射一个值。这个接口代替了Dictionary类,Dictionary 是一个抽象类而不是接口。
ArrayList是实现了List 接口的可扩容数组(动态数组),它的内部是基于数组实现的。
Vector同ArrayList一样,都是基于数组实现的,只不过Vector是一个线程安全的容器,它对内部的每个方法都简单粗暴的上锁,避免多线程引起的安全性问题,但是通常这种同步方式需要的开销比较大,因此,访问元素的效率要远远低于ArrayList。
LinkedList类
LinkedList是一个双向链表,允许存储任何元素(包括null)。
Stack
堆栈是我们常说的后入先出(吃了吐)的容器。它继承了Vector类,提供了通常用的push和pop操作,以及在栈顶的peek方法,测试stack是否为空的empty方法,和一个寻找与栈顶距离的search方法。
HashSet
HashSet是Set接口的实现类,由哈希表支持(实际上HashSet是HashMap的一个实例)。它不能保证集合的迭代顺序。这个类允许null 元素。
TreeSet
TreeSet是- -个基于TreeMap的NavigableSet实现。这些元素使用他们的自然排序或者在创建时提供的Comparator进行排序,具体取决于使用的构造函数。
LinkedHashSet
是Set接口的Hash表和LinkedList的实现。这个实现不同于HashSet的是它维护着一个贯穿所有条目的双向链表。此链表定义了元素插入集合的顺序。注意:如果元素重新插入,则插入顺序不会受到影响。
PriorityQueue
PriorityQueue是AbstractQueue的实现类,优先级队列的元素根据自然排序或者通过在构造函数时期提供Comparator来排序,具体根据构造器判断。PriorityQueue 不允许null 元素。
HashMap
HashMap是一个利用哈希表原理来存储元素的集合,并且允许空的key-value 键值对。HashMap 是非线程安全的,也就是说在多线程的环境下,可能会存在问题,而Hashtable是线程安全的容器。
TreeMap类
一个基于NavigableMap实现的红黑树。这个map根据key自然排序存储,或者通过Comparator进行定制排序。
LinkedHashMap类
LinkedHashMap是Map接口的哈希表和链表的实现。这个实现与HashMap不同之处在于它维护了一个贯穿其所有条目的双向链表。这个链表定义了遍历顺序,通常是插入map中的顺序。
Hashtable类
Hashtable类实现了一个哈希表,能够将键映射到值。任何非空对象都可以用作键或值。
IdentityHashMap类
ldentityHashMap是比较小众的Map实现了。
WeakHashMap类
WeakHashMap类基于哈希表的Map基础实现,带有弱键。WeakHashMap 中的entry当不再使用时还会自动移除。更准确的说,给定key的映射的存在将不会阻止key被垃圾收集器丢弃。
Collections类
Collections不属于Java框架继承树.上的内容,它属于单独的分支, Collections 是一个包装类,它的作用就是为集合框架提供某些功能实现,此类只包括静态方法操作或者返回collections。

       因为篇幅原因ArrayList、Vector、LinkedList类、Stack、HashSet、TreeSet、LinkedHashSet、PriorityQueue、HashMap、TreeMap类、LinkedHashMap类、Hashtable类、IdentityHashMap类、WeakHashMap类、Collections类的详细说明和代码使用我放在文档里,评论里扣666+关注我发给你哦!
回复

使用道具 举报

3

主题

8

帖子

13

积分

新手上路

Rank: 1

积分
13
发表于 2023-1-1 15:52:35 | 显示全部楼层
喔豁,够细的[思考]
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表