• 集合框架总结-set


    Set集合:无序,不允许重复

    扩展自Collection接口

    public interface Set<E> extends Collection<E>

    1、允许使用null元素 2、这里没有什么新方法,只对 add()、equals() 和 hashCode() 方法添加了限制 3、HashSet和TreeSet是Set的实现 Set—>hashSet --> linkedHashSet SortedSet —> TreeSet

    HashSet

    HashSet类直接实现了Set接口, 其底层采用的是HashMap去实现的,将需要存储的数据作为map的key值,以常量PRESENT作为value值。

    1. private transient HashMap<E, Object> map;
    2. private static final Object PRESENT=new Object();

    --HashSet采用HashCode算法来存取集合中的元素,因此具有比较好的读取和查找性能

    --向HashSet中添加元素时首先执行的是对象的hashcode值比较,如果两个对象的hashcode值相等时才会继续调用equals方法;如果两个对象的hashcode值不相等则不会调用equals方法初始化后台容量;

    潜规则:不是Java的语法强制要求** 要求当两个对象的equals为true时,hashCode值必须相等**

    生成一个HashSet的话,系统只提供key的访问; 如果有两个Key重复,那么会覆盖之前的;

    LinkedHashSet

    1. public class LinkedHashSet<E>
    2. extends HashSet<E>
    3. implements Set<E>, Cloneable, Serializable

    LinkedHashSet是HashSet的一个子类,LinkedHashSet也根据HashCode的值来决定元素的存储位置,但同时它还用一个链表来维护元素的插入顺序,插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素

    采用双向链表记录添加元素的顺序

    1. LinkedHashMap类中的节点定义
    2. static class Entry<K,V> extends HashMap.Node<K,V> {
    3. Entry<K,V> before, after;
    4. Entry(int hash, K key, V value, Node<K,V> next) {
    5. super(hash, key, value, next);
    6. }
    7. }

    TreeSet

    查看jdk源码发现底层是用TreeMap实现的,本质上是一个红黑树原理。正因为它是排序了的,所以相对HashSet来说,TreeSet提供了一些额外的按排序位置访问元素的方法,例如first(), last(), lower(), higher(), subSet(), headSet(), tailSet()

    public class TreeSet extends AbstractSet implements NavigableSet, Cloneable, Serializable

    TreeSet的排序分两种类型,一种是自然排序,另一种是定制排序。

    几种Set的比较

    HashSet:不保证元素的添加顺序,底层采用哈希表算法,查询效率高。判断两个元素是否相等equals方法返回为true要求hashCode值必须相等。即要求存入HashSet中的元素要覆盖equals方法和hashCode方法

    LinkedHashSetLinkedHashSet是HashSet的子类,底层采用了哈希表算法以及链表算法,既保证了元素的添加顺序,也保证了查询效率。但是整体性能要低于HashSet

    TreeSet不保证元素的添加顺序,但是会对集合中的元素进行排序。底层采用红-黑树算法,树结构比较适合查询,但是添加的效率较低

    各种Set集合性能分析

    HashSet和TreeSet是Set集合中用得最多的集合。HashSet总是比TreeSet集合性能好,因为HashSet不需要额维护元素的顺序。

    LinkedHashSet需要用额外的链表维护元素的插入顺序,因此在插入时性能比HashSet低,但在迭代访问(遍历)时性能更高。因为插入的时候即要计算hashCode又要维护链表,而遍历的时候只需要按链表来访问元素。

    EnumSet元素是所有Set元素中性能最好的,但是它只能保存枚举类型的元素。

    线程安全化

    ArrayList和LinkedList线程不安全,针对线程安全的需求一般也不建议使用Vector。

    List list=Collections.synchronizedList(new ArrayList<>());

    具体实现是在原来数据操作的基础上添加了一个全局锁

  • 相关阅读:
    聊一聊TypeScript的相关知识点
    武汉CMMI能力成熟度评估认证
    【工具使用-VScode】VScode如何设置空格和tab键显示
    java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码
    传统游戏难产 育碧瞄向Web3
    [附源码]SSM计算机毕业设计农贸产品交易系统JAVA
    32位增强型低功耗Cortex-M3单片机CH32F203C8T6
    【前端】Vue2 脚手架模块化开发 -快速入门
    MYSQL-GAP&插入意向锁 死锁记录
    开启可视化金融时代!菊风联合助推山东农信视频银行项目
  • 原文地址:https://blog.csdn.net/weixin_42383952/article/details/126733814