Java集合框架

作者: Tycc | 来源:发表于2018-02-28 20:43 被阅读1次

    Java集合框架(Java Collections Framework)是存放大量对象的容器,被广泛使用。Java里包含这四种集合类:Vector, Stack, Hashtable, Array
    集合中存放的是对象的引用。

    Java1.2开始提供集合框架,这包括:

    • 接口
      所有集合类都得实现java.util.Collection。这个接口的方法(文档)包括:

      1. 基本操作:
        int size(), boolean isEmpty(), boolean contains(Object element), boolean add(E element), boolean remove(Object element), and Iterator<E> iterator()
      2. 对整个集合类的操作:
        boolean containsAll(Collection<?> c), boolean addAll(Collection<? extends E> c), boolean removeAll(Collection<?> c), boolean retainAll(Collection<?> c), and void clear()
      3. Array操作:
        Object[] toArray() and <T> T[] toArray(T[] a)

      java.util.List, java.util.Set, java.util.Queuejava.util.Map接口也是集合框架的一部分。(Map没用继承自Collection接口)

    • 实现类
      重要的集合类有ArrayList, LinkedList,HashMap, TreeMap, HashSet, TreeSet。(java.util包)
      线程安全的类有 CopyOnWriteArrayList, ConcurrentHashMap, CopyOnWriteArraySet。(java.util.concurrent包)

    • 算法
      如查询、排序、打乱

    Iterator接口

    取代了Enumeration,可以简单地理解为遍历,提供了一个标准化遍历各类容器里面的所有对象的设计模式。方法:

    • Object next():返回迭代器刚越过的元素的引用,返回值是 Object
    • boolean hasNext():判断容器内是否还有可供访问的元素
    • void remove():删除迭代器刚越过的元素
    Iterator it = collection.iterator(); // 获得一个迭代起点
    while(it.hasNext()) {
      Object obj = it.next(); // 得到下一个元素
    }
    

    ListIterator是Iterator的子接口,区别在于,只能用于List及其子类型;有add方法;可以实现逆向(顺序向前)遍历;可以定位当前索引的位置;可以实现对象的修改。(参考:JAVA中ListIterator和Iterator详解与辨析

    List接口

    有序,允许相同元素,有索引
    除了具有Collection接口必备的iterator()方法外,List还有一个listIterator()方法,返回一个 ListIterator接口。
    实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。

    • ArrayList类
      类似数组的形式进行存储,随机访问速度快。
      线程不同步。
      内部的元素直接通过get与set方法进行访问。
      当ArrayList中的元素超过它的初始大小时,ArrayList只增加50%的大小。

    • LinkedList类
      双链表,在添加和删除元素时具有比ArrayList更好的性能,但在get与set方面弱于ArrayList。
      线程不同步。

    • Vector类
      和ArrayList类似,但线程同步
      当Vector中的元素超过它的初始大小时,Vector会将它的容量翻倍

    • Stack 类
      Stack继承自Vector,实现一个后进先出的堆栈。
      基本的push和pop 方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。

    Set接口

    无序
    不包含重复元素
    取出只能是Iterator

    • HashSet
      一个按着Hash算法来存储集合中的元素,其元素值可以是NULL。它不能保证元素的排列顺序。

    • LinkedHashList
      HashSet的子类

    • TreeSet
      红黑树,线程不安全
      提供有序的 Set 集合( 实现SortedSet接口),储存的类需要实现需要实现Comparable接口

      SortedSet<Item> sortByDescription = new TreeSet<Item>(new
             Comparator<Item>()
             {  
                public int compare(Item a, Item b)
                {  
                   String descrA = a.getDescription();
                   String descrB = b.getDescription();
                   return descrA.compareTo(descrB);
                }
             });
    

    Queue接口

    无null
    方法:add,addall, remove, clearelement

    • PriorityQueue优先队列
      非线程安全
      PriorityQueue是基于优先堆的一个无界队列,这个优先队列中的元素可以默认自然排序或者通过提供的Comparator比较器在队列实例化的时排序。

    Map接口

    没有继承Collection接口
    提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个 value。
    put(Object key, Object value) 将指定值与指定键相关联
    entrySet()返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
    keySet()返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
    values()返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)

    • Hashtable类
      Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空的对象都可作为key或者value。
      添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。
      Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。
      由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。
      Hashtable是同步的。

    • HashMap类
      HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。
      但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap 的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。

    • TreeMap类
      通关红黑树实现, 继承 自AbstractMap(即一个key-value集合)。 非线程安全 。
      实现了NavigableMap接口,意味着它支持一系列的导航方法。比如返回有序的key集合。
      实现了Cloneable接口,意味着它能被克隆。
      实现了java.io.Serializable接口,意味着它支持序列化。
      基本操作 containsKey、get、put 和 remove 的时间复杂度是 log(n)
      按自然顺序或自定义顺序遍历键,TreeMap比HashMap要好;在Map 中插入、删除和定位元素,HashMap 是最好的选择。

    • WeakHashMap类
      WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。

    集合对象排序接口Comparator

    实现此接口的类可以进行排序,需要实现compare方法。
    基本数据类型实现了这个接口,调用Collections.sort(list)进行排序;
    如果Comparator只用一次,可使用匿名类。

    参考:

    相关文章

      网友评论

        本文标题:Java集合框架

        本文链接:https://www.haomeiwen.com/subject/qwpixftx.html