Java中Set集合

Set集合类似于数学中集合的概念,具有和数学中集合一样的唯一性(就是说Set集合中的元素不能重复),在Java中我们最长使用的集合有HashSet、LinkedHashSet和TreeSet,这里最常使用的就是HashSet。

一、HashSet

        1.HashSet的定义

HashSet<引用类型> set = new HashSet<引用类型>(); 

注意:如果是基本类型请用包装类,比如:int的包装类Integer

        2.add 添加元素 

        3.size 返回HashSet中的元素个数

        HashSet<String> set = new HashSet<String>();set.add(null);set.add("null");System.out.println(set.size());for (String s:set){System.out.println(s==null);System.out.println(s);}

 输出结果

        2        System.out.println(set.size());
        true
        null
        false
        null

 可以看到HashSet中可以添加null进去。

        4.remove(obj) 删除HashSet集合中的obj对象,删除成功返回true,否则返回false  

        5.isEmpty 判断HashSet集合是否为空。

        HashSet<String> set = new HashSet<String>();set.add("a");System.out.println(set.isEmpty());System.out.println(set.remove("b"));System.out.println(set);System.out.println(set.remove("a"));

 输出结果

        false
        false
        [a]
        true

        6.clear(): 移除HashSet中的所有元素。 

        HashSet<String> set = new HashSet<String>();set.add("abc");set.add("def");System.out.println(set);set.clear();System.out.println(set);

输出结果: 

        [abc, def]
        []

         7.遍历HashSet

                <1>使用迭代器 iterator()

    set.add("a");set.add("b");set.add("c");set.add("d");set.add("e");Iterator<String> ite =set.iterator();while(ite.hasNext()){System.out.println(ite.next());}

                <2>使用增强for循环

        HashSet<String> set = new HashSet<String>();set.add("e");set.add("嘟噜");set.add("a");set.add("芜湖");set.add("d");set.add("咕咕");Iterator<String> ite =set.iterator();while(ite.hasNext()){System.out.println(ite.next());}System.out.println(set);for (String s:set){System.out.print(s+" ");}

 输出结果

a
d
e
嘟噜
芜湖
咕咕
[a, d, e, 嘟噜, 芜湖, 咕咕]
a d e 嘟噜 芜湖 咕咕 

        8.contains(obj):判断集合中是否包含obj元素。 

        HashSet<String> set = new HashSet<String>();set.add("a");set.add("ba");System.out.println(set.contains("b"));

输出结果:false

        9.HashSet的特点

        HashSet是最类似数学中集合概念的,不仅具有唯一性,还有无序性。

  1. HashSet可以存
  2. HashSet中的元素是不能保证顺序
  3. HashSet中的元素不能重复
  4. HashSet的集成实现是使用的HashMap

HashSet 的add方法实质是map全局变量调用了put方法,将数据存到了key,因为HashMap的 key是唯一的,所以HashSet添加的元素也不允许重复。

二、LinkedHashSet集合 

LinkedHashSet集合的特点

        <1>LinkedHashSet是使用HashSet实现的

        <2>LinkedHashSet使用了链表可以保证该集合是有序的

        <3>LinkedHashSet中使用了hash表元素是唯一的。

三、TreeSet集合

1.TreeSet中的元素是有序的 

        TreeSet ts=new TreeSet();ts.add("agg");ts.add("abcd");ts.add("激光人");ts.add("ffas");ts.add("咕咕");ts.add("露露");Iterator it=ts.iterator();while(it.hasNext()) {System.out.println(it.next());}

输出结果:

abcd
agg
ffas
咕咕
激光人
露露

2.如果想要插入自定义对象,就需要实现Comparable 接口

class Person implements Comparable{String name;int age;Person(String name,int age){this.name=name;this.age=age;}@Overridepublic int compareTo(Object o) {Person p=(Person)o;//先对姓名字典序比较 如果相同 比较年龄if(this.name.compareTo(p.name)!=0) {return this.name.compareTo(p.name);}else{if(this.age>p.age) return 1;else if(this.age<p.age) return -1;}return 0;}}public class Test {public static void main(String args[]){TreeSet ts=new TreeSet();ts.add(new Person("瑞贝卡",21));ts.add(new Person("路飞",12));ts.add(new Person("三镇",8));ts.add(new Person("路飞",11));Iterator it=ts.iterator();while(it.hasNext()){Person p=(Person)it.next();System.out.println(p.name+":"+p.age);}}
}

输出结果:

三镇:8
瑞贝卡:21
路飞:11
路飞:12 

四、三个集合的使用要怎么挑选呢?

LinkedHashSet:要求当插入顺序和取出顺序一致的时候使用LinkedHashSet。

TreeSet:只有在需要对元素进行排序时使用

HashSet:在不使用上面两个集合的时候使用HashSet

五、Set在算法中的应用 (求一个字符串的最长无重复字符子字符串长度)

题目描述:求一个字符串的最长无重复字符子字符串长度

实例:

输入:abcabcabc

输出:3

解析:

abcabcabc的子字符串有abca, abc, ab, a,无重复字符的子字符串: abc, ab, a,无重复字符的最长子字符串是abc,它的长度是3。

 题目详见:LCR 016. 无重复字符的最长子串

    public static int norepeat(String s){//哈希set用来存储不重复字符Set<Character> cset =  new HashSet<Character>();int rk = 0,ans = 0;int n = s.length();for(int i = 0;i<n;i++){if(i!=0){cset.remove(s.charAt(i-1));    }while(rk<n&&!cset.contains(s.charAt(rk))){cset.add(s.charAt(rk++));         }ans = Math.max(ans,rk-i);       } return ans;   }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/46198.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Apache Hadoop之历史服务器日志聚集配置

上篇介绍绍了Apache Hadoop的分布式集群环境搭建&#xff0c;并测试了MapReduce分布式计算案例。但集群历史做了哪些任务&#xff0c;任务执行日志等信息还需要配置历史服务器和日志聚集才能更好的查看。 配置历史服务器 在Yarn中运行的任务产生的日志数据不能查看&#xff0…

2024-07-13 Qt6.5版本后视频渲染

文章目录 前言一、先上代码1.将yuv/nv12等解码后的视频数据放入QVideoSink内2.将AVFrame数据保存进QVideoSink3.在qml中的显示4.同理,在widget中也可显示 二、QVideoFarme支持的格式三、说说渲染效率问题 前言 Qt 6版本中&#xff0c;视频播放能力得到了质的飞越&#xff0c;相…

【JavaScript】 变量提升和函数提升

变量提升 1. 允许在变量声明之前即被访问。 2. 在代码执行之前&#xff0c;把当前作用域中var声明的变量全部提到当前作用域的最前面。 3. 只提升声明&#xff0c;不提升赋值。 function fn(){console.log(num)var num 10 } 相当于以下代码&#xff1a; function fn(){…

Tomcat底层原理

Tomcat是一个开源的Java Servlet容器&#xff0c;它实现了Java Servlet和JavaServer Pages (JSP) 技术&#xff0c;用于运行Java Web应用。它是由Apache软件基金会开发和维护的。以下是对Tomcat底层原理的详细解析&#xff1a; 1. 启动流程 Tomcat的启动流程主要分为以下几个…

【计算机毕业设计】013新闻资讯微信小程序

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

Python数据分析案例51——基于K均值的客户聚类分析可视化

案例背景 本次案例带来的是最经典的K均值聚类&#xff0c;对客户进行划分类别的分析&#xff0c;其特点是丰富的可视化过程。这个经典的小案例用来学习或者课程作业在合适不过了。 数据介绍 数据集如下: 客户的编码&#xff0c;性别&#xff0c;年龄&#xff0c;年收入&#…

Vue2-集成路由Vue Router介绍与使用

文章目录 路由&#xff08;Vue2&#xff09;1. SPA 与前端路由2. vue-router基本使用创建路由组件声明路由链接和占位标签创建路由模块挂载路由模块 3. vue-router进阶路由重定向嵌套路由动态路由编程式导航导航守卫 本篇小结 更多相关内容可查看 路由&#xff08;Vue2&#xf…

安全防御----防火墙综合实验2

安全防御----防火墙综合实验2 一、题目 二、实验要求&#xff1a; 1&#xff0c;DMZ区内的服务器&#xff0c;办公区仅能在办公时间内&#xff08;9&#xff1a;00 - 18&#xff1a;00&#xff09;可以访问&#xff0c;生产区的设备全天可以访问. 2&#xff0c;生产区不允许访…

雷赛运动控制卡编程(1)

一、运动控制卡选择 电气常用知识-CSDN博客 如下旋转控制卡 DMC3800八轴高性能点位卡 - 东莞市雅恰达机电有限公司 轴少的时候选择脉冲系列卡 轴多的话就选总线型系列控制卡 样品 架构&#xff1a; 二、 添加文件 dll 添加接口文件 【最全&#xff0c;带注释版】雷赛运动…

设置控件背景颜色

在Qt中&#xff0c;设置控件的背景颜色可以通过多种方式实现&#xff0c;但最常用的方法是使用QStyle、QPainter或QPalette。以下是几种设置控件背景颜色的方法&#xff1a; 使用setStyleSheet 对于大多数Qt控件&#xff0c;最简单的方法是使用setStyleSheet方法。这个方法允…

OpenCV中使用Canny算法在图像中查找边缘

操作系统&#xff1a;ubuntu22.04OpenCV版本&#xff1a;OpenCV4.9IDE:Visual Studio Code编程语言&#xff1a;C11 算法描述 Canny算法是一种广泛应用于计算机视觉和图像处理领域中的边缘检测算法。它由John F. Canny在1986年提出&#xff0c;旨在寻找给定噪声条件下的最佳边…

Python+wxauto=微信自动化?

Pythonwxauto微信自动化&#xff1f; 一、wxauto库简介 1.什么是wxauto库 wxauto是一个基于UIAutomation的开源Python微信自动化库。它旨在帮助用户通过编写Python脚本&#xff0c;轻松实现对微信客户端的自动化操作&#xff0c;从而提升效率并满足个性化需求。这一工具的出现&…

详细分析Sql Server中的declare基本知识

目录 前言1. 基本知识2. Demo3. 拓展Mysql4. 彩蛋 前言 实战探讨主要来源于触发器的Demo 1. 基本知识 DECLARE 语句用于声明变量 声明的变量可以用于存储临时数据&#xff0c;并在 SQL 查询中多次引用 声明变量&#xff1a;使用 DECLARE 语句声明一个或多个变量变量命名&a…

SpringBoot整合JAX-RS接口

目录 二、创建RESTful资源 三、注册JAX-RS资源 四、修改配置等信息 五、启动SpringBoot程序、访问服务 六、遇到的问题 七、与feign进行配合使用 1、接口定义 2、接口实现 3、注册资源 4、调用方web服务实现&#xff0c;跟注入普通服务一样 5、启动两个服务&#xff…

html5——表单

目录 表单基本结构 表单标签 常用表单元素 文本框 密码框 邮箱 单选按钮 复选框 文件域 隐藏域 列表框 多行文本域 lable标签 表单按钮 常用表单属性 只读与禁用 placeholder required pattern autofocus autocomplete 用于指定表单是否有自动完…

NoSQL之redis的配置与优化

一、redis数据库的基础介绍与对比 Redis(RemoteDictionaryServer&#xff0c;远程字典型)是一个开源的、使用C语言编写的NoSQL数据库。Redis 基于内存运行并支持持久化&#xff0c;采用 key-value(键值对)的存储形式&#xff0c;是目前分布式架构中不可或缺的一环。 1.非关系…

昇思25天打卡营-mindspore-ML- Day23-应用实践-RNN实现情感分类

学习了关于 RNN 算法及其应用。RNN&#xff0c;即循环神经网络&#xff0c;是一种专门用于处理序列数据的神经网络。其基本原理是通过循环连接&#xff0c;让网络能够记住之前的输入信息&#xff0c;并将其用于后续的计算&#xff0c;从而捕捉序列数据中的时间依赖关系。 RNN …

百日筑基第二十天-一头扎进消息队列3-RabbitMQ

百日筑基第二十天-一头扎进消息队列3-RabbitMQ 如上图所示&#xff0c;RabbitMQ 由 Producer、Broker、Consumer 三个大模块组成。生产者将数据发送到 Broker&#xff0c;Broker 接收到数据后&#xff0c;将数据存储到对应的 Queue 里面&#xff0c;消费者从不同的 Queue 消费数…

我的智能辅助大师-办公小浣熊

一、基本介绍 随着2022年ChatGPT为代表的AI工具对互联网领域进行第一次冲击后&#xff0c;作为一名对编程领域涉足不算特别深的一名程序员&#xff0c;对AI大模型的接触也真的不能算少了&#xff0c;这是时代的必然趋势。在此之前也曾接触过很多的AI工具&#xff0c;他们都能在…

【Vscode】显示多个文件 打开多个文件时实现标签栏多行显示

Vscode显示多个文件&VSCode打开多个文件时实现标签栏多行显示 写在最前面一、解决打开文件的时候只显示一个tab的办法解决办法如下&#xff1a; 二、文件标签栏多行显示设置步骤&#xff1a; &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时…