什么是集合框架
Java 集合框架 Java Collection Framework ,又被称为容器 container ,是定义在 java.util 包下的一组接口interfaces 和其实现类 classes。
其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改 CRUD 。
类和接口总览
接口 interfaces
基本关系说明
1.Collection :用来存储管理一组对象 objects ,这些对象一般被成为元素 elements.
- set:元素不能重复,背后隐含着查找/搜索的语义
SortedSet : 一组有序的不能重复的元素 - List : 线性结构
- Queue:队列
- Deque:双端队列
2.Map : 键值对 Key-Value-Pair ,背后隐含着查找/搜索的语义
- SortedMap:一组有序的键值对
Iterable接口:
- 实现该接口允许对象成为"foreach"语句的目标,即该集合对象允许迭代。
- 类集接口Collection是Iterable的子接口,所以所有类集对象可以迭代访问,而映射Map不行。
- 方法
Iterator iterator()
功能:返回一个在一-组T类型的元素上进行迭代的迭代器
迭代器是实现了Iterator/Listlterator接口的类的对象,可以通过遍历类集,访问操作其中的每个元素。
Collection常用方法说明
方法签名 | 说明 |
---|---|
boolean add(E e) | 将元素 e 放入集合中 |
void clear() | 删除集合中的所有元素 |
boolean isEmpty() | 判断集合是否没有任何元素,俗称空集合 |
boolean remove(Object e) | 如果元素 e 出现在集合中,删除其中一个 |
int size() | 返回集合中的元素个数 |
Object[] toArray() | 返回一个装有所有集合中元素的数组 |
Set集合
Set集合不允许存储相同的元素,所以如果把两个相同元素添加到同一个Set集合,则添加操作失败,新元素不会被加入,add()方法返回false。
- HashSet类
HashSet是Set集合最常用实现类,是其经典实现。HashSet是按照hash算法来存储元素的,因此具有很好的存取和查找性能。
HashSet具有如下特点:
1.不能保证元素的顺序。
2.HashSet不是线程同步的,如果多线程操作HashSet集合,则应通过代码来保证其同步。
3.集合元素值可以是null - TreeSet类
TreeSet时SortedSet接口的实现类,TreeSet可以保证元素处于排序状态,它采用红黑树的数据结构来存储集合元素。TreeSet支持两种排序方法:自然排序和定制排序,默认采用自然排序。
List集合
List集合代表一个有序、可重复集合,集合中每个元素都有其对应的顺序索引。List集合默认按照元素的添加顺序设置元素的索引,可以通过索引(类似数组的下标)来访问指定位置的集合元素。
实现List接口的集合主要有:ArrayList、LinkedList、Vector、Stack。
-
ArrayList
ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小,增加元素,容器的大小也会随着增加。当快溢出时,就会进行扩容操作。每次扩容是原来的1.5倍。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。
ArrayList擅长于随机访问。同时ArrayList是非同步的。 -
LinkedList
LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。
LinkedList的实现机制与ArrayList的实现机制完全不同,ArrayLiat内部以数组的形式保存集合的元素,所以随机访问集合元素有较好的性能;LinkedList内部以链表的形式保存集合中的元素,所以随机访问集合中的元素性能较差,但在插入删除元素时有较好的性能。 -
Vector
与ArrayList相似,但是Vector是同步的。所以说Vector是线程安全的动态数组。 -
Stack
Stack继承自Vector,实现一个后进先出的堆栈。push方法插入元素和pop方法取出元素,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。
Map常用方法说明
Map接口采用键值对Map<K,V>的存储方式,保存具有映射关系的数据,因此,Map集合里保存两组值,一组值用于保存Map里的key,另外一组值用于保存Map里的value,key和value可以是任意引用类型的数据。key值不允许重复,可以为null。如果添加key-value对时Map中已经有重复的key,则新添加的value会覆盖该key原来对应的value。常用实现类有HashMap、TreeMap等。
方法签名 | 说明 |
---|---|
V get(Object k) | 根据指定的 k 查找对应的 v |
V getOrDefault(Object k, V defaultValue) | 根据指定的 k 查找对应的 v,没有找到用默认值代替 |
V put(K key, V value) | 将指定的 k-v 放入 Map |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
Set<Map.Entry<K, V>> entrySet() | 将所有键值对返回 |
boolean isEmpty() | 判断是否为空 |
int size() | 返回键值对的数量 |
HashMap与Hashtable
- HashMap与Hashtable都继承Map接口,但HashMap的基类是AbstractMap,而的基类是ashtableDictionary
- HashMap是线程不安全,HashTable是线程安全synchronized
- HashMap可以使用null值最为key或value;Hashtable不允许使用null值作为key和value,如果把null放进HashTable中,将会发生空指针异常。
- HashMap使用的是Iterator(迭代器),HashTable使用的是Iterator和Enumerator(枚举)
- HashMap初始值16,每次扩容变为原来2倍,HashTable初始值11,每次扩容变为原来2倍加一
TreeMap实现类
TreeMap是SortedMap的实现类,是一个红黑树的数据结构,每个key-value对作为红黑树的一个节点。TreeMap存储key-value对时,需要根据key对节点进行排序。TreeMap也有两种排序方式:
- 自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则会抛出ClassCastException。
- 定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。