突然发现,每天深陷业务的纠缠中无法自拔,对于Java的基础部分知之甚少.所以开始看看一些java core基础的部分
今天来了解一下集合容器
Java集合框架
- 用来表示和操作集合的统一的架构,它包含了实现集合的接口与类
- 不同的集合类有不同的数据结构,在使用中要根据不同的性能要求,使用不同的集合类
- 有哪些接口
- Iterable 迭代器接口
- Collection 类集合接口
- List 列表接口
- Set 数据集接口
- Queue 对接裂口
- Map 键值对映射表
Iterable 接口
- 实现该接口允许对象成为”foreach”语句的目标,也就是该集合允许迭代
- 迭代器是实现了Iterator/ListIterator 接口的类的对象,可以通过遍历类集,访问操作其中的每个元素
- ListIterator 扩展了 Iterator, 允许双向遍历集合,并且可以删除和修改元素
- ListIterator 根据方法发现可以去到上一个元素
1
2
3
4
5
6
7
8/**
* 是否有上一个元素
*/
boolean hasPrevious();
/**
* 取上一个元素
*/
E previous();1
for(String it:array) //循环方式
Collection 类集接口
- 是Iterable接口的子接口,所有类集对象可以访问,但是Map不行.
- 存放各种元素.有些是有序有些是无序的
1
2
3
4
5/**
* 返回一个在一组T类型的元素上进行迭代的迭代器.
*/
Iteator<T> iterator(){}
List/ Set /Map
- List
- 扩展了Collection
- 是一个有序的容器
- 存放的元素是可重复的
1
ListIterator<E> listIterator();//成为一个可以双向遍历的迭代器对象
- Set
- 扩展了Collection
- 是一个无序的容器
- 存放的元素是不可重复的
- Map
- 是一个存储关键字键/值对的对象,可以通过键查询到所对应的值,键和值都可以是对象
- 并不是Collection的子接口,所以Map本身不能使用迭代器来进行遍历
ArrayList
- 调用一个无参的构造方法的时候,会在内部调用一个初始大小为10的ArrayList对象
- 可以添加null为容器中的一个元素
- 当添加一个元素的时候
1
2
3
4
5
6
7
8
9
10
11
12
13
14/**
* 产生一个新的数组,并且容量是原有数组大小的1.5倍
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;//当前容器内数组的大小
int newCapacity = oldCapacity + (oldCapacity >> 1);//原有容器内数组大小+容器大小右移一位(右移一位可以视为计算除以2)
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
elementData = Arrays.copyOf(elementData, newCapacity);//产生一个新的ArrayList对象,并将原来的元素拷贝到新的集合对象内,新的集合对象容量为原来的1.5倍
}
LinkedList
- 是一个双向链表结构 Node节点有一个对于前一个节点的引用,后一个节点的引用
1
2
3
4
5
6
7
8
9
10
11private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
} - 实现了Deque(Double ended Queue 双端队列),继承自Queue队列,先进先出.