JAVA集合接口及类

  • 各接口及类关系图

  • Iterable
    • 所有集合的初始接口,实现该接口可进行foreach操作,只有一个iterator()方法,并返回iterator类型;
    • Iterable在java.lang下,Iterator在java.util下,Iterator主要包括hasNext(), next(), remove();
    • 所有实现了Iterable就可以操作迭代器iterator, 但能使用迭代器iterator就未必实现了Iterable接口,如数组?
    • 为什么需要Iterable? 因为Iterator中的next(), hasNext()依赖于当前迭代器中迭代的位置(指针),如果Collection直接实现Iterator会使迭代位置不可知,需要增加reset重置当前迭代,但也只能存在一个当前迭代;而Iterable每次可从头开始计数,而且多个迭代互不影响。
  • Collection
    • 一个基本集合接口,包含一组Object元素;
    • 在java.util下,同时Collections是一个工具类,包含对集合各类操作的静态方法,比如sort;
    • Collection下有三个子接口:List, Set, Queue
  • List
    • 有序(保持插入数据时的顺序)、可重复的集合;
    • 子类ArrayList是基于数组实现的,但size动态可变化的;
    • 子类LinkedList实现 List<E>, Deque<E>, Cloneable, Serializable,双向链表接口;可作为双向Queue使用,也可以当做Stack使用;
    • ArrayList查询效率高于LinkedList, 因为访问LinkedList中的元素,需要每次从头指针开始移动,而ArrayList可直接通过数组下标的方式获取;但如果LinkedList通过Iterator, 则效率与ArrayList不会相差多少,因为Iterator方式遍历会缓存前后节点;
    • ArrayList插入和删除的效率会比LinkedList低,因为ArrayList每次插入或删除元素时,该元素的后续下标位置也要做相应的调整。
    • JDK1.2以后,Vector也是通过List接口实现的,Vector是线程安全的,ArrayList是非线程安全;
    • Stack是Vector子类,其主要特征是先进后出(FILO, First In Last Out)。
  • Set
    • Set集合里的元素没有顺序,但不能包含重复元素;
    • HashSet使用HASH算法存储元素,所以存储和查找效率较高,比如查找时只要根据这个元素的hashcode就可找到其存储的位置。
    • HashSet判断元素相等(去重)是根据equals判断两个元素的hashcode值。
    • LinkedHashSet是HashSet的子类,唯一区别是,多一个链表结构维护其插入元素的顺序。
    • TreeSet与HashSet都继承于AbstractSet, 但TreeSet使元素保持某种排序状态,所以TreeSet继承与SortedSet。
  • Map
    • 当把HashMap中的value都看成null时,可视为Set,其key的存储形式与Set一致;
    • TreeMap维护key以某种排序方式;
    • WeakHashMap在其Key对象被GC回收时,其key-value也自动销毁,因此称其key为弱引用;但HashMap中的Key为强引用,只要该HashMap不被回收,其Key所引用的对象也不会被回收。
    • IdentityHashMap中,只有key1==key2时,才认为这两个key相等,而HashMap是根据equals判断;

猜你喜欢

转载自www.cnblogs.com/stpan/p/9485039.html