java中set接口、哈希表、哈希值、HashSet、LinkedHashSet、方法的可变参数

news2024/9/29 7:25:36

set接口:

set接口和list接口一样,都是继承于Collection接口,它与Collection接口中的方法基本一致。特点:不允许存储重复元素,元素没有索引。它主要有两个实现类:HashSet(具有哈希表结构,实际是一个HashMap实例,它的没有顺序,但是查询速度非常快,底层也不是同步的 )和LinkedHashSet

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

// set接口:继承于Collection接口,不允许存储重复元素,且没有索引,因此不能使用带索引的方法,也不能使用普通的for遍历
// set接口主要有两个实现类:HashSet和
// 1.HashSet特点:1.不允许存储重复元素 2.没有索引,不能使用带索引的方法,也不能使用普通的for遍历 3.无序的集合,存取元素的顺序可能不同 4.底层是一个哈希表结构(查询速度非常快)
public class setInterfaceClass {
    public static void main(String[] args) {
        // 使用多态的方式创建一个HashSet集合:
        Set<Integer> st = new HashSet<Integer>();
        // 使用add方法向集合中添加元素:
        st.add(1);
        st.add(2);
        st.add(2);
        st.add(4);
        System.out.println(st); // [1, 2, 3, 4]
        // 遍历st集合:不能使用for遍历没有索引的集合:一般使用迭代器或增强for遍历没有索引的集合:
        // for (int i = 0; i < st.size();i++) {
        //    System.out.println(st[i]);
        //}
        Iterator<Integer> it = st.iterator();
        while (it.hasNext()) {
            int num = it.next();
            System.out.println(num); // 分别打印出了每个元素,但是2只打印了一次,因为存元素时不会存入重复的元素
        }
        for (int i : st) {
            System.out.println(i); // 分别打印出了每个元素,但是2只打印了一次,因为存元素时不会存入重复的元素
        };
    }
}

哈希表:

HashSet集合存储数据的结构就是使用哈希表,那么什么是哈希表?想要了解哈希表,那么就先了解哈希值。

哈希值 :一个十进制的整数,由系统随机给出(实际就是对象的地址值,但是并非物理地址,而是模拟出来的地址,在Object类中有一个hashCode方法可以获取对象的哈希值),

定义一个继承了Object的类:

// 定义一个TestClass类并继承Object
public class TestClass extends Object{
    // 点进Object查找hashCode方法可以看到源码:public native int hashCode(); 此方法没有方法体,而是有一个native,表示该方法调用了本地系统方法
}

使用TestClass类创建对象,并使用hashCode方法:

// 哈希值:一个由系统随机给出的对象整数地址值,hashCod方法可以返回这个哈希值:
public class hashCodeMethodsClass {
    public static void main(String[] args) {
        // 创建一个TestClass类的对象,又因为TestClass类继承了Object,因此可以调用hashCode方法:
        TestClass tc = new TestClass();
        int hashValue = tc.hashCode();
        System.out.println(hashValue); // 1967205423 ,每次执行都会得到不同的值

        TestClass tc2 = new TestClass();
        int hashValue2 = tc2.hashCode();
        System.out.println(hashValue2); // 42121758 ,每次执行都会得到不同的值
        System.out.println(tc == tc2); // false
 
        // 如何我们重写hashCode方法,那么返回值就一直是一个定值,虽然返回值的哈希值是相同的,但是这两个对象也是不相等的,因为物理地址不同

        // String类的哈希值:
        String s1 = new String("abc");
        String s2 = new String("abc");
        System.out.println(s1.hashCode()); // 96354
        System.out.println(s2.hashCode()); // 96354
        System.out.println(s1 == s2); // false

        // 字符串不相同,哈希值也是有可能相同的,如:
        System.out.println("重地".hashCode()); // 1179395
        System.out.println("通话".hashCode()); // 1179395
    }
}

哈希表结构:

jdk1.8之前哈希表 = 数组+链表,jdk1.8之后哈希表= 数组+ 红黑树(提高查询速度)
在这里插入图片描述
set集合不能存储重复元素的原理 :

import java.util.HashSet;

// set集合不允许存储重复元素的原理:
public class setNoRepet {
    public static void main(String[] args) {
        HashSet<String> st = new HashSet<String>();
        String s1 = new String("abc");
        String s2 = new String("abc");

        st.add(s1);
        st.add(s2);
        st.add("重地");
        st.add("通话");
        st.add("abc");

        System.out.println(st); // [重地, 通话, abc] ,每次添加元素底层都会调用hashCode计算哈希值,并将这个哈希值水平存到数组中,如果有相同的哈希值元素被添加,那么会继续调用equals方法进一步比较两个元素是否相同,如果相同则不会存储,否则会在垂直方向将元素存到对应哈希值下面
    }
}

在这里插入图片描述
HashSet存储自定义类型元素:

给HashSet中存放自定义元素时,需要重写对象中hashCode和equals方法,建立自己的比较方法,才能保证HashSet集合中的对象唯一。

自定义类:

import java.util.Objects;

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

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

    public Person() {
    }

    //  重写equals和hashCode方法代码可以alt+insert自定生成:
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

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

    public void setAge(int age) {
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }
}

使用HashSet存储自定义元素:

import java.util.HashSet;

// HashSet存储自定义元素:set集合存储元素唯一,以后如果要在HasHset中存储元素,一定要覆重写hashCode和equals方法:
public class customElementSaveHashSet {
    public static void main(String[] args) {
        Person p1 = new Person("小明",12);
        Person p2 = new Person("小明",12);
        Person p3 = new Person("小红",22);

        HashSet<Person> ps = new HashSet<>();
        ps.add(p1);
        ps.add(p2);
        ps.add(p3);
        System.out.println(p1.hashCode()); //1967205423
        System.out.println(p2.hashCode()); //42121758
        System.out.println(p3.hashCode()); //20671747
        System.out.println(ps); // [Person@13b6d03, Person@282ba1e, Person@75412c2f], 存进去了两个对象

        // 上面是没有重写hashCode方法和equals方法,会存三个值进去,下面是重写了Person类中的hashCode和equals方法的结果:
        System.out.println(p1.hashCode()); //23458766
        System.out.println(p2.hashCode()); //23458766
        System.out.println(p3.hashCode()); //23653828
        System.out.println(ps); // [Person@165f3ce, Person@168edc4]
    }
}

LinkedHashSet集合:

LinkedHashSet是一个具有可预知迭代顺序set接口的哈希表和链表的实现,继承于HashSet集合,与hashSet不同之处在于LinkedHashSet维护着一个运行于所有条目的双重链接列表,此链接列表定义了迭代顺序(按照将元素插入到set中的顺序,且插入的顺序不受set中重新插入元素影响)

import java.util.HashSet;
import java.util.LinkedHashSet;

// LinkedHashSet继承于HashSet集合,底层是一个哈希表(数组+链表/红黑树)和链表构成,可以看出是双链,其中一条是记录元素存储顺序的。
public class LinkedHashSetClass {
    public static void main(String[] args) {
        // 创建一个HashSet集合:
        HashSet<String> st = new HashSet<>();
        st.add("WWW");
        st.add("abc");
        st.add("abc");
        st.add("hello");
        System.out.println(st); // [abc, WWW, hello] ,可以看到遍历的顺序和存储的顺序是不一致且不允许重复存储的。

        // 创建一个LinkedHashSet集合:
        LinkedHashSet<String> ls = new LinkedHashSet<>();
        ls.add("WWW");
        ls.add("abc");
        ls.add("abc");
        ls.add("hello");
        System.out.println(ls); // [WWW, abc, hello] ,可以看到与HashSet集合不一致的是:元素存储迭代是有顺序的,且也是不重复
    }
}

可变参数:

在jdk1.5之后,如果定义的方法需要接收多个参数,且参数数据类型一致,那么我们可以对其传入参数简化书写:(参数类型…形参名),当方法的参数类型确定而参数个数不确定时可以使用可变参数,可变参数实际是一个数组(传递几个参数就会创建一个存几个元素的数组 )将每个参数存起来了,如:

public class VarParamClass {
    public static void main(String[] args) {
        getSum(); // 0
        getSum(2,4); // 2
    }
    // 一个方法的可变参数列表只能有一个参数,也就是说可变的参数只能有一个:
    public static void getSum(int...num) {
        System.out.println(num.length);
    };

    // 如果有多个参数,其中有一个可变参数,那么这个可变参数放到最后面试可行的:
    public static void getResult(String s,int n, Boolean b, int...num) {
        System.out.println(num.length);
    };

    // 当有多个参数时,可变参数不能放到其他位置,只能放到末尾:
    // public static void getReut(int...num,String s,int n, Boolean b) {
    //    System.out.println(num.length);
    //};
}

提示:本文图片等素材来源于网络,若有侵权,请发邮件至邮箱:810665436@qq.com联系笔者删除。
笔者:苦海

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

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

相关文章

微服务框架 SpringCloud微服务架构 9 初识 Docker 9.2 Docker 与虚拟机的差别

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式&#xff0c;系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构9 初识 Docker9.2 Docker 与虚拟机的差别9.2.1 Docker 与虚拟机9.2.2 总结…

基于Android的二维码识别系统的研究与实现(eclipse开发)

目 录 1 Android系统开发背景与意义 1 1.1 Android系统平台的出现 1 1.2 Android系统的发展 1 1.3 Android系统架构的介绍 1 1.4 Android开放系统 3 1.5 Android系统的特点 3 2 二维码识别系统背景介绍 3 2.1 二维码识别系统背景 3 2.1.1 二维码技术产生的背景 3 2.1.2 二维码分…

图像压缩原理-JPEG

搬来一个基础啊 给自己看~~ 非技术指正勿扰 图像的格式有很多种&#xff0c;比如PNG&#xff0c;JPEG等等&#xff0c;但当我们把一张图用工具变成各种其他格式时&#xff0c;其在计算机文件系统显示的文件大小各不一样&#xff0c;但是当你打开显示时&#xff0c;从视觉角度…

Android进阶之路 - Json解析异常

在App与H5交互时&#xff0c;有一个调原生分享的需求&#xff0c;交互方面没有问题&#xff0c;因为分享需要多值&#xff0c;所以采用json进行传递&#xff0c;在app接收进行解析时遇到了这个解析异常 Value &#xfeff; of type java.lang.String cannot be converted to JS…

【操作系统一】图解TCP/IP模型+实战

【操作系统一】OSI模型和TCP/IP模型一、OSI模型1、什么是OSI模型2、osi七层参考模型3、我更想介绍TCP/IP模型二、TCP/IP模型1、TCP/IP模型起源2、TCP/IP模型是五层还是四层&#xff1f;3、两层TCP/IP模型4、传输层&#xff08;也叫传输控制层&#xff09;4.1 TCP4.3、三次握手4…

【算法面试题汇总】LeetBook列表的算法面试题汇总---动态规划题目及答案

整理不易留个小心心呗&#x1f970; 如果有更好的或者是我有错的地方还请各位大佬指出哦 有些是copy的还望不要介意 动态规划至少有k个重复字符的最长子串二叉树中的最大路径和最长连续序列打家劫舍完全平方数最长上升子序列*零钱兑换矩阵中的最长递增路径至少有k个重复字符的最…

java计算机毕业设计ssm民宿管理系统设计7lky4(附源码、数据库)

java计算机毕业设计ssm民宿管理系统设计7lky4&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

Linux服务器上Neo4j的安装、迁移

目录 1、环境 2、下载 3、修改配置 4、启动及其他命令 5、客户端访问&#xff1a; 6、数据迁移 1、环境 Neo4j是基于Java的图形数据库&#xff0c;运行Neo4j需要启动JVM进程&#xff0c;因此必须安装JAVA SE的JDK。 neo4j版本&#xff1a;neo4j-community-3.5.6 2、下…

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda

使用 Learner Lab - 使用 API Gateway 触发 AWS Lambda AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;如何进入 Learner Lab 请参考 使用 Learner Lab …

第十三章 DFS与BFS(保姆级教学!!超级详细的图示!!)

第十三章 DFS与BFS一、深度优先搜索1、什么是DFS&#xff1f;2、DFS代码模板&#xff08;1&#xff09;问题&#xff1a;&#xff08;2&#xff09;分析&#xff1a;&#xff08;3&#xff09;模板&#xff1a;3、DFS代码分析二、广度优先搜索1、什么是BFS&#xff1f;2、BFS代…

就是把一个数组中相同类别数据,组成新的数组

效果图如上&#xff0c;就是把一个数组中相同类别数据&#xff0c;组成新的数组&#xff0c;每个数组最后加一个空对象&#xff0c;对象对应的格式要做些许改变 分店 品牌 业绩(元) 订单个数 单值(元) {{item.shopname}} {{item.shopname}} {{item.shopname}} {{item.shopname}…

《InnoDB引擎九》InnoDB关键特性-自适应哈希索引

InnoDB 关键特性 InnoDB存储引擎的关键特性包括&#xff1a; Insert Buffer (插入缓冲)Double Write (两次写)Adaptive Hash Index (自适应哈希索引)Async IO (异步IO)Flush Neighbor Page (刷新领接页) 这些特性为InnoDB存储引擎带来了更好的性能以及更高的可靠性。 自适应哈…

猿如意开发工具|emeditor

写在前面 昨天升了下系统&#xff0c;可以下载了&#xff0c;我就试了试 正文 在客户端里搜索我所需要的工具&#xff0c;就可以搜出来 这里我已经下好了&#xff0c;直接点开文件就好了 再点开文件 点击下一步&#xff0c;接下来还有几个步骤&#xff0c;都点下一步就可以了…

【HBuilder X】解决HBuilder X内置浏览器显示过大影响使用

1- 前言 不知道宝子们有没有遇到过这种情况&#xff0c;小媛发现自己的内置浏览器过大&#xff0c;很大&#xff0c;很丑&#xff0c;占了半个屏幕&#xff0c;像下图那样。 也试了几种方法&#xff0c;比如&#xff1a; 看自己的版本不是最新&#xff0c;或者和其他人的不一样…

嫁给程序员老公,我后悔了

01 在我还没长开的时候&#xff0c;就常听人说&#xff0c;有两种男人不能嫁&#xff1a;一种是兵哥哥&#xff0c;另一种是程序员。前者见不着&#xff0c;后者死的早。 一想到不等头发花白&#xff0c;就要踟蹰独行&#xff0c;我就害怕的厉害。所以&#xff0c;很长一段时…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java高校教室管理系统9y8cv

相信很多和我一样的同学&#xff0c;因为实习&#xff0c;因为考研和考公等等&#xff0c;来不及做毕业设计&#xff0c;双专业的话 到时肯定忙不过来。提前做好准备吧&#xff0c;能自己完成的尽量自己完成&#xff0c;尽量不要找别人。自己的毕业前的一次大作业。努力完成也有…

Java项目:ssm高校党员管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 高校党员信息管理系统&#xff0c;分为普通用户和管理员两种角色。 普通用户登录后主要功能有&#xff1a; 我的中心:首页、个人资料、修改密…

广州蓝景分享—开发人员都知道的JavaScript技巧

JavaScript包含各种对典型编程思想有用的一些技巧&#xff0c;在实际开发中&#xff0c;我们通常希望减少代码行数&#xff1b;因此&#xff0c;今天这些技巧代码希望可以帮助到你。 现在我们就开始今天的内容吧。 1、与Javascript对象相关的 01)、对象解构 将对象的值解构为…

Vue2.0简讲!

Vue2.0简讲 Draven入门1.1、响应式渲染1.1.0、Vue创建1.1.1、指令(7)1.1.2、class与style绑定HTML Class对象语法数组语法绑定内联样式对象语法数组语法1.1.3、条件渲染v-if else-iftemplate v-if1.1.4、列表渲染v-forkey数组更新检测列表渲染Vue2列表渲染Vue3过滤应用(模糊查询…

机器学习与数据挖掘——前言

如果有兴趣了解更多相关内容&#xff0c;欢迎来我的个人网站看看&#xff1a;瞳孔空间 这是从老师的PPT里面提取出来的&#xff0c;知识点分布比较零散&#xff0c;可能他做PPT的时候也没想那么多。 一&#xff1a;机器学习 机器学习的定义&#xff1a;一个计算机程序被称为…