容器(Collection)是什么?
容器(Collection)是容纳数据用的。Java的容器(Collection)可以装一组对象。既然是一组对象,那么他们就应该可以被遍历(traverse)。
可以被遍历的数据是可以被迭代的(Iterable)。可以被迭代的数据,就可以使用for循环进行迭代。
实现Iterable接口
可以被迭代的数据需要实现Iterable接口,而Iterable内部需要实现一个迭代器。下面这段程序,教你实现一个产生随机字符串的迭代器。第1遍理解它的时候建议你跟着我的视频一起将这段程序一行一行的敲出来,我会给你line-by-line解答。
public class RandomStringGenerator<T> implements Iterable<T> {
private final List<T> list;
public RandomStringGenerator(List<T> list) {
this.list = list;
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return true;
}
@Override
public T next() {
return list.get((int) (list.size() * Math.random()));
}
};
}
public static void main(String[] argv) {
var list = Arrays.asList("List", "Tree", "Array");
var gen = new RandomStringGenerator<String>(list);
for(var s: gen) {
System.out.println(s);
}
// var it = gen.iterator();
// for(int i = 0; i < 100; i++) {
// System.out.println(it.next());
// }
}
}
容器(Collection)接口
容器都是可以被迭代的。ArrayList、LinkedList、TreeSet、HashSet、PriorityQueue、Stack都是容器, 都可以被迭代,都可以使用for循环,直接遍历。
当然,结合不仅仅需要被迭代。比如我们会:
- 判断一个容器是不是空的isEmpty()方法
- 想知道容器的大小size()方法
- 想知道容器中有没有某个元素contains(object)。
- 将容器转化成数组toArray()方法 添加元素到容器add(E e)方法
- 从容器中移除一个元素remove(object) 方法
- 判断一个容器的元素是否在这个容器当中containsAll(Collection<? extends T> c)
- 从容器中移除一个容器的元素removeAll(Collection<?> c)
- 移除不在某个容器中的元素retainAll(Collection<?> c) 清空这个容器clear()
很多实现容器的数据结构。并不是直接实现Collection,而是再抽象出中间的接口。比如ArrayList的继承如下
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializ
public interface List<E> ext