HashSet和HashMap

news2025/1/12 12:06:33

目录

一、HashSet

1、HashSet简单介绍

 2、HashSet的常用方法

3、HashSet保证元素不重复的原理 

 二、HashMap

1、HashMap简单介绍

 2、HashMet的常用方法

 3、使用LinkedHashMap集合保证元素添加顺序

 三、HashSet和HashMap的区别和联系

1、区别

2、联系

一、HashSet

1、HashSet简单介绍

说到HsahSet就要先说Set接口

Set 接口和List接口一样,同样继承自Collection接口,它与Collection接口中的方法基本一致,并没有对 Collection 接口进行功能上的扩充,只是比Collection接口更加严格。与List 接口不同的是,Set接口中的元素无序,并且都会以某种规则保证存入的元素不出现重复

Set接口主要有两个实现类,分别是 HashSet 和TreeSet。其中,HashSet是根据对象的哈希值来确定元素在集合中的存储的位置,因此具有良好的存取和查找性能。TreeSer则是以二叉树的方式来存储元素,它可以实现对集合中的元素进行排序。

 HashSet

HashSet是 Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的。当向 HashSet集合中添加一个元素时,首先会调用该元素的hashCode()方法来确定元素的存储位置,然后再调用元素对象的equals()方法来确保该位置没有重复元素

 2、HashSet的常用方法

 常用方法代码演示:

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

public class Main {
    public static void main(String[] args) {
        //使用HashSet集合时先要指定泛型中具体的包装类
        HashSet<Integer> hashSet=new HashSet<>();

        //向hashSet中添加元素   add()
        hashSet.add(12);
        hashSet.add(34);
        hashSet.add(56);

        //判断hashSet中是否有12和89两个元素        contains()
        System.out.println(hashSet.contains(12));    //true
        System.out.println(hashSet.contains(89));    //false

        //hashSet中元素的个数       size()
        System.out.println(hashSet.size());          //3

        //Iterator迭代器遍历集合
        Iterator<Integer> iterator=hashSet.iterator();
        while (iterator.hasNext()){
            Integer i=iterator.next();
            System.out.println(i);                   //输出顺序与添加顺序不同
            //System.out.println(iterator.next());
        }
        //foreach遍历集合
        hashSet.forEach(o-> System.out.println(o));  //输出顺序与添加顺序不同
        //hashSet.forEach(System.out::println);

        //删除hashSet中的某个元素     remove()
        System.out.println(hashSet.remove(12));   //true     删除成功返回true
        System.out.println(hashSet.remove(89));   //false    删除失败返回false
        System.out.println(hashSet.size());          //2

        //克隆Hashset实例的浅层副本:元素本身不被克隆。
        hashSet.add(12);
        Object clone=hashSet.clone();
        System.out.println(clone);                   //输出格式为[元素1,元素2]  输出顺序与添加顺序不同 

        //删除前 判断hashSet是否为空
        System.out.println(hashSet.isEmpty());      //false

        //清空hashSet中的所以元素
        hashSet.clear();

        //删除后 判断hashSet是否为空
        System.out.println(hashSet.isEmpty());      //true
    }
}

3、HashSet保证元素不重复的原理 

HashSet集合之所以能确保不出现重复的元素,是因为它在存入元素时做了很多工作。当调用 HashSet集合的add()方法存入元素时,首先调用当前存入元素的hashCode()方法获得对象的哈希值,然后根据对象的哈希值计算出一个存储位置;如果该位置上没有元素则直接将元素存入;如果该位置上有元素存在,则会调用equals()方法让当前存入的元素次和该位置上的元素进行比较。如果返回的结果为false就将该元素存入集合;返回的结果为true则说明有重复元素,就不添加到其中。

若想保证输入元素与输出元素顺序保存一致,可以使用LinkedHashSet集合(与HashSet相比,使用区别并不大)

 

 二、HashMap

1、HashMap简单介绍

HashMap集合是 Map接口的一个实现类,它用于存储键值映射关系,该集合的键和值允许为空,但键不能重复且集合中的元素是无序的。HashMap底层是由哈希表结构组成的,其实就是“数组+链表”的组合体,数组是HashMap的主体结构,链表则主要是为了解决哈希值冲突而存在的分支结构。正因为这样特殊的存储结构,HashMap集合对于元素的增、删、改、查操作表现出的效率都比较高。

水平方向以数组结构为主体并在竖直方向以链表结构进行结合的就是 HashMap中的哈希表结构。在哈希表结构中,水平方向数组的长度称为HashMap集合的容量(capacity),竖直方向每个元素位置对应的链表结构称为一个桶(bucket),每个桶的位置在集合中都有对应的桶值,用于快速定位集合元素添加、查找时的位置。

 HashMap 几乎等同于HashTable ,但是因为HashTable使用同步锁所以线程安全;

 2、HashMet的常用方法

  常用方法代码演示:

import java.util.*;

public class Main {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap=new HashMap<>();
        //1、向hashMap中添加元素
        hashMap.put(1,"cat");
        hashMap.put(2,"tom");
        hashMap.put(3,"house");
        hashMap.put(4,"bord");

        //2、查看键对象是否存在
        System.out.println(hashMap.containsKey(1));           //true
        //3、查看是否有相应键与该值对应
        System.out.println(hashMap.containsValue("cat"));     //true

        //4、获取集合中的 键对象和值对象 集合
        System.out.println(hashMap.keySet());                 //[1, 2, 3, 4]
        System.out.println(hashMap.values());                 //[cat, tom, house, bord]

        //5、替换指定键对象映射的值
        hashMap.replace(1,"cat1");
        System.out.println(hashMap);                          //{1=cat1, 2=tom, 3=house, 4=bord}

        //6、删除指定键对象映射的键值对元素
        System.out.println(hashMap.size());                  //4
        hashMap.remove(4);
        System.out.println(hashMap);                         //{1=cat1, 2=tom, 3=house}
        System.out.println(hashMap.size());                  //3

        //7、hashMap实例的浅拷贝
        Object map=hashMap.clone();
        System.out.println(map);                            //{1=cat1, 2=tom, 3=house}

        //8、查看该key是否存在,若存在返回其value,否则返回defaultValue
        System.out.println(hashMap.getOrDefault(3,"No"));   //house
        System.out.println(hashMap.getOrDefault(4,"No"));   //No

        //9、遍历hashMap
        // 1)forEach遍历
        hashMap.forEach((key,value)-> System.out.println(key+" "+value));   //1 cat1 2 tom  3 house
        //2)Iterator迭代器遍历集合
        Set<Integer> keySet=hashMap.keySet();
        Iterator<Integer> iterator=keySet.iterator();
        while (iterator.hasNext()){
            Object key=iterator.next();
            Object value=hashMap.get(key);
            System.out.println(key+" "+value);        //1 cat1 2 tom  3 house
        }
        /*简单for循环也可以
        for (Object key : keySet) {
            Object value = hashMap.get(key);
            System.out.println(key + " " + value);
        }*/

        //8、删除hashMap中的所有映射关系,并判断是否为空
        System.out.println(hashMap.isEmpty());             //false
        hashMap.clear();
        System.out.println(hashMap.isEmpty());             //false
    }
}

 3、使用LinkedHashMap集合保证元素添加顺序

import java.util.*;
public class Main {
    public static void main(String[] args) {
        HashMap<Integer, String> hashMap=new HashMap<>();
        //1、向hashMap中添加元素
        hashMap.put(2,"tom");
        hashMap.put(1,"cat");
        hashMap.put(4,"bord");
        hashMap.put(3,"house");
        System.out.println("hashmap:");
        hashMap.forEach((key,value)-> System.out.println(key+":"+value));
        LinkedHashMap<Integer,String> linkedHashMap=new LinkedHashMap<>();
        linkedHashMap.put(2,"tom");
        linkedHashMap.put(1,"cat");
        linkedHashMap.put(4,"bord");
        linkedHashMap.put(3,"house");
        System.out.println("linkedHashMap:");
        linkedHashMap.forEach((key,value)-> System.out.println(key+":"+value));
    }
}

 

 三、HashSet和HashMap的区别和联系

1、区别

HashSelHashMap
HashSet实现了Set接口HashMap实现了Map接口
HashSet仅仅存储对象HashMap储存键值对
使用add()方法将元素放入set中使用put()方法将元素放入map中
HashSct使用成员对象来计算hashcodc值,对于两个对象来说hashCode可能相同,所以equals()方法用来判断对象的相等性,如果两个对象不同的话,那么返回false,即添加该元素HashMap中使用键(key)对象来计算
hashCode
HashSet较HashMap来说比较慢HashMap比较快,因为是使用唯一的键
来获取对象
HashSet允许具有单个空值。HashMap允许单个null键和任意数量的空值。
HashSet不允许重复元素,这意味着您无法在HashSet中存储重复值。HashMap不允许有重复键,但它可以有重复值

2、联系

对于HashSet而言,它是基于HashMap实现的,HashSet底层使用HashMap来保存所有元素,更确切的说,HashSet中的元素,只是存放在了底层HashMap的key上, 而value使用一个static final的Object对象标识。

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

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

相关文章

Web3 入门教程 1 —— 认知篇

如果你也喜欢Web3&#xff0c;希望在这做些有趣的、有意义的事情&#xff0c;那么我希望这篇文章可以帮助到你。 其实在很早之前&#xff0c;我就计划写一篇《Web3 新手教程》&#xff0c;送给想要进入 Web3 或者刚刚进入 Web3 的小伙伴&#xff0c;但是考虑到两点原因&#xf…

力扣 53. 最大子数组和 --- C语言求解

题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 题解&#xff1a; 此题可以用动态规划和分治法。 方法1. 动态…

《深度学习进阶 自然语言处理》第七章:seq2seq介绍

文章目录7.1 seq2seq模型介绍7.1.1 seq2seq的原理7.1.2 时序数据转换简单举例7.2 seq2seq模型实现7.3 seq2seq模型改进7.3.1 反转输入数据(Reverse)7.3.2 偷窥(Peeky)7.4 seq2seq模型的应用7.5 总结之前文章链接&#xff1a; 开篇介绍&#xff1a;《深度学习进阶 自然语言处理…

MySQL Hash Join前世今生

GreatSQL社区原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。GreatSQL是MySQL的国产分支版本&#xff0c;使用上与MySQL一致。作者&#xff1a;nw MySQL Hash Join前世今生 因工作需要&#xff0c;对MySQL Hash Join的内部实现做了一些探索和实践&#x…

【Hack The Box】linux练习-- Mango

HTB 学习笔记 【Hack The Box】linux练习-- Mango &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f36…

01 基于yum方式部署Kubernetes集群

文章目录1.实验环境准备2.部署单节点的etcd1.在192.168.221.133节点安装etcd服务2.修改etcd的配置文件3.启动etcd并设置开机自启动4.检查集群的健康状态5.操作etcd服务3. master 组件部署1.在192.168.221.133节点安装master服务2.配置apiserver组件3.配置master的组件4.启动服务…

m基于MIMO中继通信和非规则LDPC编译码的matlab仿真,其中波束形成为SVD,MMSE,中继包括AF,DF,CF

目录 1.算法概述 2.仿真效果预览 3.MATLAB部分代码预览 4.完整MATLAB程序 1.算法概述 即在非规则LDPC下&#xff0c;且源节点1个&#xff0c;中继一个&#xff0c;目标节点一个&#xff0c;天线也是1的情况对比三种中继协作协议的误码率。 做非规则LDPC码的以编码协作形…

computed计算方法不被调用的原因;只有在使用时才会被调用

目录 一、问题 二、解决方法 三、总结 一、问题 1.需求&#xff1a;根据组件外部一个变量的值来确定 组件内部的操作。组件外部可以更改filetime的值&#xff0c;filetime有值时这个界面可以操作&#xff0c;否则不可以操作。 我一想 用computed就可以了呀&#xff0c;动态…

Rockwell EDI 850 采购订单报文详解

罗克韦尔&#xff08;Rockwell&#xff09;自动化(中国)有限公司(NYSE: ROK)是全球最大的致力于工业自动化与信息化的公司&#xff0c;致力于帮助客户提高生产力&#xff0c;以及世界可持续发展。罗克韦尔自动化总部位于美国威斯康星州密尔沃基市&#xff0c;在全球80多个国家设…

超级明星们的人物化身 NFT 将来到 The Sandbox 元宇宙

超级明星队 NFT 将在 The Sandbox 的全球运动村体验中亮相&#xff01; ​ The Sandbox 与 Web3 公司 Forj 达成合作&#xff0c;还获得了独特的 BAYC 无聊猿人物化身的授权。 NFTSTAR 在 The Sandbox 建造了新的体验&#xff0c;巴西足球明星内马尔&#xff08;Neymar JR.&am…

高项 质量管理论文

三个过程 项目质量管理包括执行组织确定质量政策、目标与职责的各过程和活动&#xff0c;从而使项目满足其预定的需求。项目质量管理在项目环境内使用政策和程序&#xff0c;实施组织的质量管理体系&#xff1b;并以执行组织的名义&#xff0c;适当支持持续的过程改进活动。项目…

【408专项篇】C语言笔记-第五章(一维数组与字符数组)

第五章&#xff1a;一维数组与字符数组 第一节&#xff1a;一维数组 1. 数组的定义 C语言提供的数组&#xff0c;通过一个符号来访问多个元素。 特点&#xff1a; 具有相同的数据类型。使用过程中需要保留原始数据。 数组是构造数据类型。所谓数组&#xff0c;是指一组具…

深入理解Python生成器和yield

深入理解Python生成器和yield 我在《Python性能优化指南–让你的Python代码快x3倍的秘诀》中有提到&#xff0c;在处理大文件或大数据集时用生成器可以提高性能。很多朋友会问&#xff1a;“为什么用生成器就能提升性能呢&#xff1f;”。今天&#xff0c;我就带大家深入看一…

Web2 vs. Web3,社交工具的发展会有什么变化?

社交&#xff0c;是不同主体传递、反馈社会信息的主要方式之一。从古代的飞鸽传书、近代的书信往来&#xff0c;到现代大家手机里都必不可少的社交 APP&#xff0c;人们对于社交的需求和实现方式都在不断更新和变化。 当前&#xff0c;Web2 社交赛道已经非常成熟。为吸引更多流…

前端文件流相关

XMLHttpRequest // XMLHttpRequest对象用于与服务器交互 // XMLHttpRequest可以在不刷新页面的情况下请求特定URL, 获取数据 // XMLHttpRequest属性responseType是一个枚举字符串值, 用于指定响应中包含的数据类型 // 如果将 responseType的值设置为空字符串, 则使用 text 作为…

Linux网络编程基础

Linux网络编程基础一、基础概念的介绍1.1 网卡的介绍1.2 mac地址 六个字节 48位1.3 ip地址 32位 四个字节 ipv41.4 端口二、网络模型2.1 OSI七层模型2.2 TCP/IP模型2.3 协议2.4 网络通信过程2.4 arp协议2.5 网络设计模式一、基础概念的介绍 1.1 网卡的介绍 1.2 mac地址 六个字…

开源轻量堡垒机——Teleport的安装配置和使用

一、堡垒机简介 1.1、现状 目前随着信息化的发展&#xff0c;越来越多的企业开始有更多的服务器、业务资源&#xff0c;有更多样化的员工&#xff0c;拥有更多的账号&#xff1b;导致访问混乱化&#xff0c;越权访问难以规范&#xff1b;甚至恶意命令攻击事件&#xff08;如删…

【数据结构】带头节点双向循环链表

目录 顺序表和链表的区别 带头双向循环链表分析 带头双向循环链表结构&#xff1a; 创建一个节点 哨兵位头节点 打印链表中的值 在pos前插入 删除pos位置的节点 尾插 尾删 头插&#xff1a; 头删 链表元素查找 总代码 List.h文件 List.c文件 test.c文件 顺序表和…

科技云报道:历经四年,RPA走向同质化?

科技云报道原创。 经过多年发展&#xff0c;全球RPA市场已经初具规模。 据Transparency Market Research研究预测&#xff0c;预计到2024年&#xff0c;全球RPA市场规模将达到50亿美元&#xff0c;实现61.3%的年复合增长率。 RPA在亚洲市场起步晚于欧美市场&#xff0c;但从2…

SpringCloud系列(二)Ribbon 负载均衡的原理及详细流程

关于负载均衡这个概念在上一篇文章中有所提到&#xff0c;在消费者远程调用之前有一个重要的环节就是负载均衡&#xff0c;那么为什么要进行负载均衡呢&#xff1f;其原理及实现流程如何&#xff1f;   其实 Ribbon 负载均衡可以认为是一种策略&#xff0c;也可以说是某种规则…