主要内容
- 包含Set、List、Map、Queue类
- Iterator迭代器,用来遍历集合数据
- Set、List、Queue都实现了Collection接口
List集合
特性:存取有序、可重复、带有索引
- ArrayList
存储结构:数组(Array)
特性:元素增删慢、查找快 - Vector
存储结构:数组(Array)
特性:Vector中提供了一个独特的取出方式,就是枚举Enumeration,它其实就是早期的迭代器,现在被Iteratoe取代 - LinkedList
存储结构:链表结构
特性:
3.1 方便元素添加、删除的集合
3.2 实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法,故也可以作为堆栈、队列结构使用
Set集合
特性:不可重复
-
HashSet:
存储结构:哈希表
特性:
1.1 不能保证的迭代顺序与元素存储顺序相同
1.2 保证元素唯一性的方式依赖于:hashCode()与equals()方法。
1.3 如果我们往集合中存放自定义的对象,那么保证其唯一,就必须复写hashCode和equals方法建立属于当前对象的比较方式。 -
TreeSet:
存储结构:二叉树
特性:
2.1 TreeSet中存储自定义对象需要实现comparable接口
2.2 可以对set集合中的元素进行排序,默认按照asic码表的自然顺序排序 -
LinkedHashSet:
存储结构:链表和哈希表组合
特性:元素存放是有序的
Map集合
特性:
- 元素是以键值对(key-value)的形式存储的,能够实现根据key快速查找value
- Map中的键值对以Entry类型的对象实例形式存在
- 键(key值)不可重复,value值可以重复,一个value值可以和很多key值形成对应关系,每个键最多只能映射到一个值
Map支持泛型,形式如:Map<K,V>
- HashMap:
存储结构:哈希表
特性:
1.1 HashMap中的Entry对象是无序排列的
1.2 Key值和value值都可以为null,但是一个HashMap只能有一个key值为null的映射(key值不可重复)
1.3 方法不是同步的(线程不安全),如果对同步性或与遗留代码的兼容性没有任何要求,建议使用 - HashTable:
存储结构:哈希表
特性:
2.1 无序
2.2 方法是同步的(线程安全),如果对同步性或与遗留代码的兼容性有要求,建议使用
2.3 除构造函数外,Hashtable的所有 public 方法声明中都有 synchronized关键字
2.4 Hashtable不允许null值 - TreeMap:
存储结构:红黑树
特性:
3.1 有序
3.2 TreeMap的基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n)
3.3 该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。
3.4 实现了NavigableMap接口,意味着它支持一系列的导航方法
3.5 实现了Cloneable接口,意味着它能被克隆
3.6 实现了java.io.Serializable接口,意味着它支持序列化
Queue接口
- 存储结构:队列
- 特性:
2.1 队列是一种特殊的线性表,它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。
2.2 Queue使用时要尽量避免Collection的add()和remove()方法,而是要使用offer()来加入元素,使用poll()来获取并移出元素。
2.3 如果要使用前端而不移出该元素,使用element()或者peek()方法。 - 不阻塞实现:
PriorityQueue
ConcurrentLinkedQueue - 阻塞实现:
ArrayBlockingQueue:一个由数组支持的有界队列。
LinkedBlockingQueue:一个由链接节点支持的可选有界队列。
PriorityBlockingQueue:一个由优先级堆支持的无界优先级队列。
DelayQueue:一个由优先级堆支持的、基于时间的调度队列。
SynchronousQueue:一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
Collection接口
高度抽象出来的集合,包含了集合的基本操作(添加、删除、清空、遍历(读取)、是否为空、获取大小、是否保护某元素等等)
八大数据结构类型
参考资料:https://blog.csdn.net/yeyazhishang/article/details/82353846
数组:
- 定义:数组是可以再内存中连续存储多个元素的结构,在内存中的分配也是连续的,数组中的元素通过数组下标进行访问,数组下标从0开始
- 优点:
2.1 按照索引查询元素速度快
2.2按照索引遍历数组方便 - 缺点:
3.1 数组的大小固定后就无法扩容了
3.2 数组只能存储一种类型的数据
3.3 添加,删除的操作慢,因为要移动其他的元素 - 使用场景:频繁查询,对存储空间要求不大,很少增加和删除的情况
栈:
先进后出,或者说是后进先出,从栈顶放入元素的操作叫入栈,取出元素叫出栈,常应用于递归功能方面的场景
队列:
- 队列可以在一端添加元素,在另一端取出元素,也就是:先进先出。
- 使用场景:因为队列先进先出的特点,在多线程阻塞队列管理中非常适用。
链表:
- 优点:
1.1 链表是很常用的一种数据结构,不需要初始化容量,可以任意加减元素;
1.2 添加或者删除元素时只需要改变前后两个元素结点的指针域指向地址即可,所以添加,删除很快; - 缺点:
2.1 因为含有大量的指针域,占用空间较大;
2.2 查找元素需要遍历链表来查找,非常耗时 - 使用场景:数据量较小,需要频繁增加,删除操作的场景
二叉树:
它添加,删除元素都很快,并且在查找方面也有很多的算法优化,所以,二叉树既有链表的好处,也有数组的好处,是两者的优化方案,在处理大批量的动态数据方面非常有用。二叉树有很多扩展的数据结构,包括平衡二叉树、红黑树、B+树等
散列表(哈希表:数组+链表的组合):
根据关键码和值 (key和value) 直接进行访问的数据结构,通过key和value来映射到集合中的一个位置,这样就可以很快找到集合中的对应元素。
图:
比较复杂,不做讨论
堆:
堆有序的特点,一般用来做数组中的排序,称为堆排序