博客
关于我
java中set集合的使用方法
阅读量:534 次
发布时间:2019-03-09

本文共 2714 字,大约阅读时间需要 9 分钟。

HashSet详解:Java集合中的无序非重复集合

对于Java集合中的核心数据结构HashSet,它不仅量身定制来处理无重复元素的需求,还支持其他重要的特点。本节我们将深入探讨HashSet及其在实际开发中的应用场景。

HashSet 的核心特征

  • 不允许重复元素

    HashSet作为一种基于哈希表实现的集合类,具备天生的去重特性。每当尝试将元素添加到集合中时,如果元素已经存在,系统会自动忽略重复的插入操作。这种设计理念使得HashSet成为处理无重复数据的首选工具。

  • 无序存储

    相较于List这种有序集合,HashSet并不关注元素的插入顺序。虽然现代HashSet的实现通常会维护一种基于哈希值的内部顺序,但这并不会影响其核心功能,即元素访问和移除的定位速度。

  • 允许包含null值

    在大多数集合实现中,null值会导致严重的问题。然而,HashSet特别地允许集合中同时存在多个null值,只能保证仅有一个null元素被存储。这一特性在某些应用场景下能够提供显著的灵活性。


  • HashSet 的典型使用场景

    HashSet用于去重操作,是其中最为常见的应用之一。以下是一个典型的例子:

    示例:提取唯一的用户组ID

    List
    resourceList = employeeDAO.findByExample(employee);
    Set
    groupIds = new HashSet<>();
    for (Resource resource : resourceList) {
    if (StringUtils.isNotBlank(resource.getGroupId())) {
    String groupId = resource.getGroupId();
    if (StringUtils.isNotBlank(groupId)) {
    String[] idParts = StringUtils.split(groupId, ",");
    for (String id : idParts) {
    Long.parseLong(id);
    groupIds.add(Long.parseLong(id));
    }
    }
    }
    }

    代码解析:

  • 获取资源列表:调用数据库查询获取与特定员工相关的资源数据。
  • 初始化集合:创建一个Set<Long>对象groupIds用于存储唯一的用户组ID。
  • 遍历资源列表:对于每一个资源对象,如果其groupId字段不为空,则进入下一步。
  • 解析组ID:将组ID字符串拆分成单独的ID值,并将其添加到集合中。这个过程是为了去除重复的组ID。
  • 返回唯一组ID集合:将Set<Long>返回,供后续使用。
  • 通过上述代码,我们可以清晰地看到HashSet在数据去重方面的强大能力。它能够在O(1)的时间复杂度内保证每次插入操作的高效性。


    TreeSet: 有序集合的优雅实现

    TreeSet作为HashSet的升级版,具备了有序性。它不仅可以保持集合中元素的唯一性,还可以根据某种比较规则对元素进行排序。

    TreeSet的排序机制:

  • 自然排序

    大多数情况下,TreeSet采用默认的自然排序方式。这意味着集合中的元素需要实现Comparable接口,并通过其compareTo方法定义元素的顺序。

    例如,Integer类、String类等都天然支持自然排序。TreeSet会根据这些类的比较结果自动进行排序。

  • 客户化排序

    如果需要定制排序规则,开发者可以提供一个Comparator接口实现类。Comparatorcompare方法将决定元素的比较结果,从而影响排序方式。

  • 排序类型的选择

    根据实际需求,可以灵活选择排序方式。例如:

    • 自然排序(适用于支持Comparable接口的对象)
    • 基于特定属性的客户化排序(例如根据名字降序排列)

  • 树结构中的元素排列

    TreeSet通过维护一个平衡二叉搜索树(通常是红黑树结构)来实现排序功能。插入操作时会根据元素的比较结果而定位合适的位置,并调整树的结构以确保查找效率。

    代码示例:自定义排序的TreeSet使用

    import java.util.*;
    public class CustomerComparator implements Comparator
    {
    @Override
    public int compare(Customer o1, Customer o2) {
    return o1.getName().compareTo(o2.getName());
    }
    }
    Set
    customers = new TreeSet<>(new CustomerComparator());
    Customer tom = new Customer("TOM", 15);
    Customer jack = new Customer("JACK", 20);
    Customer mike = new Customer("MIKE", 38);
    customers.add(tom);
    customers.add(jack);
    customers.add(mike);
    for (Customer customer : customers) {
    System.out.println(customer.getName() + " " + customer.getAge());
    }

    运行结果:

    TOM 15
    MIKE 38
    JACK 16

    可以看到,TreeSet默认采用的是Comparable的自然排序方式。我们希望根据Customer对象的name属性进行降序排列,可以通过定义自定义比较器来实现这一点。


    集合的核心价值:高效操作与唯一性维护

    集合的最大价值在于其双重功能:能够在插入操作中自动去除重复元素,并在查询时快速获取所需数据。无论是HashSet还是TreeSet,它们都继承了集合接口的核心特征,使得程序能够实现灵活而高效的数据管理。


    通过这番探讨,我们可以清晰地看出HashSetTreeSet在数据处理中的不同特点和应用场景。在实际开发中,可以根据具体需求选择最合适的集合实现类,以充分发挥其优势。

    转载地址:http://ehliz.baihongyu.com/

    你可能感兴趣的文章
    Nest.js 6.0.0 正式版发布,基于 TypeScript 的 Node.js 框架
    查看>>
    NetApp凭借领先的混合云数据与服务把握数字化转型机遇
    查看>>
    NetBeans IDE8.0需要JDK1.7及以上版本
    查看>>
    netcat的端口转发功能的实现
    查看>>
    netfilter应用场景
    查看>>
    netlink2.6.32内核实现源码
    查看>>
    Netpas:不一样的SD-WAN+ 保障网络通讯品质
    查看>>
    NetScaler的常用配置
    查看>>
    netsh advfirewall
    查看>>
    NETSH WINSOCK RESET这条命令的含义和作用?
    查看>>
    Netty WebSocket客户端
    查看>>
    netty 主要组件+黏包半包+rpc框架+源码透析
    查看>>
    Netty 异步任务调度与异步线程池
    查看>>
    Netty中集成Protobuf实现Java对象数据传递
    查看>>
    Netty事件注册机制深入解析
    查看>>
    Netty原理分析及实战(四)-客户端与服务端双向通信
    查看>>
    Netty客户端断线重连实现及问题思考
    查看>>
    Netty工作笔记0006---NIO的Buffer说明
    查看>>
    Netty工作笔记0007---NIO的三大核心组件关系
    查看>>
    Netty工作笔记0011---Channel应用案例2
    查看>>