Collection
List Set
ArrayList
LinkedList
Set---> Map
Set本质上是Map的Key部分。Value--存的是一个常量。
2 迭代器
什么是迭代器?
Iterable:可迭代的,可遍历的,也就是说实现了Iterable接口的类所产生的对象是可以被迭代的,也就是说这个对象是可以被遍历的。
循环遍历。
Iterable中的重要方法:
Iterator<T> iterator()
Iterable接口中有一个方法叫做iterator(),该方法返回值类型是Iterator<T>。
也就是说,iterator方法返回一个对象。返回的对象的类型是Iterator类型的
Iterator是一个接口,所以返回的必须是Iterator的实现类的对象。这就是多态。
父类型的引用指向子类型的对象。Iterator iter = iterator();
Iterator iter = new IteratorImpl();
研究Iterable接口,本质上就是要研究Iterator<E>接口:
boolean hasNext():意味着元素还有没有下一个,如果有就返回true,没有就返回false
E next() :取出下一个元素
因为Iterator也是接口,我们要能够使用它,就必须要有实现类。只有在实现类中才有意义。
Iterator真正被用到的地方是在哪里?也就是说Iterator接口是怎样被使用的?
其实它真正被用到的地方是在Iterable接口中。只要实现了Iterable接口的类都要实现Iterator接口中的方法。
Collection的实现类都实现了Iterable接口,因为Collection本身就是继承了Iterable接口。
也就是说:集合的实现类所产生的对象都是可以被迭代的,但是Map不是。因为Map不是集合。集合才可以被迭代,Map不能被迭代。
问,Map完全不能被迭代吗?可以迭代Key部分。Key部分就是Set集合。所以Key是可以被迭代的。
2.2 怎么实现迭代器
迭代器只能在集合中使用,集合是一种数据结构。常用的包括List和Set。
比如,对于一个List来讲,实现类有ArrayList、LinkedList等等。
ArrayList要实现迭代器的迭代功能该怎么做?
public Iterator<E> iterator() {
return new Itr();
}
这个是Iterable接口中的方法,因为ArrayList实现了List接口,List接口继承自Collection
Collection继承自Iterable
所以:ArrayList一定要实现Iterable接口中所有的方法。
Iterable接口中有Iterator接口,所以ArrayList还要实现Iterator接口。
//ArrayList中Iterator的具体实现:privateclassItrimplementsIterator<E>{int cursor;// index of next element to returnint lastRet =-1;// index of last element returned; -1 if no suchint expectedModCount = modCount;publicbooleanhasNext(){return cursor != size;}// 如果cursor == size,说明遍历到最后一个元素,没有下一个元素了@SuppressWarnings("unchecked")public E next(){checkForComodification();int i = cursor;if(i >= size)thrownewNoSuchElementException();
Object[] elementData = ArrayList.this.elementData;if(i >= elementData.length)thrownewConcurrentModificationException();
cursor = i +1;return(E) elementData[lastRet = i];}publicvoidremove(){if(lastRet <0)thrownewIllegalStateException();checkForComodification();try{
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet =-1;
expectedModCount = modCount;}catch(IndexOutOfBoundsException ex){thrownewConcurrentModificationException();}}@Override@SuppressWarnings("unchecked")publicvoidforEachRemaining(Consumer<?super E> consumer){
Objects.requireNonNull(consumer);finalint size = ArrayList.this.size;int i = cursor;if(i >= size){return;}final Object[] elementData = ArrayList.this.elementData;if(i >= elementData.length){thrownewConcurrentModificationException();}while(i != size && modCount == expectedModCount){
consumer.accept((E) elementData[i++]);}// update once at end of iteration to reduce heap write traffic
cursor = i;
lastRet = i -1;checkForComodification();}finalvoidcheckForComodification(){if(modCount != expectedModCount)thrownewConcurrentModificationException();}}