回顾—集合框架与泛型
1)集合框架
1)引言
Java集合框架,用于存储数据,并提供方法支持查找、插入和删除。
Java集合框架支持两种类型的容器:
存储元素的集合,称为集合(collection);
存储键值对,称为图(map)
2)集合(Collection)
集合总共有3种类型:线性表(List)、规则集(Set)、队列(Queue)。
线性表:一个存储有序元素的集合
规则集:一个存储不重复元素的集合
队列:一个存储用先进先出方式处理的对象的集合。
常用方法:
boolean add(E e):向集合中添加新元素e(这里E是泛型,代表所有类型,以下不作解释)
boolean addAll(Collection<? Extends E> c):向集合中添加集合c的所有元素
boolean contains(Object o):判断是否存在元素o
boolean containsAll(Collection<?> c):判断是否存在集合c的所有元素
void clear():删除所有元素
boolean remove(Object o):删除元素o
boolean removeAll(Collection<?> c):删除属于集合c的所有元素
int size():返回集合元素个数
isEmpty():判断集合是否为空
List接口:线性表
其三个具体类是:Vector、ArrayList、LinkedList
Vector:向量类,其内部的数据结构是一个数组,是线程同步的,相对ArrayList,效率更低。
ArrayList:数组线性表,其内部数据结构是一个大小可变的数组,是线程不同步的。
LinkedList:,是实现List接口的一个链表。
对于ArrayList和LinkedList的使用应根据需要进行选择,如果需要快速查询,不要求插入与删除,则选择ArrayList;反之,选择LinkedList。
Set接口:规则集
Set的底层实现依赖于Map,其三个具体类是:HashSet、LinkedHashSet、TreeSet
HeshSet:散列集,继承AbstractSet抽象类,其集合中的元素没有特定的顺序。
LinkedHashSet:链式散列集,继承HashSet,扩展了HashSet类,可对规则集内的元素排序。
TreeSet:树形集,实现了SortedSet,NavigableSet接口的具体类,对规则集内的元素有两种排序方式:一是自然排序,使用Comparable接口的排序规则;二是自定义排序,实现Comparator接口,自定义一种排序规则。
以下展示自定义排序:
Queue:队列,是一种先进先出的数据结构。优先队列中,元素具有优先级,拥有最高优先级的元素最先被删除。(这一种基本没接触过,这里不作详细讨论)
3)图(Map)
图是一种存储键值对的数据结构。集合中的下标在图中称为键值,且图中的键值可以是任意类型的,不一定是整数。图中不能有重复的键值,每一个键值对应一个值。
图的类型有三种,散列图HashMap、链式散列图LinkedHashMap、树形图TreeMap。
关系图:
HashMap:散列图,其类中的条目是没有顺序的。
LinkedHashMap:链式散列图,继承自HashMap,可对元素进行排序,排序分两种,一种是插入排序,通过默认构造函数创建;另一种是访问顺序排序,通过LinkedHashMap(initialCapacity, loadFactor,true)创建
TreeMap:树形图,键值可以使用Comparable接口或Comparator接口排序
下面展示map的简单操作:
2)泛型
1)引言
泛型是指参数化类型的能力。
使用泛型主要的优点是使得运行时会出现的ClassCastException在编译时就能检测出来。
此外,使用泛型还使得无需类型转换就可以从一个元素类型已指定的列表中获取值。
泛型类型必须是引用类型,这个导致集合框架存储的数据也必须是引用类型。
泛型有泛型接口、泛型类、泛型方法。
2)泛型接口
此时T(也可以是其它字母如:S、U、V、E等等)代表任何引用类型,可以传入String、Integer、自定类等等。
如:
3)泛型类
有两个泛型参数时用”,”分隔
4)泛型方法
上面的Tool类中有两个泛型方法,这里要注意,静态方法使用泛型时需要重新定义泛型,因为它不能访问在类型定义额泛型。
5)通配泛型
通配泛型类型有三种,第一种形式?称为非受限通配,它等同于? extends Object;第二种形式? Extends T称为受限通配,表示T或T的一个未知子类型;第三种?super T称为下限通配,表示T或T的一个未知类型。
6)泛型消除与对泛型的限制
泛型是使用一种称为泛型消除的方法来实现的。编译器在编译代码时会通过泛型信息确认泛型类型是安全可用的,随后会消除它。这种方法可以使泛型代码兼容使用原始类型的遗留代码。
使用泛型类型有一些限制:
不能使用new E();
不能使用new E[]();
静态环境下不允许类的参数是泛型类型;
异常类不能是泛型的;