Java集合类源码分析

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

Java集合框架

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);
}
});

推荐文章