最近准备面试, 先来学习一下 Java 集合的相关源码. 首先对于一个知识点, 应该有一个框架的梳理. Java 集合具体来说应该分为 5 个部分 : List、Set、Map、迭代器 (Iterator、Enumeration)、工具类 ( Arrays、Collections); 而我们常说的 Java 集合, 根据其继承关系, 可以分为 2 个大类 : Collection 以及 Map :
Collection :
- List
- ArrayList
- LinkedList
- Vector - Set
- HashSet
- LinkedHashSet
- TreeSet
Map :
- HashMap
- LinkedHashMap - TreeMap
- ConcurrentHashMap
- Hashtable
Collection 集合
Collection 是一个接口 :
public interface Collection<E> extends Iterable<E>
接下来再继续查看 Iterable 接口 :
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
里面有一个 iterator() 方法 , 返回一个 Iterator :
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());
}
}
这也是一个接口, 只有四个方法, 前面三个都没有方法的实现, 在 Collection 的子类中有其实现. 比如 ArrayList 中 :
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount;
public boolean hasNext() {
return cursor != size;
}
@SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
}
public void remove() {
if (lastRet < 0)
throw new IllegalStateException();
checkForComodification();
try {
ArrayList.this.remove(lastRet);
cursor = lastRet;
lastRet = -1;
expectedModCount = modCount;
} catch (IndexOutOfBoundsException ex) {
throw new ConcurrentModificationException();
}
}
是以内部类的方式实现的, 所以我们遍历实现了 Collection 接口的类都可以使用 Iterator, 具体实现都是以内部类的方式实现的.
Collection 和数组的区别 : 数组的大小是固定的, 而 Collection 的长度是可以变化的, 数组中的元素类型都是同一类型, 而 Collection<Object> 中可以添加不同类型的元素.
List 集合
List 集合的特点是有序, 可以存储重复元素.
在 List 接口的源码中可以看到, 它不仅有 Iterator 迭代器接口, 而且有对应的实现 ListIterator 接口.
Set 集合
Set 集合的特点是不可以重复