博客
关于我
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/

    你可能感兴趣的文章
    nodejs生成多层目录和生成文件的通用方法
    查看>>
    nodejs端口被占用原因及解决方案
    查看>>
    Nodejs简介以及Windows上安装Nodejs
    查看>>
    nodejs系列之express
    查看>>
    nodejs系列之Koa2
    查看>>
    Nodejs连接mysql
    查看>>
    nodejs连接mysql
    查看>>
    NodeJs连接Oracle数据库
    查看>>
    nodejs配置express服务器,运行自动打开浏览器
    查看>>
    NodeMCU教程 http请求获取Json中文乱码解决方案
    查看>>
    Nodemon 深入解析与使用
    查看>>
    NodeSession:高效且灵活的Node.js会话管理工具
    查看>>
    node~ http缓存
    查看>>
    node不是内部命令时配置node环境变量
    查看>>
    node中fs模块之文件操作
    查看>>
    Node中同步与异步的方式读取文件
    查看>>
    node中的get请求和post请求的不同操作【node学习第五篇】
    查看>>
    Node中的Http模块和Url模块的使用
    查看>>
    Node中自启动工具supervisor的使用
    查看>>
    Node入门之创建第一个HelloNode
    查看>>