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

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

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 15MIKE 38JACK 16

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


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

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


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

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

    你可能感兴趣的文章
    Node.js 8 中的 util.promisify的详解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 历史
    查看>>
    Node.js 在个推的微服务实践:基于容器的一站式命令行工具链
    查看>>
    Node.js 实现类似于.php,.jsp的服务器页面技术,自动路由
    查看>>
    Node.js 异步模式浅析
    查看>>
    node.js 怎么新建一个站点端口
    查看>>
    Node.js 文件系统的各种用法和常见场景
    查看>>
    Node.js 的事件循环(Event Loop)详解
    查看>>
    node.js 简易聊天室
    查看>>
    Node.js 线程你理解的可能是错的
    查看>>
    Node.js 调用微信公众号 API 添加自定义菜单报错的解决方法
    查看>>
    node.js 配置首页打开页面
    查看>>
    node.js+react写的一个登录注册 demo测试
    查看>>
    Node.js中环境变量process.env详解
    查看>>
    Node.js之async_hooks
    查看>>
    Node.js升级工具n
    查看>>
    Node.js卸载超详细步骤(附图文讲解)
    查看>>
    Node.js基于Express框架搭建一个简单的注册登录Web功能
    查看>>
    Node.js安装与配置指南:轻松启航您的JavaScript服务器之旅
    查看>>