前言
关于集合,首先集合是一个容器,可以按照一定的数据结构存放多个对象,并且提供有一系列的方法,方便对集合中的对象进行统一的管理。
java集合是java提供的工具包(位于java.util.*),包含了常用的数据结构:链表、队列、栈、数组、哈希表等。java集合主要大致分为4个部分:List,Set,Map,工具类。
注:集合的实现是绕不开数据结构的,所以本文在介绍集合的同时也会介绍相关的数据结构。
以下是常用集合的思维导图
Collection
collection接口是Set,Queue,List的父接口,其主要的特点如下
- Collection 接口是一组允许重复的对象
- Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制(hash)
- List 接口继承 Collection,允许重复,以元素安插的次序来放置元素,不会重新排列
数据结构,在Collection中主要使用到的是线性表结构(不包含set),所谓的线性表,指的是元素排列在逻辑上是线性的,例如数组,链表,对列,栈。需要特别说明的是,线性不仅仅是指物理存储上的线性(数组),而是逻辑线性(链表)。
List
Collection是无序可重复的接口。List继承了它的可重复性,但是与之不同的是List是有序的集合,也被称之为序列。在使用的时候可以根据下标对元素进行精准的控制。
ArrayList
ArrayList是Java中顺序表的体现。
我们都知道ArrayList底层是用数组实现的(具体的实现请看后续文章),数组在线性表中的分类属于顺序表,即:顺序表中的数据元素存储是连续的,内存划分的区域也是连续的。
LinkedList
LinkedList是Java中链表的体现。
链表在物理存储上通常是非连续、非顺序的方式存储的,但是数据元素的逻辑顺序是连续的,实现方式是通过链表中的引用来实现。
我们常说LinkedList是链表实现,其实不够准确,准确说LinkedList是双向链表实现。有什么区别呢?
关于链表,常用的有三种:单向链表,循环链表,双向链表。(图片来自知乎)
Stack
Stack是Vector的子类,实现了栈结构,是栈结构的代表。
栈和对列是特殊的线性表,或者说是受到限制的线性表,其限制是仅允许在线性表的尾部进行添加和删除操作,这一端被称为栈顶,另一端称为栈底。向一个栈添加新元素叫压栈,删除元素又称为出栈。
Set
Set是Collection的另一个常用接口,其特点是不可重复,无序,但是并不是说完全无序,元素的存放是有一定规律的,只是没有下标序列表示元素的位置。
其实严格的说set的元素存放方式为散列存放,也就是通过计算hash值的方式存放元素。
Queue
队列通常是指“先进先出”(FIFO,first-in-first-out)的容器。队列的头部是在队列中存放时间最长的元素,队列的尾部是保存在队列中存放时间最短的元素。新元素插入(offer)到队列的尾部,访问元素(poll)操作会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。
Queue接口是对列的体现,在实现上是基于链表实现的,但是具体的实现类是LinkindList,也就是说,java通过Queue接口收窄了LinkedList的访问权限,只提供从队尾,队头等的操作,从而实现了对列。
Queue queue = new LinkedList();
复制代码
Map
Map不同于Collection,在Map中提供了一种映射关系,也就是我们常说的键值对。
- 能够实现根据key快速查找value
- Map中的键值对以Entry类型的对象实例形式存在
- 键(key值)不可重复,value值可以
- 每个建最多只能映射到一个值
Map对应的数据结构是哈希表,可以找之前的相关文章进行详细的了解。
我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。
永远相信美好的事情即将发生。