Java中的Set集合和Hash值和TreeSet的使用

Set集合的特点

不包含重复元素的集合

没有带索引的方法,所以不能使用普通for循环遍历

HashSet对集合的迭代顺序不作任何保证

Set集合的遍历

有两种方式遍历一种是迭代器一种是增强for

package dayhou40.day49;
​
import java.util.HashSet;
import java.util.Set;
​
public class SetTest {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("hello");
        set.add("hi");
        set.add("hello");
        set.add("last");
        for (String s : set) {
            System.out.println(s);
        }
    }
}
​

Set集合没有什么 特殊的功能需要我们学习它的功能全部来自Collection集合

哈希值

哈希值:是根据jdk对象的地址或者字符或者数字算出来的的int类型的数值

Object对象中的public int hashCode:返回对象的哈希码值

package dayhou40.day50;
​
public class student {
    private String name;
    private int age;
​
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public student() {
    }
​
    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;
    }
}
​
package dayhou40.day50;
​
public class hashCodeTest {
    public static void main(String[] args) {
        student s1 = new student("张三", 12);
        System.out.println(s1.hashCode());
        System.out.println(s1.hashCode());
        student s2 = new student("张三", 12);
        System.out.println(s2.hashCode());
​
    }
}
​

我们由上面可以得到结论:

同一个对象多次调用hashCode()方法返回的Hash值是相同的

默认情况下,实现不同对象的Hash值是不同的

通过重写Hashcode方法得到的Hash值是相同的

package dayhou40.day50;
​
import java.util.Objects;
​
public class student {
    private String name;
    private int age;
​
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public student() {
    }
​
    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 int hashCode() {
        return 0;
    }
}
​

注意String重写了object中的hashcode

HashSet保证集合元素唯一性的原因

如果Hash表未初始化,就对其进行初始化

根据对象的哈希值计算对象的存储位置,如果该位置没有元素,就存储元素

如果有元素则存入的元素和以前的元素进行比较Hash值

如果Hash值不同,会继续执行下去,把元素添加进来

如果哈希值相同则通过equals()方法比较如果都相同则不存储,否则就存储

LinkedHashSet

特点

1.哈希表和链表实现的set接口,具有可预测的迭代次数

2.由链表保证元素有序,也就是说元素的存储顺序和取出顺序是一致的

3.由哈希表保证元素的唯一性

package dayhou40.day51;
​
import java.util.LinkedHashSet;
​
public class LinkedhashsetTest {
    public static void main(String[] args) {
        LinkedHashSet<String> set = new LinkedHashSet<>();
        set.add("hi");
        set.add("hello");
        set.add("world");
        set.add("world");
        for (String s : set) {
            System.out.println(s);
        }
    }
}
​

TreeSet集合

Treeset集合的特点

  1. 元素有序性(这个有序性不是指存入和取出的顺序一致而是按照一定的规则进行排序,具体方法取决于构造方法)

    1. TreeSet():根据元素的自然排序进行排序

    2. TreeSet(Comparator comparator):根据指定的比较器排序

  2. 由于没有索引所以不能使用普通for遍历

  3. 是set集合不存在重复元素

自然排序

package dayhou40.day51;
​
import java.util.TreeSet;
​
public class TreesetTest {
    public static void main(String[] args) {
        TreeSet<Integer> set = new TreeSet<>();
        set.add(30);
        set.add(20);
        set.add(30);
        set.add(10);
        set.add(90);
        for (Integer integer : set) {
            System.out.println(integer);
        }
    }
}
​

Comparable的使用

package dayhou40.day52;
​
public class student {
    private String name;
    public int age;
​
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public student() {
    }
​
    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;
    }
}
​
package dayhou40.day52;
​
import java.util.TreeSet;
​
public class comparableTest {
    public static void main(String[] args) {
        TreeSet<student> set = new TreeSet<>();
        student s1 = new student("张三", 22);
        student s2 = new student("李四", 23);
        student s3 = new student("王五", 20);
        set.add(s1);
        set.add(s2);
        set.add(s3);
        for (student student : set) {
            System.out.println(student.getName()+" "+student.getAge());
        }
    }
}
​

结果出现了报错

这是为什么呢? 因为自然排序实现了compareTo方法 而在我们的学生类中我们没有继承comparable接口重写compareTo方法

这个规则如果返回值是0那么就会存储一个元素

这个规则如果返回值是1那么就会按照升序排序

这个规则如果返回值是-1那么就会按照降序排序

那么如何按照年龄的升序排序呢?

package dayhou40.day52;
​
public class student implements Comparable<student>{
    private String name;
    public int age;
​
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public student() {
    }
​
    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 int compareTo(student o) {
        return this.getAge()-o.getAge();
    }
}
​

如果想要升序this就放在前面,如果想要降序this就放在后面

ComparaTo方法的使用

package dayhou40.day52;
​
public class student{
    private String name;
    public int age;
​
    public student(String name, int age) {
        this.name = name;
        this.age = age;
    }
​
    public student() {
    }
​
    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;
    }
​
​
}
​
​
package dayhou40.day52;
​
import java.util.Comparator;
import java.util.TreeSet;
​
public class comparableTest {
    public static void main(String[] args) {
        TreeSet<student> set = new TreeSet<>(new Comparator<student>() {
            @Override
            public int compare(student o1, student o2) {
              int sum1= o1.getAge()-o2.getAge();
              int sum2= o1.getAge()==o2.getAge()?o1.getName().compareTo(o2.getName()):sum1;
              return sum2;
            }
        });
        student s1 = new student("张三", 22);
        student s2 = new student("李三", 22);
        student s3 = new student("李四", 23);
        student s4 = new student("王五", 20);
        set.add(s1);
        set.add(s2);
        set.add(s3);
        set.add(s4);
        for (student student : set) {
            System.out.println(student.getName()+" "+student.getAge());
        }
    }
}
​

我们在TreeSet<>(new Comparator<student>()然后进行排序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言程序设计基础(跟知乎学)

1、C语言是一种结构化程序设计语言。三种基本结构&#xff1a;顺序、选择、循环。 2、在C语言中&#xff0c;程序的模块化是利用函数实现的。 3、计算机不能直接理解高级语言&#xff0c;只能直接理解机器语言&#xff0c;所以必须要把高级语言翻译成机器语言&#xff0c;计算机…

C++ | Leetcode C++题解之第51题N皇后

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<string>> solveNQueens(int n) {auto solutions vector<vector<string>>();auto queens vector<int>(n, -1);auto columns unordered_set<int>();auto diag…

Error: The project seems to require yarn but it‘s not installed.

在使用yarn serve启动vue2项目是发生报错信息 报错信息&#xff1a; 解决方法&#xff1a; 1、 红色箭头行&#xff0c;ctrl单击 进入env.js文件 2、注释行 if (result && !exports.hasYarn()) throw new Error(The project seems to require yarn but its not ins…

Oracle VM virtual Box 安装虚拟机并网络连接宿主机且能ping通外网

新建虚拟机 参考镜像下载连接&#xff1a;支持centos7.8及其以上版本&#xff1a;​ ​http://mirrors.aliyun.com/centos/7/isos/x86_64/CentOS-7-x86_64-Minimal-1908.iosOracle VM virtual Box新建虚拟机&#xff0c;按照下图所示新建虚拟机&#xff1a; 1.新建虚拟机 2.配…

IDEA安装插件Apipost方便调试

进入IDEA的File->sttings->plugins 进入搜索Apipost即可安装插件 使用小箭头即可得到URL&#xff0c;点击进入操作即可

C# Onnx yolov8 pig detection

C# Onnx yolov8 pig detection 目录 效果 项目 模型 代码 数据集 下载 效果 项目 模型 Model Properties ------------------------- date&#xff1a;2024-04-28T15:13:10.750689 description&#xff1a;Ultralytics YOLOv8n model trained on C:\Work\yolov8\datas…

深入探索计算机视觉:高级主题与前沿应用的全面解析

引言 计算机视觉&#xff0c;作为人工智能领域的一个重要分支&#xff0c;旨在让计算机能够“看”懂世界&#xff0c;理解和解释视觉场景。随着深度学习技术的迅猛发展&#xff0c;计算机视觉已经在许多领域取得了显著的进展&#xff0c;如自动驾驶、安防监控、医疗诊断等。在…

NodeJs[黑马笔记简洁版]

是什么 怎么用 模块 模块化标准 CommonJs(标准语法)默认 ECMAscript 内置模块 fs模块 path模块 http模块 自定义模块 第三方包 包概念 npm 包管理器 总结

正点原子[第二期]ARM(I.MX6U)裸机篇学习笔记-1.2

前言&#xff1a; 本文是来自哔哩哔哩网站上视频“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”的学习笔记&#xff0c;在这里会记录下正点原子Linux ARM MX6ULL 开发板根据配套的哔哩哔哩学习视频所作的实验和笔记内容。本文大量的引用了正点原子哔哔哩网…

【C++】二叉树的进阶

二叉树的进阶 二叉搜索树概念操作实现创建树形结构拷贝构造函数构造函数析构函数赋值运算符重载循环版本查找插入删除 递归版本查找插入删除 应用K模型KV模型性能分析 二叉树进阶面试题二叉树创建字符串二叉树的分层遍历I最近公共祖先二叉搜索树与双向链表前序遍历与中序遍历构…

数据结构:实验八:数据排序

一、 实验目的 &#xff08;1&#xff09;掌握各种排序算法的过程和算法设计。 &#xff08;2&#xff09;体会各种排序算法的性能。 二、 实验要求 编写程序分别采用直接插入排序算法 、折半插入排序算法、冒泡排序算法、快速排序算法&#xff0c;实现对任意一组整型数据…

WEB攻防-.NET特性常见漏洞

目录 前置知识&#xff1a; DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例&#xff1a; 验证代码文件有没有可以绕过&#xff08;Cookie&Session&…

免费调用阿里云通义千问(qwen-1.8b-chat)大模型API

目录 前言通义千问开通注意 APi接口最后 前言 免费的GPT接口国内的使用一段实践就会失效&#xff0c;阿里云的qwen-1.8b-chat限时免费&#xff0c;可对接&#xff01;目前本账号小助手也是对接了该模型 通义千问 通义千问&#xff0c;是基于阿里巴巴达摩院在自然语言处理领域…

pytest测试基础

assert 验证关键字 需要pahton版本大于3.6&#xff0c;因为有个工具pip3;因为做了映射&#xff0c;所以下面命令pip3即pip pip install -U pytest -U参数可选&#xff0c;是如果已安装可更新。 如果上述demo变化 通过验证代码&#xff0c;测试环境没问题。…

服务器数据恢复—存储硬盘坏道,指示灯亮黄色的数据恢复案例

服务器数据恢复环境&故障&#xff1a; 一台某品牌EqualLogic PS系列某型号存储&#xff0c;存储中有一组由16块SAS硬盘组建的RAID5磁盘阵列&#xff0c;RAID5上划分VMFS文件系统存放虚拟机文件。存储系统上层一共分了4个卷。 raid5阵列中磁盘出现故障&#xff0c;有2块硬盘…

关于远程桌面端口的优化措施的建议

在信息技术的世界中&#xff0c;远程桌面连接已成为企业、教育和个人用户之间共享信息、协作工作的重要工具。而这一切的背后&#xff0c;都离不开远程桌面端口&#xff08;RDP&#xff0c;Remote Desktop Protocol Port&#xff09;的支持。RDP端口不仅关乎到远程访问的顺畅性…

RK3568 学习笔记 : busybox 制作 ext4最小根文件系统

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 AtomPi-CA1 使用 VMware 虚拟机 ubuntu 20.04 编译 busybox&#xff0c;并制作 emmc 中的 ext4 根文件系统 rootfs 下载 busybox 可以在 https://busybox.net/downloads/snapshots/ 下载最新的 busybox&#xff…

蓝桥杯——分巧克力

思路非常简单&#xff0c;就是一个二分法。 注意一下l和r的取值&#xff0c;就可以了。 // 如何进行切分巧克力&#xff1a;横纵除法。例如&#xff1a;一块6*5的&#xff0c;欲切为3*3的小块&#xff0c;横&#xff1a;6/2 3&#xff1b;纵&#xff1a;5/31.所以可以切成3*…

学习100个Unity Shader (15) ---透明+双面渲染

文章目录 效果shader理解参考 效果 shader Shader "Example/AlphaBlendBothSided" {Properties{_Color ("Main Tint", Color) (1, 1, 1, 1)_MainTex ("Texture", 2D) "white" {}_AlphaScale ("Alpha Scale", Range(0, 1)…

第十五届蓝桥杯省赛第二场C/C++B组C题【传送阵】题解(AC)

解题思路 由于 a a a 数组是一个 1 1 1 到 n n n 的一个排列&#xff0c;那么形成的一定是如下形式&#xff1a; 一定会构成几个点的循环&#xff0c;或者是几个单独的点。 从任意点开始&#xff0c;如果能进入一个循环&#xff0c;一定可以将整个循环的宝藏都拿走&#x…