原创

【每天十分钟JAVA快速入门】(十四)集合接口

集合接口

在平时的设计及开发工作中,选择合适的数据结构至关重要,直接影响到系统数据的存取及性能。Java集合框架为我们提供了一套很完善的工具,我们可以很方便地在处理相应的数据结构时使用它们。Java集合类库是将接口与实现分离的,集合类有两个基本接口Collection和Map,下面我们先来了解一下。

Collection接口
集合类的第一个基本接口是Collection接口。集合的最基本功能就是存储和读取数据,我来来看一下Collection接口中定义的这两个基本方法:
public interface Collection<E>{
boolean add(E element);
Iterator<E> iterator();
...
}
add方法就不多说了,就是向集合中添加元素,下面我们来介绍一下iterator方法。

迭代器(Iterator)
上面的iterator方法返回一个实现了Iterator接口的对象。
public interface Iterator<E> {
E next();
boolean hasNext();
void remove();
default void forEachRemaining(Consumer<? super E> action);
}
如果一个集合形如:
ABCD
hasNext方法用来判断迭代器对象是否有剩余的对象可供访问,我们将迭代器用一个竖线表示:
|ABCD
如果竖线右边还有剩余的元素,则返回true。
next方法逐个访问集合中的每一个元素,在调用之前需要先调用hasNext方法判断是否有可供访问的元素,否则在集合的末尾,会抛出NoSuchElementException异常。每调用一次next方法,迭代器的位置就会向后移动,直到移动至末尾,例如:
A|BCD
AB|CD
...
ABCD|
下面是使用迭代器的例子:
Collection<String> collection = ...;
Iterator it = collection.iterator();
while(it.hasNext()){
System.out.println(it.next());
...
}
看起来for each循环可以做一样的事情,而且更方便简洁。事实上确实如此,在大部分情况下个人推荐使用for each循环来代替迭代器,但是迭代器还有着自身的优势,比如需要在遍历集合的同时删除集合中的一些特定的元素就可以使用迭代器来完成,例如下面的例子在遍历的同时将元素2从集合中删除,可以试一下使用for each循环会发生什么。
ArrayList<Integer> a = new ArrayList<>(Arrays.asList(1,2,3));
Iterator<Integer> it = a.iterator();
while (it.hasNext()){
Integer i = it.next();
if(i == 2){
it.remove();
}
}
需要注意的是remove方法必须跟着next方法之后执行,否则会抛出java.lang.IllegalStateException。


Queue接口
Queue接口可以在集合的尾部添加元素,在头部删除元素 ,并且可以査找元素的个数 。如果需要按照“ 先进先出” 的规则检索对象时就应该使用Queue。

List接口
List接口继承Collection,它定义了一个有序的集合,这里的有序指的可以保证元素按照add的顺序存储,可以使用迭代器访问(顺序访问),也可以使用整数索引来访问(可按任意顺序访问即随机访问)。

Set接口
List接口继承Collection,Set不允许有重复的元素,使用add方法添加重复的元素会返回false。

Map接口
集合类的另一个基本接口是Map接口,定义了基于键值对的数据结构,使用put方法添加元素,key必须是唯一的,put相同的key值,后面的值会覆盖前面的值:
V put(K key, V value)
使用get方法读取元素:
V get(K key)
正文到此结束