集合是Java中一个很重要的组成部分。
先来看一张集合的图:
一张图基本上集合的框架结构就清楚了。
后面,再针对这张图上面的结构一一分析:
1.常用的集合梳理
了解集合,最容易的办法就是了解Collection(注意区分Collections,collections是一个工具类)
Collection的接口
Collection的实现子类
2.常用的集合解释
虽然集合有很多很多,但是,我们在编程中并不是全部用上,大多数都是只有特殊时候才会用上。
下面列举一些常用的集合,进行分析:
名称 | 特点 |
---|---|
map | 键值对,key不可重复 |
list | 有序,可重复,以元素安插顺序来放置元素,不会重新排列 |
set | 无序,不可重复,使用内部排列机制 |
queue | 先进先出 |
List系列
名称 | 特点 |
---|---|
ArrayList | 优先随机访问,数组实现,适合查询 |
LinkedList | 适用于频繁的添加删除元素 |
Vector | AbstractList的实现类,同步,线程更加安全 |
Steak | 模拟栈的结构,先进后出 |
Set系列
名称 | 特点 |
---|---|
HashSet | 常用于存储重复自由的集合,需要采用适当分配哈希码的方式来实现hashCode()方法(需重写hashcode和equals()) |
LinkedHashSet | 扩展了HashSet,当需要跟踪插入的元素数据时,其迭代器按照元素的插入顺序来访问各个元素,提供了一个可访问各个元素的有序集合 |
TreeSet | 常用于有序方式插入和抽取元素,故元素应该是可排序的元素 |
SortSet | 保持元素的有序序列,必须实现Comparable |
Map系列
名称 | 特点 |
---|---|
HashMap | 遍历速度慢,插入删除速度快,随机访问速度快,适合海量数据,o(1)的随机访问速度,不是可遍历 |
Hashtable | 里面的方法几乎都是同步的,线程安全。Hashtable不允许存放null值(键和值都不可以),而HashMap可以 |
LinkedHashMap | LinkedHashMap 实现与 HashMap 的不同之处在于,LinkedHashMap 维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序,该集合不是线程安全 |
TreeMap | 使用了二叉权的数据结构,key是有序,保存其唯一性用到了hashCode()、equals()以及比较器(唯一性判断,键排序同TreeSet) |
相对于集合的各种的方法,可以查看API,这个没什么好说的。
3.集合的一些小问题
3.1 ArrayList、Vector、LinkedList的区别
分类 | ArrayList | Vector | LinkedList |
---|---|---|---|
方式 | 数数组方式存储数据,允许直接按序号索引元素 | 数组方式存储数据,允许直接按序号索引元素 | 双向链表实现存储 |
特点 | 索引数据快而插入数据慢 | 索引数据快而插入数据慢 | 索引慢,插入速度较快 |
安全 | 非线程安全 | synchronized修饰,线程安全 | 非线程安全 |
3.2 Iterator接口的作用
collection实现了Iterator接口,而集合是collection的实现,所以集合实现了Iterator接口。
Iterator接口有hasNext(),next(),remove()三个方法,所以Iterator接口方法能以迭代方式逐个访问集合的各个元素,并且安全的从collection中去除适当的元素。
注意:
在Iterator进行删除操作会对底层的Collection带来影响,迭代器是快速修复,所以,当迭代器对数据进行迭代的时候有其他的线程修改底层集合,Iterator会抛出ConcurentModificationException,并且立即失败。
3.3 Comparable接口和Comparable接口
这两个接口是比较接口,对于String等内建类实现Comparable以提供一种排序方式,对于其余类,可实现Comparator来定义自己的比较方式。
分类 | Comparable | Comparable |
---|---|---|
适用于 | 有自然排序 | 不可自然排序或者不喜欢Comparable默认排序方式 |
使用 | 实现comparaTo() | 自定义比较器 |
4.总结
集合就先说在这里,以后有新的会持续更新。
参考:
https://www.jianshu.com/p/ff69ec0fa1a5
Java API