Java集合干货——集合总览

前言

关于集合,首先集合是一个容器,可以按照一定的数据结构存放多个对象,并且提供有一系列的方法,方便对集合中的对象进行统一的管理。

java集合是java提供的工具包(位于java.util.*),包含了常用的数据结构:链表、队列、栈、数组、哈希表等。java集合主要大致分为4个部分:List,Set,Map,工具类。

注:集合的实现是绕不开数据结构的,所以本文在介绍集合的同时也会介绍相关的数据结构。

以下是常用集合的思维导图

Collection

collection接口是Set,Queue,List的父接口,其主要的特点如下

  1. Collection 接口是一组允许重复的对象
  2. Set 接口继承 Collection,但不允许重复,使用自己内部的一个排列机制(hash)
  3. 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对应的数据结构是哈希表,可以找之前的相关文章进行详细的了解。


我不能保证每一个地方都是对的,但是可以保证每一句话,每一行代码都是经过推敲和斟酌的。希望每一篇文章背后都是自己追求纯粹技术人生的态度。

永远相信美好的事情即将发生。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值