Java最初版本只提供了很少一组类:Vector、Stack、Hashtable、BitSet与Enumeration接口,其中Enumeration接口提供了一种用于访问任意容器中各个元素的抽象机制
1.将集合的接口与实现分离:
例如队列,接口为Queue,如果需要一个循环数组队列就可以使用ArrayDeque类。如果需要一个链表队列,就直接使用LinkedList类
2.Collection接口:
Collection接口是集合类的基本接口,有两个基本的方法add和iterator
3.迭代器:
Iterator接口只包含4个方法:
public interface Iterator<E>{
boolean hasNext();
E next();//逐个访问集合中的每一个元素
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());}
}
编译器简单的将“for each”循环翻译为带有迭代器的循环
“for each”循环可以与任何实现了Iterable接口的对象一起工作,这个接口只有一个抽象方法
public interface Iterable<T> {
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
Collection接口扩展了Iterable接口,所以,对于标准类库中的任何集合都可以使用“for each”循环
在Java SE 8中,甚至不用写循环。可以调用forEachRemaining方法并提供一个lambda表达式。将对迭代器的每一个元素调用这个lambda表达式
iterator.forEachRemaining(element->...);
在Java中迭代器可以认为在两个元素之间。当调用next方法时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。可以将Iterator.next和InputStream.read看作为等效
如果在对元素进行操作时没有调用next方法就会抛出一个IllegalStateException异常
4.java.util.Collection<E> 1.2:
Iterator<E> iterator()
返回一个用于访问集合中每个元素的迭代器
int size()
返回当前存储在集合中的元素个数
boolean isEmpty()
判断集合中是否有元素
boolean contains(Object obj)
判断集合中是否存在obj
boolean containsAll(Collection<?> other)
判断集合中是否包含other集合中的全部元素
boolean add(Object element)
判断添加元素是否成功
boolean addAll(Collection<? extends E> other)
判断添加集合是否成功
boolean remove(Object obj)
判断集合中obj元素是否移除
boolean removeAll(Collection<?> other)
从集合中移除other中存在的所有元素
default boolean removeIf(Predicate<? super E> filter) 8
从这个集合删除filter返回true的所有元素
void clear()
清空集合
boolean retainAll(Collection<?> other)
从集合中删除与other集合中元素不同的元素
Object[] toArray()
返回这个集合的对象数组
<T> T[] toArray(T[] arrayToFill)
返回这个集合的对象数组。如果arrayToFill足够大,就将集合中的元素填入这个数组,其余部分为null;否则分配一个新数组与arrayToFill的成员类型相同,器长度等于集合的大小,并填充集合元素
5.List接口:
从图中可以看出List是个有序集合,可以采用两种方式访问元素:使用迭代器和一个整数索引。也可以称为有序访问和随机访问。
List本身提供了多个用于随机访问的方法,其实这种设计方式并不好,因为List后面分为两种有序集合:一种是数组一种是链表,相对于链表而言随机访问很慢,所以这个使用就需要使用迭代器访问。为了避免对链表完成随机访问操作,Java SE 1.4引入了一个标记接口RandomAccess。这个接口不含方法,不过可以用它来测试一个特定的集合是否支持高效的随机访问
if(c instanceof RandomAccess){
}else{}
6.ListIterator接口:
它是Iterator接口的子接口,它定义了一个方法用于在迭代器位置前面增加一个元素:
void add(E element);
7.Set接口:
该接口等同于Collection接口,不过其方法的行为有更加严谨的定义——add方法不允许增加重复的元素
8.SortedSet和SortedMap接口:
这两个接口会提供用于排序的比较器对象,这两个接口定义了可以得到集合子集视图的方法
9.NavigableSet和NavigableMap接口:
这是Java SE 6引入的接口,其中包含一些用于搜索和遍历所有序集和映射的方法
推荐一篇不错的文章:https://www.cnblogs.com/leeplogs/p/5891861.html