最近参见一个滴滴的面试发现自己对Java的集合类框架,只是了解了一些皮毛,一些内部的原理还是很模糊的,还是要自己一点一点的分析源码(jdk1.8)比较扎实。特此参考菜鸟教程上的一张集合框架图,一层一层的做一下分析。

1.Iterator
接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| public interface Iterator<E> { /** * Returns {@code true} if the iteration has more elements * 如果这个迭代器含有更多的元素 */ boolean hasNext();
/** * Returns the next element in the iteration. * 返回这个迭代器的下一个元素 */ E next();
/** * 删除指针所指向的元素 */ default void remove() { throw new UnsupportedOperationException("remove"); }
/** * 将Iterator中迭代剩余的元素传递给一个函数 * @since 1.8 */ default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
|
2.Iteratable
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| public interface Iterable<T> { /** * Java容器中,所有的Collection子类会实现Iteratable接口以实现foreach功能,Iteratable接口的实现又依赖于实现了Iterator的内部类( * 参照LinkedList中listIterator()和descendingIterator()的JDK源码)。有的容器类会有多个实现Iterator接口的内部类,通过返回不同的迭代器实现不同的迭代方式。 */ Iterator<T> iterator();
/** * java8提供的循环的新方式 * @since 1.8 */ default void forEach(Consumer<? super T> action) { Objects.requireNonNull(action); for (T t : this) { action.accept(t); } }
/** * * @since 1.8 */ default Spliterator<T> spliterator() { return Spliterators.spliteratorUnknownSize(iterator(), 0); } }
|
1 2 3 4 5 6 7 8 9 10
| String[] a = { "17", "52", "33", "412", "59", "62", "71" }; List<String> list = Arrays.asList(a); //这个还是用的java8提供的新函数,但是没有用lambda表达式 list.forEach(new Consumer<String>() { @Override public void accept(String t) { // TODO Auto-generated method stub System.out.println(t); } });
|