集合
Java集合主要有两个接口派生而出:Collection和Map,他们都是集合框架的子接口,下面两天分别是Collection和Map的继承树。
集合的两大父接口
Collection
Collection集合体系下又主要包含Queue、List、Set三个接口。
可以看到Iterable是Collection的父接口,Iterable里有如下方法:
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
上面两个方法对应两种方式遍历集合。
其中Cusumer是一个函数式接口,表示遍历集合时进行的操作,可用使用lambda表达式来表示。
Iterator也是一个用于便利集合的接口,它有如下方法:
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());
}
可以看到在用Iterator遍历集合是不能删除元素,否则抛出异常。
里面还有一个forEachRemaining方法,又提供了一种遍历集合的方式。
List接口还有一个如下方法:
ListIterator<E> listIterator();
ListIterator可以双向遍历一个List,它包含如下方法:
boolean hasNext();
E next();
boolean hasPrevious();
E previous();
Map
Map接口的继承关系如下:
对各集合的简单总结
集合的基本使用很简单,以后还是主要集中在对各集合源码的分析。
-
HashSet判断两个元素相等的标准是两个对象通过equals()方法比较相等,并且两个对象的hashCode()方法返回也相等。
-
LinkedHash也根据元素的hashCode值来决定元素的存储位置,同时使用链表维持元素的顺序。
-
TreeSet可以确保元素处于有序状态。
-
Queue表示一个先进先出的队列,PriorityQueue是一个优先队列,不是按加入队列顺序保存元素的,而是按照元素大小保存的。
-
ArrayDeque是以数组来实现一个双端队列。
-
LinkedList既可以当作一个双端队列,又可以当作栈使用。
-
Properties类是Hashtable类的子类,它的key、value都是String类型。通常用来读写属性文件。
-
WeakHashMap中的key只保留对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其它强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap可能自动删除这些key所对应的key-value对。
-
IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,才认为两个key相等。对于普通的HashMap,只要key1与key2通过equals()方法比较返回true,且它们的hashCode值相等即可。
-
EnumMap是一个与枚举类一起使用的Map实现,所有的key都必须是一个枚举类的枚举值。