title: Collection框架
date: 2020-01-17 20:12:45
tags:
-Collection框架
categories: Java学习
top: 10
前言
有了数组为什么还需要集合框架? 为了适应实际开发过程中,保存动态变化的数据集合,而数组一旦定义,长度将不能变化,于是就有我么动态增长的集合框架.
一组存储对象的容器(动态)
- Collection接口:存储另一个元素的集合
- Collections:操作集合的工具类
- Map接口(图):存储键/值对
注意:集合框架中所有的具体类都实现了Cloneable和Serializabel接口,即他们的实例都是可复制且可序列化的。
Collection接口:
Collection接口:
方法 | 描述 |
---|---|
boolean add(E e); | 向集合中添加元素 |
int size(); | 返回集合中的元素个数 |
void clear(); | 删除集合中的所有元素 |
boolean remove(Object o); | 从集合删除元素o |
boolean removeAll(Collection<?> c); | 从集合中删除集合c中的所有元素 |
boolean retainAll(Collection<?> c); | 保留c和该集合都有的元素(交集) |
boolean addAll(Collection<? extends E> c); | 将集合c中所有元素添加到当前这个集合 |
boolean contains(Object o); | 如果该集合包含对象o,返回true |
boolean containsAll(Collection<?> c); | 如果该集合中包含集合c中所有元素,返回true |
boolean isEmpty(); | 如果集合不包含任何元素,则返回true |
Iterator<E> iterator(); | 返回该集合中元素所有的迭代器 |
Object[] toArray(); | 返回该集合元素构成的Object数组 |
三种主要子接口
- Set(规则类):存储一组不重复的元素
- List(线性表):存储一个有序集合
- Queue(队列):存储用先进先出方式处理的对象
注意:Collection是集合最高接口,但是直接使用Collection接口会造成操作意义不明确,所以在实际开发中不直接使用Collection接口
List接口
具有索引的List接口
方法 | 描述 |
---|---|
public void add(int index, E element) | 在指定位置增加元素 |
public boolean addAll(int index, E element) | 在指定位置增加一组元素 |
E get(int index) | 返回指定位置元素 |
public int indexOf(Object o) | 查找指定元素的位置 |
public int lastindex Of(Object o) | 从后往前查找指定元素的位置 |
public Listlterator<E> listlterator() | 获得List迭代器对象(可以在指定位置向前或向后访问,可以修改集合中的元素) |
public E remove(int index) | 删除指定位置的元素 |
public List<E> subList(int fromlndex, int tolndex) | 取出集合中的子集合 |
public E set(int index, E element) | 替换指定位置的元素 |
List接口下的三个实现类
- ArrayList --数组线性表,是一个大小可变的数组,在内存中分配连续的空间,遍历元素和随机访问元素的效率比较高。
- LinkedList --链表,采用链表存储方式,提供从线性表两端提取、插入和删除元素的方法,插入、删除元素效率比较高。
List接口扩展了Collection接口的方法,这些方法使用起来比父接口更加方便,要使用List接口,需要对List接口的实现类实例化
Set接口
用来操作存储一组唯一,无序的对象 v
Set接口下的三个实现类
- HashSet -- 用来存储互不相同的任何元素
- LinkedHashSet -- 使用链表扩展实现HashSet类,支持对元素的排序
- TreeSet -- 可以确保所有元素是有序的
Queue接口
通常用于操作一组队列方式的对象信息(一般存储方式为先进先出)
方法 | 描述 |
---|---|
boolean offer(element) | 向队列中插入一个元素(类型add方法) |
E poll() | 获取并删除队列头元素,如果队列为空返回null |
E remove() | 获取并删除队列头元素,如果队列为空抛出异常 |
E peek() | 获取但不删除列头元素,如果队列为空返回null |
E element() | 获取但不删除列头头元素,如果队列为空抛出异常 |
主要实现子类
- PriorityQueue 优先队列,最小值拥有优先级最先删除。
- ArrayQueue 双端队列,集合容量可动态扩展
注意:
1.Deque支持在两端插入和删除元素,是双端队列的简称(double-ended queue),支持从两端操作队列的元素
2.定义的方法:addFirst(e), removeFirst(e), addLast(e), removeLast(e), getFirst()/getLast()
Map接口
以键-值存储元素的容器,根据关键字(key)找到对应的数据
方法 | 描述 |
---|---|
V put(key,value) | 将一个键/值映射放入图中 |
V get(key) | 根据键获取对应的value值 |
Set<K> keySet() | 返回包含键的规则集 |
Collection<V> values() | 返回包含值得集合 |
boolean containsKey(key) | 返回图中是否包含键值key |
Set<Map.Entry<K,V>> entrySet() | 返回一个图中包含条目的规则集 |
int size() | 返回途中的键值对个数 |
V remove(key) | 删除指定键对应的条目 |
其主要子类及其用途
子类 | 描述 |
---|---|
HashMap | 查询、插入和删除比较高效 |
LinkedHashMap | 支持元素的排序 |
TreeMap | 遍历有序的键值时非常高效、 |
Properties | 一般用于操作属性文件 |
Map三种遍历方式
- 通过Map.keySet遍历key,通过key取出对应的value(比较常用,需要二次取值)
for(String key : treeMap.keySet()){
System.out.println(key + "--" + treeMap.get(key));
}
- 通过Map.entrySet使用迭代器遍历key和value(不常用,代码复杂)
Set<Map.Entry<String, Integer>> entrySet = treeMap.entrySet();
Iterator<Map.Entry<String, Integer>> entrySetIt = entrySet.iterator();
while(entrySetIt.hasNext()){
Map.Entry<String, Integer> entry = entrySetIt.next();
System.out.println(entry.getKey() + "--" + entry.getValue());
}
- 直接遍历Map.entrySet集合(容量大时,使用此方法)
for(Entry<String, Integer> entry : treeMap.entrySet()){
System.out.println(entry.getKey() + "--" + entry.getValue());
}