Fork me on GitHub
返回顶部
跳到底部

集合

Java集合主要有两个接口派生而出:Collection和Map,他们都是集合框架的子接口,下面两天分别是Collection和Map的继承树。

集合的两大父接口

Collection

Collection集合体系下又主要包含Queue、List、Set三个接口。

集合.PNG

可以看到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接口的继承关系如下:

集合1.PNG

对各集合的简单总结

集合的基本使用很简单,以后还是主要集中在对各集合源码的分析。

  • 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都必须是一个枚举类的枚举值。

posted @ 2018-05-15 08:40  sqmax  阅读(137)  评论(0编辑  收藏  举报