一、说明
容器类是Java以类库的形式供用户开发程序时可直接使用的各种数据集结构。所谓数据结构,就是以某种方式将数据组织在一起,并储存在计算机中。数据结构不仅可以存储数据,还支持访问和处理数据的操作。在面向对象的思想中,一种数据结构被认为是一个容器。数组是一种简单的数据结构,除数组外Java还以类库的形式提供了许多其他数据结构。这些数据结构通常称为容器类或称集合类。
二、Java容器框架
Java容器框架结构由两个接口树构成(Collection和Map),Collection接口定义了所有容器的基本操作,如添加、删除、遍历等。它的子接口Set、List等则提供了更加特殊的功能,其中Set的对象用于存储一组不重复的元素集合,而List的对象用于存储一个由元素构成的线性表。第二可树根节点为Map接口,它保持了“键”到“值”的映射,可以通过键来实现对值的快速访问。
三、Collection接口
- Collection接口
Collection接口通常不能直接使用,但该接口提供了添加元素、删除元素、管理数据的方法。由于Set和List接口都继承了Collection接口,因此这些方法对集合Set与列表List是通用的。下面给出Collection接口的常用方法,其中的方法默认为public abstract。
四、列表接口 List
1.列表接口List
列表接口List是Collection子接口,它是一种包含有序元素的线性表,其中的元素必须按顺序存放,也可以重复,也可以是空null。元素之间的顺序关系可以由添加到列表的先后来决定,也可以由元素值的大小决定。
List接口使用下标来访问元素,下标范围0~size()-1。方法默认为public abstract,其常用方法如下:实现List接口的类主要有两个(两个都是线性表):LinkedList链表类和ArrayList数组列表类。
1
2List l=new LinkedList();
List l=new ArrayList();(1)LinkedList链表类:
采用链表结构保存对象,使用循环双链表实现List。这种结构向链表中任意位置插入、删除、元素时不需要移动其他元素,链表的大小是可以动态增大或减小的,但不具有随机存取特性。
LinkedList类构造方法与常用方法:
(2)ArrayList数组列表类:
使用一维数组实现List,该类实现的是可变的数组,允许所有元素,包括null。具有随机存取特性,插入和删除时需要移动其他元素,当元素很多时,插入和删除操作速度较慢。在向ArrayList中添加元素时,其容量会自动增大,但不可以自动缩小,但可以使用trimToSize()方法将数组的容量减小到数组列表的大小。
ArrayList类构造方法与常用方法:
(3)选用这两种线性表的原则:
若是通过下标随机访问元素,但除了在末尾处之外,不在其他位置插入或删除元素,则应该选择ArrayList类,但若需要在线性表的任意位置上进行插入或者删除操作,则应该选择LinkedList类。2.迭代器
Java提供迭代器功能,迭代器功能由可迭代接口Iterable和迭代器接口Iterator、ListIterator实现的。迭代器是一种允许对容器中元素进行遍历并有选择地删除元素的对象。
由于Collection接口声明继承Iterable接口,因此每个实现Collection接口的容器对象都可以调用iterator()方法返回一个迭代器。
Iterator接口所定义的常用方法:1
2
3
4
5
6
7
8
9List c=new ArrayList();
c.add();
.........
Iterator it=c.iterator(); //c是重写了iterator()方法的容器所实现的类的对象,即List、ArrayList
while(it.hasNext()){ //判断是否仍有元素未被迭代
Object o=it.next(); //取得下一个未被迭代的元素
.................... // 对元素进行操作
}对于容器中元素的遍历次序,接口Iterator支持对List对象从前向后的遍历,但对于其子接口ListIterator支持对List对象的双向遍历。
ListIterator接口定义的常用方法:五、集合接口 Set
Set是一个不含重复元素的集合接口,它继承来自Collection接口,并没有声明其他方法,它的方法都是从Collection接口继承来的。Set集合中的对象不按特定的方式排序,只是简单地把对象加入集合中即可,但加入的对象一定不能重复。集合中元素的顺序与元素加入集合的顺序无关。
- 1.哈希集合 HashSet
1 | HashSet<T> hs=new HashSet<T>(); |
哈希集合对所包含元素的访问并不是像线性表一样使用下标,而是根据哈希码来存取集合中的元素。由于用了哈希码来确定元素在集合中的储存位置(内存地址),所以就可以根据哈希码快速的查找集合中的元素。HashSet不保证迭代顺序,且允许元素值为null。
在比较两个加入HashSet中的元素是否相等时,会先比较哈希码方法hashCode()的返回值是否相同,若相同,则再使用equals()方法比较器存储位置(内存地址) 是否相同。之所以要在比较完哈希码后还要用equals()比较,是因为对不同元素所计算出的哈希码可能相同。
HashSet常用的构造方法及常用方法:
注:
(1)说明:输出哈希集合元素时并不一定是按元素的存储顺序输出,因为哈希集合中的元素是没有特定顺序的,若一定要让元素有序输出,则需要使用LinkedHashSet类。
(2)哈希码:哈希集合是在元素的存储位置和元素的值k之间建立一个特定的对应关系f,使每个元素与一个唯一的存储位置相对应。因此在查找时,只需要根据k的值,计算f(k)即可。如果此元素在集合中,则必定在存储位置f(k)上,因此不需要与集合中的其他元素进行比较就可以得到所查元素。称这个对应关系f为哈希哈数,这种对应关系所建立的表为哈希表或散列表。
- 2.树集合 TreeSet
1 | TreeSet<T> tr=new TreeSet<T>(); |
树集合TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口。TreeSet的工作原理与HashSet相似,但TreeSet增加了一个额外的步骤,以保证处于集合中的元素总是有序的。所以,当排序很重要时,选择TreeSet,否则就选择HashSet。
TreeSet构造方法及常用方法:
六、映射接口 Map
Map是另一种存储数据结构的对象。Map中的元素都是以键—值对的方法是出现的。键Key决定元素在Map中的存储位置,值Value即元素的具体值。Map中的每个键都是唯一的,且每个键最多只能映射到一个值。
Map是接口,所以默认的方法为public abstract。下面是Map<K,V>常用的方法。
1.HashMap
HashMap类是基于哈希表的Map接口实现,所以HashMap通过哈希码对其内部的映射关系进行快速查找,因此对于添加和删除效率较高,并且允许使用null值和null键,但必须保证键值的唯一性。
HashMap常用的构造方法:HashMap<K,V>:2.TreeMap
TreeMap中的映射关系存在一定的顺序,如果希望Map映射中的元素存在一定的顺序,就是用TreeMap。但正是因为有顺序,所以不允许键对象是null。
TreeMap构造方法及常用的方法: TreeMap<K,V>: