Java容器类概览

Java提供的容器类是我们最常用的工具类,List,Set,Map等容器在我们的项目中无处不在。了解了容器的实现原理,我们就能避免在使用中犯错,使代码更加优雅高效。

Collection

我们先通过一张类图整体看一下Collection的继承关系(强烈建议同学们亲自动手画一画)

Collection类图

上面可以看出Collection是整个体系最顶层接口 他被这三个接口继承

  • List 列表容器
  • Set 集合容器
  • Queue 队列容器

先来查看一下Collection有哪些方法

int size(); //集合大小
boolean isEmpty(); //集合是否为空
boolean contains(Object o); //集合是否包含某个元素
Iterator iterator(); //返回迭代器,Iterable中的接口
Object[] toArray(); //集合返回数组,顺序保持一致,且数组为新数组
T[] toArray(T[] a); //将集合放在a数组中,如果a数组放不下,创建一个新的
boolean add(E e); //添加一个元素
boolean remove(object o); //删除一个元素
boolean containsAll(Collection c); //是否包含全部元素
boolean addAll(Collection c); //添加全部元素
boolean removeAll(Collection c); //删除全部元素
boolean removeIf(Predicate filter) //如果存在删除,可以用lamada表达式 1.8提供
boolean retainAll(Collection c); //保留全部指定元素
void clear(); //清空集合
boolean equals(Object o); //判断是否相等
int hashCode(); //返回hashcode
Spliterator spliterator(); //1.8
Stream stream(); //1.8
Stream parallelStream(); //1.8

通过方法名大致推断处Collection 有增删查,并且和数组可以相互转换,支持Java8的流操作等特性。

List

List 表示列表,重点强调有序性,它有以下几种方法(Collection共有的已排除)

default void replaceAll(UnaryOperator operator);
default void sort(Comparator c); //排序
E get(int index); // 根据下标获取元素
void add(int index, E element); //在指定下标处添加元素
int indexOf(Object o); // 获取某个元素的下标
int lastIndexOf(Object o); //获取某个元素最后一个位置的下标
ListIterator listIterator(); // 返回列表迭代器
ListIterator listIterator(int index);
List subList(int fromIndex, int toIndex); //返回子列表

可以看到List主要对元素获取方面添加了不少方法,还引入了下标的概念,支持随机存取。

Set

Set 表示集合,重点强调元素不可重复性,最多允许一个为null的元素,在方法方面基本上都是继承自Collection,没有什么新的方法。

Queue

Queue表示队列,重点强调获取元素时有一定的规则,这些规则视具体实现而定,FIFO,LIFO 都行。方法如下:

boolean add(E e); //插入元素,如果容量不够的话抛出异常
boolean offer(E e); //快速插入元素,一般用于没有容量限制的队列
E remove() //快速返回队列头元素,如果队列为空,报异常
E poll(); // 返回队列头元素,如果队列为空,返回 null
E element(); // 检索队列头元素,如果为空,报异常,只是检索,不移除
E peek(); //检索队列头元素,如果为空,返回null,只是检索,不移除

Queue 主要是对列表头部添加了很多添加和获取的操作。侧重于元素的读写规则方面。

其他

除了上面三个接口,还有一个特殊的抽象类,AbstractCollection,他实现了Collection上一些基础的方法,比如Contains(),toArray()等不依赖实现的方法。三种容器也都提供了各自的抽象类AbstractList,AbstractSet,AbstractQueue,统一继承自AbstractCollection,这样一看Java的容器类是严格按照面向对象原则来实现的,通过类图可以很容易了解到他的脉络。然后在整个类图中还有一个接口比较特殊:RandAccess,他表明实现者具备随机访问的特性。整个类图上只有List具备这样的特性。

Map

除了Collection这一系外,还有另外一个独立分支,也是表示Java中容器类的,那就是Map。它是一种键值对容器,类图如下:

Map类图

可以看到Map 的类图结构也是非常清楚的。Map有如下方法:

int size(); //返回键值对个数
boolean isEmpty(); //判断是否为空
boolean containsKey(Object key); //是否包含某个键
boolean containsValue(Object value); //是否包含某个值
V get(Object key); //根据键去获取值
V remove(Object key); // 删除某个键值对
void putAll(Map m); //添加另一个map的所有键值对
void clear(); //清空map
Set> entrySet(); //返回Map的内部实体
boolean equals(Object o); //判断是否相等
int hashCode(); //返回hashCode值
default V getOrDefault(Object key, V defaultValue);
default void forEach(BiConsumer action);
default void replaceAll(BiFunction function);
default V putIfAbsent(K key, V value);
default boolean remove(Object key, Object value);
default boolean replace(K key, V oldValue, V newValue);
default V computeIfPresent(K key,
            BiFunction remappingFunction);
default V merge(K key, V value,
            BiFunction remappingFunction);
default V compute(K key,
            BiFunction remappingFunction);

Map接口的方法并不是很多,带有default 实现的接口都是Java8之后新增的。目前看来,Map提供的是键值对的操作,键唯一,值和键一对一关系。

可能有细心的小伙伴发现了,Map类图中有个格格不入的家伙:Dictionary,翻译过来为字典。它是早期jdk1.0版本对key-value键值对数据结构的实现,后来由于这个类当时设计成抽象类的关系,很难在其上面拓展新功能(单继承),所以在1.2版本的时候新引入了Map接口。

SortedMap

继承自Map接口,支持key排序,插入时也是有序的,这样的Map在范围查找方面很便捷

Comparator comparator(); //返回排序比较器
SortedMap subMap(K fromKey, K toKey) //返回子Map
SortedMap headMap(K toKey) //返回某个key之前的Map视图
SortedMap tailMap(K fromKey) //返回某个key之后的Map视图
K firstKey(); // 返回第一个key
K lastKey(); // 返回最后一个key
Set keySet(); // 返回key的集合
Collection values(); //返回value集合
Set> entrySet(); //返回Map内部实体

关于Collection和Map的类图结构大概就了解到这,后续会详细对他们的实现类进行分析,后续的分析主要以实用为主,源码为辅。敬请期待o()o

你可能感兴趣的:(Java容器类概览)