引:
由于数组所存在的定义时固定长度的特性,使得对于自动改变存储容量大小的需求无法实现,而这正是容器所具备的亮点。
JDK所提供的容器API位于java.util包内,容器API类图结构如下图所示:
上图分为两部分:左侧部分为单个值存放,右侧Map以键-值对存放。
Set接口:存放没有顺序且不可重复的对象
List接口:存放有顺序可以重复的对象
此处的重复代表两个对象之间相互Equals
Collection:
int size(); //元素个数
boolean isEmpty(); //是否为空
void clear(); //清空
boolean contains(Object element);
booleanadd(Object element);
booleanremove(Object element);
Iteratoriterator();
containsAll(Collection c)
addAll()
removeAll()
retainAll(Collection c);
Object[]toArray();
对象在调用remove、contains方法时需要比较对象是否相等,这会涉及到对象的equals方法和hashCode方法。为了提高比较的效率,有时对象被作为键值比较,此时的键值相当于索引,因此重写equals方法,同时也需要重写hashCode方法。
Interator:
hasNext()
next()
remove()
由于实现Collection的容器类具有多种不同的底层实现,比如ArrayList的底层是数组实现,LinkedList的底层为链表实现等,因此为了提供统一的遍历方法,每个容器类都实现了iterator()方法,以此达到遍历容器所有元素的效果
Set
Collection接口的子接口,实现类有HashSet和TreeSet
常用方法:
get(int index);
set(int index, Object element);
add(int index, Object element);
remove(int index);
indexOf(object o);
lastIndexOf(Object o);
List
由于List接口提供有序可重复的元素容器方法,针对此特点,结合数组的相关应用,可联想到最常用的算法:排序和查找。而Collections类专门针对List接口提供了一系列的静态方法,封装了这两大常用算法,方便我们的应用:
sort(List)
shuffle(List)
reverse(List)
fill(List,Ojbect)
copy(List dest,List src)
binarySearch(List,Object)
而排序时的比较大小,就需要类来实现Comparable接口,该接口只提供一个方法compareTo(T o),通过实现comparaTo方法从而确定该类对象的排序方式。
小结:
对容器类的学习,使得我们的知识不仅仅局限于数组的使用,数组的确有其优势,但也有不完善之处,而此处的学习也与我们之前接触过的数据结构部分的内容有一定联系,在合适的情况选择合适的数据类型,数据存储结构,更有利于提高我们的效率,应用因此也变得灵活。