title: Java集合
date: 2020-09-05 09:18:44
tags:
引言
- 优质博客
- java集合继承关系图
- https://www.runoob.com/java/java-stack-class.html
集合概述
- java集合框架图
Collection
集合中存储的都是对象的引用(地址)。
- 集合的输出
- 四种输出方式
- Iterator
- ListIterator
- Enumeration
- foreach
- 注意:
- 在迭代时,不可以通过集合对象的方法操作集合中的元素,因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的放过操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。
- 四种输出方式
List接口
(对付顺序的好帮手): 存储的元素是有序的、可重复的。
ArrayList类
- Object[] 数组
- 查询快
- add(E e) O(1)
- add(int index, E element) O(n-i)
LinkedList类
- 双向链表实现
- 查询慢
- add(E e) O(1)
- add(int index, E element) o(n)
Vector类
- 线程安全的,效率低
Stack类
- boolean empty()
判断栈是否为空 - E peek()
返回栈顶对象,不移除 - E pop()
返回栈顶对象,并移除 - E push(E item)
压入栈顶 - int search(Object o)
返回对象在栈的位置
Queue接口
Queue接口定义了如下6个方法,我们常用的LinkedList类就实现了Queue接口。
- boolean add(E e)
向队列中添加元素 - E element()
返回队列的头,且不移除 - boolean offer(E e)
向队列中添加元素 - E peek()
返回队列的头,且不移除 - E poll()
返回队列的头,且移除 - E remove()
返回队列的头,且移除
add、element、remove会在操作失败时抛出异常,而offer、peek、poll在操作失败时返回特殊值。
PriorityQueue类
Dequeue接口
ArrayDeque类
Set接口
HashSet类
-
HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals。
LinkedHashSet类
- 能够按照添加的顺序遍历
SortedSet接口
TreeSet类
- 底层为红黑树
- 能够按照添加元素的顺序进行遍历,排序的方式有自然排序和定制排序。
Map接口
<Key,Value>
HashTable 类
- 线程安全 其内部方法基本经过
synchronized
修饰 (替代 ConcurrentHashMap) - 效率较低,基本被淘汰
HashMap 类
- 底层数据结构: 数组 + 链表(jdk1.8后 链表长于(8)将链表转为红黑树)
- 初始容量大小和每次扩充容量大小:
- HashMap 默认的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍。
- 创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小(HashMap 中的tableSizeFor()方法保证,下面给出了源代码)。也就是说 HashMap 总是使用 2 的幂作为哈希表的大小。
LinkedHashMap 类
- 在上
HashMap
结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。
SortedMap 接口
TreeMap类
- 底层数据结构:红黑树
其他(草稿)
-
List接口
- ArrayList
- Object[] 数组
- 查询快
- add(E e) O(1)
- add(int index, E element) O(n-i)
- LinkedList
- 双向链表实现
- 查询慢
- add(E e) O(1)
- add(int index, E element) o(n)
- ArrayList
-
Map接口
- HashMap
- 数组 + 链表(jdk1.8后 链表长于(8)将链表转为红黑树)
- LinkedHashMap
- 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。
- TreeMap
- LinkedTable
- ConcurrentHashMap
- 只锁桶
- HashMap
-
Set
- HashSet
- 线程不安全 底层是HashMap 可以存储null值
- LinkedHashSet
- TreeSet
- HashSet
-
Collection接口
Modifier and Typ | 方法 | 描述 |
---|---|---|
boolean | add(E e) | 确保此集合包含指定的元素(可选操作)。 |
boolean | addAll(Collection<? extends E> c) | 将指定集合中的所有元素添加到此集合(可选操作)。 |
void | clear() | 从此集合中删除所有元素(可选操作)。 |
boolean | contains(Object o) | 如果此集合包含指定的元素,则返回 true 。 |
boolean | containsAll(Collection<?> c) | 如果此集合包含指定集合中的所有元素,则返回 true 。 |
boolean | equals(Object o) | 将指定的对象与此集合进行比较以获得相等性。 |
int | hashCode() | 返回此集合的哈希码值。 |
boolean | isEmpty() | 如果此集合不包含元素,则返回 true 。 |
Iterator | iterator() | 返回此集合中元素的迭代器。 |
default Stream | parallelStream() | 返回可能并行的 Stream与此集合作为其来源。 |
boolean | remove(Object o) | 从该集合中删除指定元素的单个实例(如果存在)(可选操作)。 |
boolean | removeAll(Collection<?> c) | 删除指定集合中包含的所有此集合的元素(可选操作)。 |
default | boolean removeIf(Predicate<? super E> filter) | 删除满足给定谓词的此集合的所有元素。 |
boolean | retainAll(Collection<?> c) | 仅保留此集合中包含在指定集合中的元素(可选操作)。 |
int | size() | 返回此集合中的元素数。 |
default | Spliterator spliterator() | 在此集合中的元素上创建一个Spliterator 。 |
default | Stream stream() | 返回一个序列 Stream与此集合作为其来源。 |
Object[] | toArray() | 返回一个包含此集合中所有元素的数组。 |
T[] | toArray(T[] a) | 返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。 |