美文网首页
Java 容器基础

Java 容器基础

作者: Jk_zhuang | 来源:发表于2017-05-07 00:03 被阅读0次

    一、迭代器

    1. Iterator<E>:

    对 collection 进行迭代的迭代器。迭代器取代了 Java Collections Framework 中的 Enumeration。迭代器与枚举有两点不同:

    (1)迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素;
    (2)方法名称得到了改进。

    次迭代器为单向迭代。

    2. ListIterator<E>:

    实现了Iterator接口;

    系列表迭代器,允许程序员按任一方向遍历列表、迭代期间修改列表,并获得迭代器在列表中的当前位置。ListIterator 没有当前元素;它的光标位置 始终位于调用 previous() 所返回的元素和调用 next() 所返回的元素之间。长度为 n 的列表的迭代器有 n+1 个可能的指针位置;

    注意,remove() 和 set(Object) 方法不是 根据光标位置定义的;它们是根据对调用 next() 或 previous() 所返回的最后一个元素的操作定义的。

    此迭代器为双向迭代。

    二、List:

    有序,允许重复,允许null并且允许多个。

    1.AbstractList<E>:

    此类提供 List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作。对于连续的访问数据(如链表),应优先使用 AbstractSequentialList,而不是此类。

    2.AbstractSequentialList<E>:

    此类提供了 List 接口的骨干实现,从而最大限度地减少了实现受“连续访问”数据存储(如链接列表)支持的此接口所需的工作。对于随机访问数据(如数组),应该优先使用 AbstractList,而不是先使用此类。

    3.ArrayList<E>:

    创建的时候若没有指定初始容量,则默认为10;之后添加元素的时候等到容量不足的时候再扩充为原来的1.5倍(int newCapacity = oldCapacity + (oldCapacity >> 1);)扩容时,程序再开辟一个新的连续空间后,把旧空间里的数据复制过去。

    4.LinkedList<E>:

    (1)链接列表用作堆栈、队列或双端队列;

    (2)此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 ;

    5.AttributeList:

    (1)表示 MBean 属性值的列表。用于在 AttributeList 中插入 Attribute 对象的方法应重写超类 ArrayList 中的相应方法。为了确保 AttributeList 中所包含的对象只是 Attribute 对象,这是必需的。这可避免在检索 AttributeList 中的元素时出现异常。

    (2)继承自.ArrayList<E>,除了元素上的差异,其它的实现与负累相同;

    6.ArrayQueue<T>:

    数组队列

    7.Vector:

    Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

    其它的实现与ArrayList差别不大,只是Vector是线程安全的,所以需要付出一定的代价,因此访问比较慢。

    8.Stack:

    继承自Vector;

    Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。
    首次创建堆栈时,它不包含项。
    Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类。例如:
    Deque<Integer> stack = new ArrayDeque<Integer>();

    9.RoleList:

    继承自ArrayList;

    RoleList 表示角色(Role 对象)的列表。它在创建关系和试图在关系中设置几个角色(通过 'setRoles()'方法)时用作参数。它将作为 RoleResult 的一部分返回,以提供成功检索的角色。

    三、Queue:

    在处理元素前用于保存元素的 collection。除了基本的 Collection 操作外,队列还提供其他的插入、提取和检查操作。每个方法都存在两种形式:一种抛出异常(操作失败时),另一种返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是用于专门为有容量限制的 Queue 实现设计的;在大多数实现中,插入操作不会失败。

    抛出异常 返回特殊值
    插入 add(e) offer(e)
    移除 remove() poll()
    检查 element() peek()

    1.LinkedList<>:同上LinkedList<>。

    2.ArrayBlockingQueue<E>:

    一个由数组支持的有界阻塞队列;

    容量固定,试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。

    此类支持对等待的生产者线程和使用者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。

    3.PriorityQueue<E>:

    一个基于优先级堆的无界优先级队列。优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的 Comparator 进行排序,具体取决于所使用的构造方法。优先级队列不允许使用 null 元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象(这样做可能导致 ClassCastException)。

    当容量不够时自动扩容,扩容的规则为当旧的容量小于64时,扩容为旧容量的两倍加2,否则扩容为旧容量的1.5倍;

    4.PriorityBlockingQueue<>:

    阻塞的PriorityQueue<E>。

    5.ArrayDeque<E>:

    Deque 接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。

    6.ConcurrentLinkedQueue<E>:

    一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头部获得元素。当多个线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许使用 null 元素。
    此实现采用了有效的“无等待 (wait-free)”算法,该算法基于 Maged M. Michael 和 Michael L. Scott 合著的 Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms 中描述的算法。
    需要小心的是,与大多数 collection 不同,size 方法不是 一个固定时间操作。由于这些队列的异步特性,确定当前元素的数量需要遍历这些元素。

    四、Set:不重复,最多一个null,所有构造方法必须创建一个不包含重复元素的 set

    1.HashSet<>:

    此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。允许null 。

    2.TreeSet:

    基于 TreeMap 的 NavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

    3.LinkedHashSet:

    具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会被重新插入到 set s 中。)

    4.ConcurrentSkipListSet:

    一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的 Comparator 进行排序,具体取决于使用的构造方法。
    此实现为 contains、add、remove 操作及其变体提供预期平均 log(n) 时间开销。多个线程可以安全地并发执行插入、移除和访问操作。迭代器是弱一致 的,返回的元素将反映迭代器创建时或创建后某一时刻的 set 状态。它们不 抛出 ConcurrentModificationException,可以并发处理其他操作。升序排序视图及其迭代器比降序排序视图及其迭代器更快。

    五、Map:

    将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

    1.HashMap<>:

    基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。(除了非同步和允许使用 null 之外,HashMap 类与 Hashtable 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

    容量 是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行 rehash 操作(即重建内部数据结构),从而哈希表将具有大约两倍的桶数。默认加载因子 (.75)

    2.TreeMap<>:

    基于红黑树(Red-Black tree)的 NavigableMap 实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序,具体取决于使用的构造方法。

    3.WeakHashMap<>:

    以弱键 实现的基于哈希表的 Map。在 WeakHashMap 中,当某个键不再正常使用时,将自动移除其条目。更精确地说,对于一个给定的键,其映射的存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。丢弃某个键时,其条目从映射中有效地移除,因此,该类的行为与其他的 Map 实现有所不同。
    null 值和 null 键都被支持。该类具有与 HashMap 类相似的性能特征,并具有相同的效能参数初始容量 和加载因子。

    4.LinkedHashMap:

    Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现与 HashMap 的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序通常就是将键插入到映射中的顺序(插入顺序)。注意,如果在映射中重新插入 键,则插入顺序不受影响。(如果在调用 m.put(k, v) 前 m.containsKey(k) 返回了 true,则调用时会将键 k 重新插入到映射 m 中。)

    相关文章

      网友评论

          本文标题:Java 容器基础

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