Set 集合概述与使用

news2025/1/11 9:48:02

目录

一、概述

1.特点:

2.方法:

二、Set接口的使用

三、Set实现类

1.HashSet     ***

(1)简单应用:

(2)存储方式

2.TreeSet

(1)红黑树

 (2)使用

(3)保存数据

(4)Comparator接口


一、概述

1.特点:

无序、无下标、元素不可重复。

2.方法:

全部继承自 Collection 中的方法。

二、Set接口的使用


import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * 测试Set接口的使用
 * 特点:无序   没有下标     不能重复
 */
public class Test {
    public static void main(String[] args) {
        //创建集合
        Set<String> set = new HashSet<>();
        //1.添加数据
        set.add("苹果");
        set.add("小米");
        set.add("Vivo");
        set.add("OPPO");
        System.out.println("数据个数:"+set.size());
        System.out.println(set.toString());
        System.out.println("-----------------------");
        //2.删除数据
        set.remove("Vivo");
        System.out.println(set.toString());
        System.out.println("-----------------------");
        //3.遍历
        //(1)增强for
        for (String string : set){
            System.out.println(string);
        }
        System.out.println("-----------------------");
        //(2)使用迭代器
        Iterator<String> it = set.iterator();
        while (it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("-----------------------");
        //4.判断
        System.out.println(set.isEmpty());
        System.out.println(set.contains("OPPO"));
    }
}

三、Set实现类

1.HashSet     ***

基于HashCode实现元素不重复

当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入。

(1)简单应用:

↓ ↓ ↓ ↓


import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet集合的使用
 * 无序
 * 存储结构:哈希表 (数组+链表+红黑树)
 */
public class Test {
    public static void main(String[] args) {
        //新建集合
        HashSet<String> hashSet = new HashSet<String>();
        //1.添加元素
        hashSet.add("E");
        hashSet.add("B");
        hashSet.add("C");
        hashSet.add("D");
        hashSet.add("E");  //出现重复的,最后也只会显示一个
        System.out.println("元素个数:"+hashSet.size());
        System.out.println(hashSet.toString());
        //2.删除数据
        hashSet.remove("E");
        System.out.println("删除之后:"+hashSet.size());
        System.out.println("-------------------");
        //3.遍历操作
        //(1)增强for循环
        for (String string : hashSet){
            System.out.println(string);
        }
        System.out.println("-------------------");
        //(2)迭代器
        Iterator<String> it =hashSet.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("-------------------");
        //4.判断
        System.out.println(hashSet.isEmpty());
        System.out.println(hashSet.contains("K"));
    }
}


(2)存储方式

添加数据:

Person p1= new Person("张三",22);
Person p2= new Person("张",2);
Person p3= new Person("三",12);
Person p4= new Person("张 三",20);
hashSet.add(p1);
hashSet.add(p2);
hashSet.add(p3);
hashSet.add(p4);

当添加数据 hashset.add(new Person("张三",22)); 时,数据仍会被添加进去。为什么呢?



存储结构:哈希表(数组+链表+红黑树)

存储过程:

(1)根据hashcode计算保存位置,如果此位置为空,则直接保存,如果不为空执行第二步。

 

(2)再执行equals方法,如果equals方法为true,则认为是重复;否则,形成链表。

 完整代码   重在注释    重在注释    重在注释

↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ 

Person类:

public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person() {
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    @Override
    public String toString(){
        return "Person [name=" + name + ",age=" + age + "]";
    }
    @Override
    public int hashCode(){
        int n1 = this.name.hashCode();
        int n2 = this.age;
        return n1+n2;
    }
    @Override
    public boolean equals(Object obj){
        if(this==obj){
            return true;
        }if(obj==null){
            return false;
        }if (obj instanceof Person){
            Person p = (Person) obj;
            if (this.name.equals(p.getName())&&this.age==p.getAge());
            {
                return true;
            }
        }

        return false;
    }
}

Test测试类:

import java.util.HashSet;
import java.util.Iterator;

/**
 * HashSet集合的使用
 * 无序
 * 存储结构:哈希表 (数组+链表+红黑树)
 */
public class Test {
    public static void main(String[] args) {
        //新建集合
        HashSet<Person> hashSet = new HashSet<>();
        //1.添加数据
        Person p1= new Person("张三",22);
        Person p2= new Person("张",2);
        Person p3= new Person("三",12);
        Person p4= new Person("张 三",20);
        hashSet.add(p1);
        hashSet.add(p2);
        hashSet.add(p3);
        hashSet.add(p4);
        hashSet.add(new Person("张三",22));
        System.out.println("元素个数:" +hashSet.size());
        System.out.println(hashSet.toString());
        //2.删除数据
        hashSet.remove(p2);
        hashSet.remove(new Person("张三",22));//重写hashCode才能用这种方式删除
        System.out.println("删除之后:"+hashSet.size());
        System.out.println("-------------------");
        //3.遍历操作
        //(1)增强for循环
        for (Person person : hashSet){
            System.out.println(person);
        }
        System.out.println("-------------------");
        //(2)迭代器
        Iterator<Person> it =hashSet.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("-------------------");
        //4.判断
        System.out.println(hashSet.isEmpty());
        System.out.println(hashSet.contains("K"));
    }
}

2.TreeSet

基于排列顺序实现元素不重复。

实现了SortedSet接口,对集合元素自动排列。

元素对象的类型必须实现Compareable接口,指定排序规则。

通过CompareTo方法确定是否为重复元素。

(1)红黑树

红黑树是在二叉树的基础上加了颜色。(保持平衡)

二叉树:每个节点有两个分支,从上到下依次列出,数字大小  左小右大。

 (2)使用


import java.util.Iterator;
import java.util.TreeSet;

/**
 * TreeSet的使用
 * 存储结构:红黑树
 */

public class Test {
    public static void main(String[] args) {
        //创建集合
        TreeSet<String> treeSet = new TreeSet<>();
        //1、添加元素
        treeSet.add("rgre");
        treeSet.add("esf");
        treeSet.add("rgewfgre");
        treeSet.add("rgrgre");
        System.out.println("元素个数:"+treeSet.size());
        System.out.println(treeSet.toString());
        System.out.println("--------------------------");
        //2.删除元素
        treeSet.remove("esf");
        System.out.println("删除之后的个数:" + treeSet.size());
        System.out.println("--------------------------");
        //3.遍历
        //(1)增强for
        for (String str : treeSet){
            System.out.println(str);
        }
        System.out.println("--------------------------");
        //(2)迭代器
        Iterator<String> it = treeSet.iterator();
        while(it.hasNext()){
            System.out.println(it.next());
        }
        System.out.println("--------------------------");
        //4.判断
        System.out.println(treeSet.contains("wfef"));
        System.out.println(treeSet.isEmpty());

    }
}

(3)保存数据

 

 其他方法和HashCode一样。

(4)Comparator接口

import com.Demo02.Set.Person;
import java.util.Comparator;
import java.util.TreeSet;

/**
 * TreeSet集合的使用
 * Comparator:实现定制比较(比较器)
 */

public class TreeSet1 {
    public static void main(String[] args) {
        //创建集合,并制定比较规则
        TreeSet<Person> persons = new TreeSet<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                int n1 = o1.getAge()-o2.getAge();
                int n2 = o1.getName().compareTo(o2.getName());
                return n1==0?n2:n1;
            }
        });
        Person p1 = new Person("ewfe",21);
        Person p2 = new Person("few",11);
        Person p3 = new Person("ewrvgfe",11);
        Person p4 = new Person("gtrh", 22);

        persons.add(p1);
        persons.add(p2);
        persons.add(p3);
        persons.add(p4);
        System.out.println(persons.toString());

    }
}



重在理解!!

感谢ლ(°◕‵ƹ′◕ლ)!!!

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

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

相关文章

文件被删除怎么办?恢复数据,电脑小白也能操作!

平时保存文件&#xff0c;我们都会用到电脑、硬盘、U盘。但有时候&#xff0c;不可避免会出现一些状况&#xff0c;比如数据误删&#xff0c;或者格式化。恢复数据应该如何操作&#xff1f;可能你会觉得自己&#xff1a;我是电脑小白&#xff0c;太复杂的操作我不会。别担心下面…

realme手机用什么蓝牙耳机好?2022公认音质最好的蓝牙耳机

作为日常通话、健身、听歌必不可少的设备&#xff0c;蓝牙耳机已经逐渐替代了有线耳机&#xff0c;成为了城市居民日常生活中最常用的收听设备。随着技术的发展&#xff0c;蓝牙耳机的性能也会越来越接近用户的需要&#xff0c;下面分享几款realme手机适用并且音质清晰的蓝牙耳…

mini_batch学习

概念 学习的指标 如何得到所有学习数据的损失函数的总和 一个一个计算&#xff1f;如果数据量大的话&#xff0c;费时费力 太难受了吧 从训练数据中获取小数据mini-batch 对每个小数据进行批量学习 首先读入mnist数据集 import numpy as np# 实现从训练数据中随机选择指定…

uni-app的三种操作数据库方法

目录 前端与后端&#xff08;云端&#xff09;分离实现数据库的操作 1.使用云函数来操作数据库 2.使用云对象来操作数据库 前端与后端&#xff08;云端&#xff09;结合实现客户端操作数据库 3.使用DB Schema结构规范实现客户端对数据库的操作 欢迎大家关注&#xff1a; …

Cinemachine各组件功能介绍

官方Github地址&#xff1a;https://github.com/Unity-Technologies/com.unity.cinemachine/tree/main/com.unity.cinemachine 文档在Documentation~文件夹下。 这里主要介绍各个组件的功能&#xff0c;具体参数设置查阅文档即可。 目录 Brain Camera CinemachineVirtualC…

yolov5训练coco数据集

文章目录参考链接一、coco数据集1. 简介2. 下载3.解压后的数据4. COCO数据集(.json)训练格式转换成YOLO格式(.txt)参考链接 为YOLOv5搭建COCO数据集训练、验证和测试环境 CoCo数据集下载 一、coco数据集 1. 简介 MS COCO的全称是Microsoft Common Objects in Context&#…

前端甘特图组件开发(一)

背景 工作中需要在网页上实现甘特图&#xff0c;以展示进度数据。通过网上调研相关项目&#xff0c;找到一款 dhtmlx-gantt 组件&#xff0c;在低程度上满足项目需求&#xff0c;但在部分定制功能&#xff08;如时间轴自定义、编辑弹窗样式风格等&#xff09;并不能完全满足项…

PyCharm+PyQT5之一环境搭建

TOCPyCharmPyQT之一环境搭建 今天搭建了PyCharmPyQT之一环境&#xff0c;看到好多论坛和书籍在搭建Python环境时仍然不使用虚拟环境管理&#xff0c;这对今后环境的移植和保存是非常麻烦的&#xff0c;大家可以按以下思路管理环境。 1.先安装python3.8.2&#xff08;我用的win7…

【简单、高效、性能好】SetFit:无需Prompts的高效小样本学习

重磅推荐专栏&#xff1a; 《Transformers自然语言处理系列教程》 手把手带你深入实践Transformers&#xff0c;轻松构建属于自己的NLP智能应用&#xff01; 1. 概要 使用预训练语言模型的小样本学习&#xff08;处理只有少量标签或没有标签的数据&#xff09;已成为比较普遍的…

(附源码)计算机毕业设计Java大学生学科竞赛报名管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven Vue 等等组成&#xff0c;B/…

【Java语言】Java类与对象的详细教程,一看就会

Java类与对象 文章目录Java类与对象1. 类与对象的初步认知2. 类和类的实例化3. 类的成员3.1 字段/属性/成员变量3.1.1认识 null3.1.2字段就地初始化3.2 方法 (method)3.3 static 关键字3.4方法调用易错区分4. 封装4.1 private实现封装4.2 getter和setter方法5.构造方法5.1 基本…

【密码学基础】Oblivious Transfer(不经意传输)

头一次开始学密码学相关的东西&#xff0c;未来的主要研究方向包括了隐私计算&#xff0c;即隐私保护下的机器学习算法。 0 举个实际的例子 引用博客OT&#xff08;Oblivious Transfer&#xff0c;不经意传输&#xff09;协议详解提到的例子&#xff0c;我们这里考虑1-out-of-…

美团应届生面试第一问:Object o = new Object()占用多少字节?

文章目录工具查看内存分配Java内存模型访问对象方式GC为什么Survivor要分为两个区域&#xff08;S0和S1&#xff09;&#xff1f;Survivor 为什么不分更多块呢&#xff1f;对象的生命周期小知识工具查看内存分配 Object o new Object();占用多少字节&#xff0c;我们借助open…

重要公告 | 论坛域名更换,请务必及时收藏

论坛的小伙伴们&#xff1a; 为进一步规范网站域名&#xff0c;自2022年11月16日起&#xff0c;“西门子低代码开发者论坛”的域名由&#xff1a;https://forum.mendix.tencent-cloud.com/&#xff0c;正式变更为&#xff1a;https://marketplace.siemens.com.cn/low-code-com…

Kamiya丨Kamiya艾美捷人和动物LBP ELISA说明书

Kamiya艾美捷人和动物LBP ELISA预期用途&#xff1a; 人和动物LBP ELISA已被开发用于定量测定天然和血清&#xff0c;血浆和培养基中的重组人LBP。也适用于牛&#xff0c;猪&#xff0c;兔和狗LBP。仅供研究使用。不用于诊断程序。 Kamiya艾美捷人和动物LBP ELISA原理&#xf…

地理计算 | 计算两个坐标点射线的交点(前方交会)

1 前言 前方交会--- 又称为测角交会&#xff0c;是指从相邻两个已知点向待定点观测两个水平角&#xff0c;用以计算待定点的坐标。 如图所示&#xff0c;点 A、B 的坐标已知。 通过观测角 A 和角 B 求出点 P 坐标的定位方法被称之为“角度前方交会”&#xff1b; 通过观测方…

汽车租赁系统毕业设计,汽车租赁管理系统设计与实现,毕业设计论文毕设作品参考

功能清单 【后台管理员功能】 广告管理&#xff1a;设置小程序首页轮播图广告和链接 留言列表&#xff1a;所有用户留言信息列表&#xff0c;支持删除 会员列表&#xff1a;查看所有注册会员信息&#xff0c;支持删除 资讯分类&#xff1a;录入、修改、查看、删除资讯分类 录入…

代码随想录训练营day46, 单词拆分和多重背包

今天就这一道题, 但还是有难度的 单词就是物品, 字符串s就是背包, 单词能否组成字符串s, 就是问物品能不能把背包装满 确定dp数组含义: 字符串长度为i的话, dp[i]为true, 表示可以拆分, j是分割指针确定递推公式: 如果确定dp[j]是true, 且[j , i]这个区间的子串出现在字典里,…

案例-Shell定时采集数据到HDFS

1. 准备工作 创建日志文件存放的目录 /export/data/logs/log&#xff0c;执行命令&#xff1a;mkdir -p /export/data/logs/log 创建待上传文件存放的目录/export/data/logs/toupload&#xff0c;执行命令&#xff1a;mkdir -p /export/data/logs/toupload 查看创建的目录树结…

FSC在全球范围内增强品牌相关度,促进公众理解

【FSC在全球范围内增强品牌相关度&#xff0c;促进公众理解】 FSC品牌标识 “森林与共&#xff0c;生生不息”将逐渐精简&#xff0c;同时覆盖更多语种。 加深消费者对FSC的理解 近年来&#xff0c;FSC品牌认知度不断提高&#xff0c;超过半数的全球消费者认可并信任“小树”标…