zoukankan      html  css  js  c++  java
  • Java 基础

    Set 集合

    Set 集合通常不能记住元素的添加顺序。Set 集合不允许包含相同的元素。

    • HashSet 是 Set 接口的实现类,按照 Hash 算法存储集合中的元素。HashSet 不是同步的,如果多个线程同时访问一个 HashSet,则必须通过代码来保证其同步。集合元素值可以是 null。
    • LinkedHashSet 是一个 HashSet 的子类,也是根据元素的 hashcode 值来决定元素的存储位置,但它同时使用链表维护元素的次序,这样使得看起来是以插入顺序保存的。因为需要维护元素的插入顺序,因此性能略低于 HashSet 的性能。
    • TreeSet 是 SortedSet 接口的实现类,正如 SortedSet 名字所暗示的,TreeSet 可以确保集合元素处于排序状态。TreeSet 采用「红黑树」的数据结构来存储集合元素。TreeSet 支持两种排序方法:自然排序和定制排序。如果试图将一个对象添加到 TreeSet 时,该对象的类必须实现 Comparable 接口,否则,程序将会抛出 ClassCastException 异常。TreeSet 只能添加同一种类型的对象。
    • EnumSet 是专门为枚举类设计的集合类,EnumSet 的集合元素也是有序的,以枚举值在 Enum 类内的定义顺序决定集合元素的顺序。EnumSet 集合不允许加入 null 元素。

    Set 实现类的性能分析

    HashSet 和 TreeSet 是 Set 中两个典型的实现,HashSet 性能总是比 TreeSet 好,因为 TreeSet 需要额外的红黑树算法维护集合元素的次序。但需要保持排序的 Set 时,才应该使用 TreeSet,否则都应该使用 HashSet。

    HashSet 还有一个子类:LinkedHashSet。对于普通的插入、删除操作,LinkedHashSet 比 HashSet 要略微慢一点,这是由于维护链表所带来的开销造成的。但是由于有了链表,遍历 LinkedHashSet 会更快。

    EnumSet 是所有 Set 实现类中性能最好的。

    需要注意的是: Set 的三个实现类 HashSet TreeSet EnumSet 都是线程不安全的。通常可以通过 Collections 工具类的 synchronizedSortedSet 方法来包装 Set 集合。此操作最好在创建时进行,防止对 Set 集合意外的非同步访问。

    List 集合

    List 集合代表一个元素有序、可重复的集合。索引从0开始。

    • void add(int index, Object element) 将元素插入到 List 集合的 index 处
    • boolean addAll(int index, Collection c) 将集合 c 所包含的元素插入到 List 集合的 index 处
    • Object get(int index) 返回集合 index 索引处的元素
    • int indexOf(Object o) 返回对象 o 在 List 集合中第一次出现的位置索引
    • int lastIndexOf(Object o) 返回对象 o 在 List 集合最后一次出现的位置索引
    • Object remove(int index) 删除并返回 index 索引处的元素
    • Object set(int index, Object element) 将 index 索引处的元素替换为 element 对象,返回被替换的旧元素。这里的 index 不能超出已有的索引长度
    • LIst subList(int fromIndex, int toIndex) 返回从索引 fromIndex (包含) 到索引 toIndex (不包含)处所有的集合元素组成的子集合。果然,超出了索引,就会报错 java.lang.IndexOutOfBoundsException
    • void replaceAll(UnaryOperator operator) 根据 operator 指定的计算规则重新设置 List 集合的所有元素
    • void sort(Comparaotr c) 根据 Comparator 参数对 List 集合的元素排序

    各种线性表的性能分析

    List 就是一个线性表的接口,而 ArrayList、LinkedList 又是线性表的两种典型:基于数组的线性表和基于链的线性表。Queue 代表了队列,Deque 代表了双端队列(既可以作为队列使用,也可以作为栈使用)。

    LinkedList 集合不仅提供了 List 的功能,还提供了双端队列、栈的功能。

    数组以一块连续内存保存所有的数组元素,所以数组在随机访问时性能最好;内部以链表作为底层实现的集合在执行插入、删除操作时有较好的性能。总体来讲,ArrayList 性能要比 LinkedList 的性能要好,因此,大部分时候使用都应该考虑使用 ArrayList。

    Map 集合

  • 相关阅读:
    leetcode 268. Missing Number
    DBSCAN
    python二维数组初始化
    leetcode 661. Image Smoother
    leetcode 599. Minimum Index Sum of Two Lists
    Python中的sort() key含义
    leetcode 447. Number of Boomerangs
    leetcode 697. Degree of an Array
    滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(1月3日)
    北京Uber优步司机奖励政策(1月2日)
  • 原文地址:https://www.cnblogs.com/michael-xiang/p/10527428.html
Copyright © 2011-2022 走看看