Set集合

2023-11-18

目录

一、Set集合的特点

二、Set集合取值

三、常用实现类HashSet和TreeSet

四、Comparable和Comparator的使用

4.1.Comparable

4.2.Comparator

五、LinkedHashSet

六、泛型的简单介绍


一、Set集合的特点

1.案例:

Set mys = new HashSet<>();
        
// 增加值
mys.add(true);
mys.add("哈哈");
mys.add('a');
mys.add(1);
        
// 循环取值
for (Object object : mys) {
            System.out.println(object);
}

输出结果:

 可以看到内容是打乱输出的。所以,得出特点1:无序

2.同样是上面的案例,只是往集合里面增加了一组重复值:mys.add("哈哈")

Set mys = new HashSet<>();
        
// 增加值
mys.add(true);
mys.add("哈哈");
mys.add('a');
mys.add(1);
mys.add("哈哈");
        
// 循环取值
for (Object object : mys) {
            System.out.println(object);
}

输出结果:

 可以看到输出结果是4个,并没有输出重复值。所以,得出特点2:不能重复

总结:

1.无序;

2.(对象)不能重复(eqauls)。
      eqauls 从 Object 继承,默认比较的地址

补充:和List集合的特点相反。

二、Set集合取值

方式一:foreach

for (Object object : mys) {
       System.out.println(object);
 }

方式二:迭代器 Iterator(官方推荐,安全可靠性更高)

Iterator it = mys.iterator();
while(it.hasNext()) {
            Object next = it.next();
            System.out.println(next);
}

注意:不能使用for循环,Set不能单独取值,没有下标。

三、常用实现类HashSet和TreeSet

区别:

1.HashSet不可以排序。但内部已经按照自己的规则排序好了:把所有值转换成Hash表内的Hash值

 2.TreeSet可以排序。根据某种规则对里面的元素进行排序
        规则1: java.lang.Comparable (基础语言包)
        规则2: java.util.Comparator (工具包)

补充:它们都是接口

1.Comparable:自然排序接口

2.Comparator:比较器接口

四、Comparable和Comparator的使用

Comparable 和 Comparator 接口的存在就是为了对象比较和多个对象进行排序。

4.1.Comparable

该接口位于 java.lang 包下,接口中只有一个抽象方法 compareTo()。

案例:使用Comparable自然排序接口实现对象排序

        首先写一个类,实现了 Comparable 接口,并在重写的 compareTo() 方法里面定义了排序规则。

/**
 * 学生类
 * @author wang'qing
 *
 */
public class User implements Comparable<User> {
    private int id;// 学号
    private String name;// 姓名

    public User(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
    
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
    

  @Override
    public int compareTo(User o) {
        // 拿学生学号和学生对象学号进行排序
        if(this.id < o.id){
            return -1;
        }else  if(this.id == o.id){
            return 0;
        }else {
            return 1;
        }
    }
 
}

然后通过对对象、数组、集合进行排序。

Collections:工具类,提供一组静态方法操作 Collection 集合;
Arrays:工具类,提供了一组静态方法操作数组;

public static void main(String[] args) {
        // 1.两个对象
        User u1 = new User(1, "周婷");
        User u2 = new User(2, "乐媛");
        
        // 找出学号比较大的学生
        if(u1.compareTo(u2) > 0) {
            System.out.println(u1.id + "\t" + u1.name);
        }else {
            System.out.println(u2.id + "\t" + u2.name);
        }
        
        // 2.数组
//        User[] user = new User[] {
//            new User(1, "周婷"),
//            new User(3, "乐媛"),
//            new User(2, "金眉")
//        };
//        
//        Arrays.sort(user);
//        for (User u : user) {
//            System.out.println(u);
//        }
        
        
        // 3.集合
//        List<User> listUser = new ArrayList<User>();
//        
//        listUser.add(new User(1,"王晴"));
//        listUser.add(new User(3,"金眉"));
//        listUser.add(new User(4,"周婷"));
//        listUser.add(new User(5,"乐媛"));
//        listUser.add(new User(2,"王欣雨"));
//        
//        Collections.sort(listUser);
//        for (User user : listUser) {
//            System.out.println("学号:" + user.id + "\t" + "姓名:" + user.name);
//        }
//        System.out.println(listUser);
        
}

4.2.Comparator

        该接口位于 java.util 包下,如果我们想要使用这个接口,只需要实现一个抽象方法 compare 就可以了。

案例1:使用 Comparator 比较器接口实现比大小

比较原理:通过 HashCode() 返回整形字符,然后进行比较。

首先要有一个类,并实现 HashCode() 方法;

package com.zking.Test;

public class Student {
 public Integer id;// 学号
    public String name;// 姓名
     publicInteger age;// 年龄
    
    public Student() {
        
    }
    
    public Student(Integer id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    public Student(Integer id) {
        super();
        this.id = id;
    }
    
    @Override
    public int hashCode() {
        return this.id.hashCode();
    }
    
}

        继承 Comparator 接口,传两个学生对象进行比较(比较的前提是 Student 类必须有内置的HashCode() 方法);

public class Test implements Comparator<Student> {
    
    @Override
    public int compare(Student o1, Student o2) {
        return o1.hashCode() - o2.hashCode();
    }
    
}

         因为我进行的是年龄的比大小,所以类里面的 HashCode() 方法只传入了年龄的参数,可以根据实际情况传入其他参数,比如要比较学号或姓名的大小。

public static void main(String[] args) {
        Test t = new Test();
        
        // 两个学生进行年龄的比大小
        Student s1 = new Student(2);
        Student s2 = new Student(1);
        int compare = t.compare(s1, s2);
        System.out.println(compare);

        

         /**
         * 输出结果:
         * 如果s1大于s2,输出正数
         * 如果s2大于s1,输出负数
         * 如果两个值相等,输出0
         */
}

案例2:Comparator对对象进行排序

同样写一个类;

public class Student {
    public Integer id;// 学号
    public String name;// 姓名
    public Integer age;// 年龄
    
    public Student() {
        
    }
    
    public Student(Integer id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    
    public Student(Integer id) {
        super();
        this.id = id;
    }
    
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    
}

重写 compare() 方法定义排序规则;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Test implements Comparator<Student> {
    @Override
    public int compare(Student o1, Student o2) {
        if(o1.id > o2.id)
            return 1;
        else if(o1.id == o2.id)
            return 0;
        else
            return -1;
    }
      
}

通过对象和集合进行排序;

    public static void main(String[] args) {
        // 1.两个对象
//        Student s1 = new Student(1, "啦啦", 20);
//        Student s2 = new Student(2, "哗哗", 20);
//        
//        Test t = new Test();
//        
//        if(t.compare(s1, s2) > 0) {
//            System.out.println("学号:" + s1.id + "\t姓名:" + s1.name + "\t年龄:" + s1.age);
//        }else {
//            System.out.println("学号:" + s2.id + "\t姓名:" + s2.name + "\t年龄:" + s2.age);
//        }
        
        // 2.集合
        List<Student> listStudent = new ArrayList<>();
        listStudent.add(new Student(2, "啦啦", 20));
        listStudent.add(new Student(1, "哗哗", 30));
        listStudent.add(new Student(4, "嘻嘻", 40));
        listStudent.add(new Student(3, "哈哈", 50));
        
        Collections.sort(listStudent, new Test());
        for (Student s : listStudent) {
            System.out.println(s);
        }
        
    }

其他案例:使用 Arrays.sort() 实现冒泡排序

int[] a = {40,50,20,10,60,30};
Arrays.sort(a);
System.out.println(Arrays.toString(a));

输出:

 

五、LinkedHashSet

特点:

1.元素是有顺序的;
2.元素是不重复的;
3.底层数据结构是按照链表的结构存贮的 Linked 。

六、泛型的简单介绍

泛型主要是让我们类里面的数据类型更加的灵活,默认Object。语法:<>

举例:List集合

List<E> myl = new ArrayList<E>();

完。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Set集合 的相关文章

  • 使用 Firebase Java API 检索/格式化数据的最佳方式

    我在用着Firebase用于数据存储Android项目 并使用Firebase Java API来处理数据 不过 我不确定我是否尽可能高效地完成此操作 并且我希望获得一些有关检索和格式化数据的最佳实践的建议 我的Firebase存储库看起来
  • log4j:ERROR 在 tomcat 7 中部署 war 时无法创建自定义 Appender

    我的 log4j xml 中有以下标签
  • Spring Kafka - 为任何主题的分区消耗最后 N 条消息

    我正在尝试读取请求的卡夫卡消息数 对于非事务性消息 我们将从 endoffset N 对于 M 个分区 开始轮询并收集当前偏移量小于每个分区的结束偏移量的消息 对于幂等 事务消息 我们必须考虑事务标记 重复消息 这意味着偏移量将不连续 在这
  • CDI 对象无法使用注入的构造函数进行代理

    当尝试将参数注入 CDI bean ApplicationScoped 的构造函数时 我遇到以下问题 Caused by org jboss weld exceptions UnproxyableResolutionException WE
  • CustomTaskChange 在调用 updateSQL 时实际执行

    我有一个CustomTaskChange在 Liquibase 中 除了其他变更集 我希望我的应用程序在实际执行之前显示所有 ChangeSet 的 SQL 以我的理解 updateSQL应该预览 SQL 并且不执行任何操作 ACustom
  • Vaadin框架播放视频

    我可以使用 Vaadin Framewotk 播放视频吗 主要思想是从本地驱动器加载 flv 或 avi 格式的视频文件 并使用 vaadin 框架在网络上播放 谢谢 Sampler中有一个示例 http demo vaadin com s
  • Appengine - 隐藏文件夹的部署

    为了验证 SSL 证书 我需要将包含一些文件的隐藏文件夹 well known 上传到我的应用程序 我正在使用 eclipse 部署 java 应用程序 但 appengine 上的应用程序未收到这些文件 我猜他们被过滤掉了 我尝试将隐藏文
  • 如何统计lucene索引中每个文档的term数?

    我想知道 lucene 索引中每个文档的术语数量 我一直在 API 和互联网上搜索 但没有结果 你能帮助我吗 Lucene 的构建是为了回答相反的问题 即哪些文档包含给定术语 因此 为了获取文档的术语数量 您必须进行一些修改 第一种方法是存
  • 为什么在java中加载JNI是在静态初始化程序中完成的?

    在许多使用 JNI 的示例中 我看到类似以下内容 class SampleClass static System loadLibrary somelib 这种特殊语法的目的是什么 为什么使用这个 而不仅仅是在类构造函数或类似的东西中 我想你
  • 如何在 Jersey RESTful Web 服务中放置 cookie?

    我想通过 Jersey API 将 cookie 从 PUT webservice result 放置到 POST webservice 这是我的代码 WebResource service1 client resource http te
  • .NET 中的 Class.forName() 等效项?

    动态获取对象类型然后创建它的新实例的 C 方法是什么 例如 如何在 C 中实现以下 Java 代码的结果 MyClass x MyClass Class forName classes MyChildClass newInstance Lo
  • Eclipse 错误:“设置构建路径”遇到错误

    我正在使用一个名为 jtwitter 的 API 它有一个 jar 文件 jtwitter jar 我一直在使用它并使用 git 维护它 我把代码托管在github上 有些天 我没有碰过它的代码 今天 当我克隆我的 git repo 时 实
  • 在 Java 类型参数中, 仅意味着严格的子类型?或者 E 也足够了吗?

    在 Java 类型参数中 是否仅意味着严格的子类型 或者 E 也足够了吗 这并不严格 E就足够了
  • 参数列表中的“...”是什么意思? doInBackground(字符串...参数)

    我不明白那个语法 尝试用谷歌搜索各种单词加上 是没有用的 它被称为varargs http java sun com j2se 1 5 0 docs guide language varargs html 这个事实应该产生更好的谷歌结果 h
  • JNA Windows 服务启动类型

    我一直在使用 JNA 并且能够使用下面的代码返回 Windows 服务的状态 即启动或停止 但我不确定如何返回服务的启动类型 我确信 JNA 之外还有其他方法 但如果可能的话我想继续使用 JNA import com sun jna imp
  • 通过命令行参数更改默认的 ant 目标

    最近我被分配了一个任务 让ant能够为不同的环境构建war包 除了一项功能外 我几乎完成了 蚂蚁接受一个env参数类似 Denv DEV 并使用不同的配置文件来制作war包 但默认目标是start它将构建 部署并启动 tomcat 我不希望
  • 使用相对于配置文件的路径引用 Spring 属性文件

    我正在将属性从 Spring 配置文件内部移动到单独的属性文件中 这包含在配置文件中
  • 删除子类中的注释?

    我有一个子类 需要一个注释 在删除的父类中声明 做这个的最好方式是什么 public class Parent MyAnnoation String foobar public class Child extends Parent here
  • 为什么永久代空间不断增长?

    我读过几篇文章 我理解以下内容 如果我错了 请纠正我和 或编辑问题 java堆是这样分段的 年轻代 创建的对象放在这里 这部分被频繁且廉价地垃圾收集 老一代 在年轻代的垃圾收集中幸存下来的对象会移到此处 该区域的垃圾收集频率较低 并且使用对
  • Eclipse:如何增加查找/替换历史记录?

    查找 替换对话框显示最后 8 个条目 该对话框通过 Ctrl F 显示 我想增加 查找 和 替换为 输入字段的历史记录中显示的条目数 我必须搜索并替换几个字符串和正则表达式 因此我一次又一次地输入字符串和正则表达式 我并不是指文件内容更改的

随机推荐

  • Dynamics 365 DevOps CI/CD之Solution

    CI CD到了Soution就没太多可说的了 按部就班配置就行 我选择的工具是Power DevOps Tool 1 首先下载工具 然后设置连接字符串去连环境 连接字符串还是用ClientSecret的形式 2 当然导出前还是要发布下自定义
  • Ue4蓝图访问外部接口

    首先我们搭建一个服务 node express 注意电脑必须安装node mkdir test server cd test server npm init npm install express body parser chalk pat
  • 数组复制的三种方法(超详细)

    数组复制的三种方法 Arrays类 copyOf 方法 copyOfRangs 方法 System类 arraycopy Arrays类 copyOf 方法 copyOf 方法适用于从下标0开始 复制指定长度的元素到目标数组 源码如下 pu
  • jQuery实现下拉菜单[代码+详细讲解+效果图]

    文章目录 前言 一 案例功能描述 二 html代码讲解 三 css代码讲解 四 jQuery实现功能及代码讲解 五 效果图 总结 前言 下拉菜单也是每个网页基本都会用到的案例 所以知识点还是要我们掌握的 这个案例比较简单 主要还是我们的jQ
  • 基于ftp协议的文件变化主动监听

    基于ftp协议的文件变化主动监听 前言 实现思路 代码实现思路 具体代码实现 依赖引入 FTPService接口 FTPServiceImpl类 FileChangeEvent接口 FileChangeData实体类 FileChangeT
  • linux 命令行与shell脚本编程大全

    linux 命令行与shell脚本编程大全 第一章 Linux LiveCD就是从cd读取的系统 由于没法将数据写入到cd 所以一旦重启 之前操作过后的一切数据都会丢失 第二章 第三章 1 man手册使用快捷键 使用空格键翻页 2 man
  • linux(centos) cpu核心数信息汇总

    总核数 物理CPU个数 X 每颗物理CPU的核数 总逻辑CPU数 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 查看物理CPU个数 cat proc cpuinfo grep physical id sort uniq wc l
  • 【论文速递】ECCV2022 - ByteTrack:通过关联每个检测盒来进行多对象跟踪

    论文速递 ECCV2022 ByteTrack 通过关联每个检测盒来进行多对象跟踪 论文原文 ByteTrack Multi Object Tracking by Associating Every Detection Box 论文地址 h
  • macos安装zsh

    https www cnblogs com xuLessReigns p 11005435 html mac下安装autojump brew install autojump 1 安装zsh 执行 sh c curl fsSL https
  • 端口扫描工具-Nmap

    Nmap是一款功能强大 功能丰富的网络扫描工具 对于网络管理员和安全专业人员来说 是一个非常有用的工具 并且被广泛应用于安全审计 网络调查 漏洞搜寻等领域 能扫描主机的端口 查看端口是否开放 端口的服务是什么 端口扫描不但可以为黑客所利用
  • 深入理解mysqldump原理 --single-transaction --lock-all-tables --master-data

    在mysqldump过程中 之前其实一直不是很理解为什么加了 single transaction就能保证innodb的数据是完全一致的 而myisam引擎无法保证 必须加 lock all tables 前段时间抽空详细地查看了整个mys
  • 宝塔linux ssh没发启用,宝塔终端面板连接SSH服务失败解决方案

    最近更新了宝塔面板的版本后 通过宝塔SSH终端 1 0工具链接时出现了SSH服务失败的问题 尝试使用云平台的SSH和XSHELL之类的工具都可以正常链接 可以排除是SSH端口或是设置错误造成的故障 通过翻看宝塔官方论坛 找到了大炮运维V58
  • PageHelper分页插件出现的异常:check the your MySQL server version for the right syntax to use near ‘LIMIT 5‘

    1 使用PageHelper分页插件时 编写测试方法 运行并测试时出现如下异常 Cause com mysql jdbc exceptions jdbc4 MySQLSyntaxErrorException You have an erro
  • [ERROR NumCPU]: the number of available CPUs 1 is less than the required 2

    出现上述错误的原因 因为物理机或者虚拟机不满足Kubernetes的基础配置造成的 而Kubernetes对GPU要求至少是2核 2G内存 W0123 08 22 23 322562 12102 validation go 28 Canno
  • 做编程题没有思路怎么办

    来信 老师您好 我是一名计算机专业大二的学生 我现在在做一系列c语言竞赛一些容易的题目 可是我发现我碰到的问题会很没有思路 不知道方向 看见网上的很多同学都能够解决 而我却不能 我不知道自己差到哪了 我不知道怎么办才好 都有很多中学生的水平
  • macOS 12 Monterey:一次全新的跨设备协作体验

    macOS 12 Monterey是苹果公司的一次重大突破 它打破了设备间的壁垒 将不同设备无缝地连接在一起 极大地提升了用户的工作效率和娱乐体验 Monterey带来了通用控制 AirPlay 捷径等新功能 以及一些实用的新小功能 安装
  • 本地项目放到服务器启动不了,spring boot在本地能启动,放服务器上就不行,

    写完代码 放到服务器上去发现启动不了 服务器的tomcat没有问题 因为上面已经有两个项目在跑 报错内容 百度过了 百度上都说是server api的问题 但是我没有引入这个包 被逼无奈才来这里请教的 java util concurren
  • 25_pre_content 阶段 mirror 模块

    文章目录 precontent 阶段的 mirror 模块 示例配置 precontent 阶段的 mirror 模块 作用 实时拷贝流量 处理请求时 生成子请求访问其他服务 对子请求的返回值不做处理 ngx http mirror mod
  • 调用接口登录禅道_Java调用禅道api接口查询以及创建任务(傻瓜式复制粘贴--旗舰版禅道页面调用)

    背景 系统需要调用禅道的接口进行工单的创建 并对工单进行附件上传等信息的操作 禅道接口为http接口 每次请求都需要带上zentaosid进行请求 由于专业版禅道升级为旗舰版禅道版本变更 请求的URL有所变化 变化最大为常量类配置 如下 实
  • Set集合

    目录 一 Set集合的特点 二 Set集合取值 三 常用实现类HashSet和TreeSet 四 Comparable和Comparator的使用 4 1 Comparable 4 2 Comparator 五 LinkedHashSet