【java数据结构】HashMap和HashSet

这篇具有很好参考价值的文章主要介绍了【java数据结构】HashMap和HashSet。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一.认识哈希表:

1.1什么是哈希表?

1.2哈希表的表示: 

1.3常见哈希函数:

 二.认识HashMap和HashSet:

2.1关于Map.Entry的说明:,>

2.2Map常用方法说明:

2.3HashMap的使用案例:

2.4Set常见方法说明:

 2.5HashSet使用案例:

源码:


一.认识哈希表:

1.1什么是哈希表?

之前的学习中,如果我们要查找一个元素,肯定是要经过比较的,那有没有一种办法,可以不用经过比较,直接就能拿到呢?

如果我们能构造一种存储结构,通过一种函数 (hashFunc) 使元素的存储位置与函数得出的关键码之间能够建立一一映射的关系,那么在查找某个元素的时候,就能通过这个函数来很快的找到该元素所在的位置。

这种函数就叫做哈希(散列)函数,上述所说构造出来的结构,叫做哈希表或者称为散列表。

 哈希表简介:

哈希表(Hash Table):也叫做散列表。是根据关键码值(Key Value)直接进行访问的数据结构。哈希表通过「键 key 」和「映射函数 Hash(key) 」计算出对应的「值 value」,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做「哈希函数(散列函数)」,存放记录的数组叫做「哈希表(散列表)」。

1.2哈希表的表示: 

【java数据结构】HashMap和HashSet,数据结构

 举个栗子:为了记录一个班的学生的信息,分别包括学号和姓名。我们就可以用哈希表(数组加链表)来记录,这里学号(关键值key)通过哈希函数得到一个数组下标,这个下标就是这个学生信息存放在对应数组中的位置,同时学生的信息(姓名和学号)叫做键值对,又称作Entry

【java数据结构】HashMap和HashSet,数据结构

 使用方法:

  • 向哈希表中插入一个关键码值:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。
  • 在哈希表中搜索一个关键码值:使用相同的哈希函数从哈希表中查找对应的区块,并在特定的区块搜索该关键字对应的值。
  • 实现哈希表: 数组+链表 或者  数组+二叉树

1.3常见哈希函数:

  • 直接定值法--(常用):取关键字的某个线性函数为散列地址:HashKey= A*Key + B 优点:简单、均匀 缺点:需要事先知道关 键字的分布情况 使用场景:适合查找比较小且连续的情况
  • . 除留余数法--(常用) : 
    设散列表中允许的 地址数为 m ,取一个不大于 m ,但最接近或者等于 m 的质数 p 作为除数,按照哈希函数: Hash(key) = key% p(p<=m), 将关键码转换成哈希地址
  • 例如: 【java数据结构】HashMap和HashSet,数据结构

 二.认识HashMap和HashSet:

【java数据结构】HashMap和HashSet,数据结构

 HashMap和HashSet是Java集合框架中的两个常用类,它们都实现了Set接口,但在实现原理和用途上有一些区别。

  • HashMap:HashMap是基于哈希表的实现,它使用键值对(key-value)的方式存储数据HashMap允许存储null键和null值,并且可以存储重复的值,但不允许重复的键。HashMap内部使用哈希函数将键映射到哈希表的索引位置,以实现快速的插入、删除和查找操作。HashMap的查找操作是通过键来进行的,因此可以根据键快速地获取对应的值。
  • HashSet:HashSet也是基于哈希表的实现,它存储唯一的元素,不允许重复值HashSet允许存储null值,但只能存储一个null元素。HashSet内部使用哈希函数将元素映射到哈希表的索引位置,以实现快速的插入、删除和查找操作。HashSet的查找操作是通过元素来进行的,因此可以根据元素快速地判断是否存在于集合中。

2.1关于Map.Entry<K, V>的说明:

Map.Entry<K, V> Map 内部实现的用来存放 <key, value> 键值对映射关系的内部类 ,该内部类中主要提供了 <key, value>的获取, value 的设置以及 Key 的比较方式。
方法 解释
K getKey ()
返回 entry 中的 key
V getValue ()
返回 entry 中的 value
V setValue(V value)
将键值对中的 value 替换为指定 value
注意: Map.Entry<K,V> 并没有提供设置 Key 的方法

2.2Map常用方法说明:

【java数据结构】HashMap和HashSet,数据结构

2.3HashMap的使用案例:

基础操作:

Map<String, String> m = new HashMap<>();
        // put(key, value):插入key-value的键值对
        // 如果key不存在,会将key-value的键值对插入到map中,返回null
        m.put("林冲", "豹子头");
        m.put("鲁智深", "花和尚");
        m.put("武松", "行者");
        m.put("宋江", "及时雨");
        String str = m.put("李逵", "黑旋风");
        m.remove("武松","行者");

        System.out.println("map的大小(size):" + m.size());
        System.out.println("map中的元素:" + m);

        System.out.println("这时str为空: " + str);// put(key,value): 注意key不能为空,但是value可以为空
        m.put("无名", null);      // key如果为空,会抛出空指针异常
        System.out.println("当前map的大小: " + m.size());

        str = m.put("李逵", "铁牛");
        System.out.println("返回旧的value值: " + str);
        System.out.println("得到Key所对应的value值: " + m.get("李逵"));

运行结果:

【java数据结构】HashMap和HashSet,数据结构

GetOrDefault()和containKey(key):
//GetOrDefault(): 如果key存在,返回与key所对应的value,如果key不存在,返回一个默认值
        System.out.println("=========================================");
        System.out.println("李逵存在,返回key对应的value: " + m.getOrDefault("李逵", "牛牛"));
        System.out.println("史进不存在,返回一个默认值: " + m.getOrDefault("史进", "九龙纹"));
        System.out.println("=========================================");
        //containKey(key):检测key是否包含在Map中,时间复杂度:O(logN)
        System.out.println(m.containsValue("豹子头"));
        System.out.println(m.containsValue("行者"));

运行结果:

【java数据结构】HashMap和HashSet,数据结构

三种遍历方法:

System.out.println("-----key ------value -----Entry的遍历方法:----------");
        System.out.println("key遍历:  ");
        for (String s : m.keySet()) {
            System.out.print(s + " ");
        }
        System.out.println();
        System.out.println("value遍历:  ");
        for (String s : m.values()) {
            System.out.print(s + " ");
        }
        System.out.println();
        System.out.println("entry遍历: ");
        for (Map.Entry<String, String> entry : m.entrySet()) {
            System.out.println(entry.getKey() + "--->" + entry.getValue());
        }

运行结果:

【java数据结构】HashMap和HashSet,数据结构

注意:

1. Map 是一个接口,不能直接实例化对象 ,如果 要实例化对象只能实例化其实现类 TreeMap 或者 HashMap
2. Map 中存放键值对的 Key 是唯一的, value 是可以重复的
3. Map 中的 Key 可以全部分离出来,存储到 Set 来进行访问 ( 因为 Key 不能重复 )
4. Map 中的 value 可以全部分离出来,存储在 Collection 的任何一个子集合中 (value 可能有重复 )
5. Map 中键值对的 Key 不能直接修改, value 可以修改,如果要修改 key ,只能先将该 key 删除掉,然后再来进行重新插入。

2.4Set常见方法说明:

方法 解释
boolean add (E e)
添加元素,但重复元素不会被添加成功
void clear ()
清空集合
boolean contains (Object o)
判断 o 是否在集合中
Iterator<E> iterator ()
返回迭代器
boolean remove (Object o)
删除集合中的 o
int size()
返回set中元素的个数
boolean isEmpty()
检测 set 是否为空,空返回 true ,否则返回 false
Object[] toArray()
set 中的元素转换为数组返回
boolean containsAll(Collection<?> c)
集合 c 中的元素是否在 set 中全部存在,是返回 true ,否则返回
false
boolean addAll(Collection<? extends
E> c)
将集合 c 中的元素添加到 set 中,可以达到去重的效果

 2.5HashSet使用案例:

System.out.println("================HashSet===============");
        Set<String> s = new HashSet<>();
        boolean isIn = s.add("apple");
        s.add("orange");
        s.add("peach");
        s.add("banana");
        System.out.println(s.size());
        System.out.println(s);
        System.out.println("add(key): 如果key不存在,则插入,返回true: " + isIn);
        isIn = s.add("apple");
        System.out.println("add(key):如果key存在,则返回false: " + isIn);
        // contains(key): 如果key存在,返回true,否则返回false
        System.out.println(s.contains("apple"));
        System.out.println(s.contains("watermelen"));
        s.remove("apple");// remove(key): key存在,删除成功返回true
        System.out.println(s);// key不存在,删除失败返回false , key为空,
        System.out.println("迭代器遍历:");
        Iterator<String> it = s.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }

运行结果:

【java数据结构】HashMap和HashSet,数据结构

注意:

1. Set 是继承自Collection的一个接口类
2. Set 中只存储了 key ,并且要求 key 一定要唯一
3. Set 的底层是使用 Map 来实现的,其使用 key Object 的一个默认对象作为键值对插入到 Map 中的
4. 实现 Set 接口的常用类有 TreeSet HashSet ,还有一个 LinkedHashSet LinkedHashSet 是在 HashSet 的基础上维护了一个双向链表来记录元素的插入次序。
5. Set 中的Key不能修改,如果要修改,先将原来的删除掉,然后再重新插入
6. Set 中不能插入nullkey

源码:

import java.util.TreeMap;
import java.util.Set;
import java.util.Map;

public class Test1 {

    public static void main(String[] args) {
        Map<String, String> m = new HashMap<>();
        // put(key, value):插入key-value的键值对
        // 如果key不存在,会将key-value的键值对插入到map中,返回null
        m.put("林冲", "豹子头");
        m.put("鲁智深", "花和尚");
        m.put("武松", "行者");
        m.put("宋江", "及时雨");
        String str = m.put("李逵", "黑旋风");
        m.remove("武松","行者");

        System.out.println("map的大小(size):" + m.size());
        System.out.println("map中的元素:" + m);

        System.out.println("这时str为空: " + str);// put(key,value): 注意key不能为空,但是value可以为空
        m.put("无名", null);      // key如果为空,会抛出空指针异常
        System.out.println("当前map的大小: " + m.size());

        str = m.put("李逵", "铁牛");
        System.out.println("返回旧的value值: " + str);
        System.out.println("得到Key所对应的value值: " + m.get("李逵"));
        //GetOrDefault(): 如果key存在,返回与key所对应的value,如果key不存在,返回一个默认值
        System.out.println("=========================================");
        System.out.println("李逵存在,返回key对应的value: " + m.getOrDefault("李逵", "牛牛"));
        System.out.println("史进不存在,返回一个默认值: " + m.getOrDefault("史进", "九龙纹"));
        System.out.println("=========================================");
        //containKey(key):检测key是否包含在Map中,时间复杂度:O(logN)
        System.out.println(m.containsValue("豹子头"));
        System.out.println(m.containsValue("行者"));

        System.out.println("-----key ------value -----Entry的遍历方法:----------");
        System.out.println("key遍历:  ");
        for (String s : m.keySet()) {
            System.out.print(s + " ");
        }
        System.out.println();
        System.out.println("value遍历:  ");
        for (String s : m.values()) {
            System.out.print(s + " ");
        }
        System.out.println();
        System.out.println("entry遍历: ");
        for (Map.Entry<String, String> entry : m.entrySet()) {
            System.out.println(entry.getKey() + "--->" + entry.getValue());
        }

        System.out.println("================HashSet===============");
        Set<String> s = new HashSet<>();
        boolean isIn = s.add("apple");
        s.add("orange");
        s.add("peach");
        s.add("banana");
        System.out.println(s.size());
        System.out.println(s);
        System.out.println("add(key): 如果key不存在,则插入,返回true: " + isIn);
        isIn = s.add("apple");
        System.out.println("add(key):如果key存在,则返回false: " + isIn);
        // contains(key): 如果key存在,返回true,否则返回false
        System.out.println(s.contains("apple"));
        System.out.println(s.contains("watermelen"));
        s.remove("apple");// remove(key): key存在,删除成功返回true
        System.out.println(s);// key不存在,删除失败返回false , key为空,
        System.out.println("迭代器遍历:");
        Iterator<String> it = s.iterator();
        while (it.hasNext()) {
            System.out.print(it.next() + " ");
        }
    }
}

结语: 写博客不仅仅是为了分享学习经历,同时这也有利于我巩固自己的知识点,总结该知识点,由于作者水平有限,对文章有任何问题的还请指出,接受大家的批评,让我改进。同时也希望读者们不吝啬你们的点赞+收藏+关注,你们的鼓励是我创作的最大动力!

【java数据结构】HashMap和HashSet,数据结构文章来源地址https://www.toymoban.com/news/detail-839803.html

到了这里,关于【java数据结构】HashMap和HashSet的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java八股文面试[数据结构]——HashMap扩容优化

         知识来源: 【2023年面试】HashMap在扩容上做了哪些优化_哔哩哔哩_bilibili  

    2024年02月11日
    浏览(31)
  • java数据结构(哈希表—HashMap)含LeetCode例题讲解

      目录 1、HashMap的基本方法 1.1、基础方法(增删改查) 1.2、其他方法  2、HashMap的相关例题 2.1、题目介绍 2.2、解题 2.2.1、解题思路 2.2.2、解题图解 2.3、解题代码 HashMap 是一个散列表,它存储的内容是键值(key-value)映射。 HashMap 的 key 与 value 类型可以相同也可以不同,根据定

    2024年02月05日
    浏览(38)
  • Java-数据结构(二)-Map:HashMap、TreeMap、LinkedHashMap

        Map是Java中常用的数据结构,它提供了一种键值对的存储方式,可以根据键来快速访问值。在本篇文章中,我将学习Java中的Map数据结构     问题是最好的老师,我将从至少以下几个方面阐述,什么是map、使用Map有什么好处、Map的底层原理、map中的key和value分别是

    2024年02月06日
    浏览(30)
  • 【数据结构】HashSet的底层数据结构

    🐌个人主页: 🐌 叶落闲庭 💨我的专栏:💨 c语言 数据结构 javaEE 操作系统 Redis 石可破也,而不可夺坚;丹可磨也,而不可夺赤。 Set 系列集合 无序:存取顺序不一致 不重复:可以去除重复 无索引:没有带索引的方法,所以不能使用普通fo循环遍历,也不能通过索引来获

    2024年03月16日
    浏览(43)
  • 数据结构---HashSet存值和取值

    HashMap实现了Map接口,而HashSet实现了Set接口。 HashMap用于存储键值对,而HashSet用于存储对象。 HashMap不允许有重复的键,可以允许有重复的值。 HashSet不允许有重复元素。 HashMap允许有一个键为空,多个值为空,HashSet允许有一个空值。 HashMap中使用put()将元素加入map中,而HashS

    2024年02月15日
    浏览(30)
  • Java HashMap 和 HashSet 的高效使用技巧

    HashMap 是一种哈希表,它存储键值对。键用于查找值,就像数组中的索引一样。 HashMap 的优势在于它可以使用任何类型作为键,并且查找速度很快。 HashMap 可以存储任何类型的键和值。例如,您可以存储 Integer 键和 String 值: HashMap 是一种强大的数据结构,可用于存储各种类型

    2024年03月11日
    浏览(35)
  • Rust 笔记:Rust 语言中哈希结构(哈希映射,HashMap)、集合(哈希集,HashSet)及其使用

    Rust 笔记 Rust 语言中映射(HashMap)与集合(HashSet)及其用法 作者 : 李俊才 (jcLee95):https://blog.csdn.net/qq_28550263?spm=1001.2101.3001.5343 邮箱 : 291148484@163.com 本文地址 :https://blog.csdn.net/qq_28550263/article/details/130876735 【介绍】:本文介绍 Rust 中哈希结构相关概念及其使用。在 R

    2024年02月09日
    浏览(38)
  • HashMap的数据结构

    HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。 JDK1.8之前的HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要

    2024年02月07日
    浏览(34)
  • 《HashMap的数据结构》

    目录 HashMap概述:  数据结构的组成: 一个键值对是如何存入该结构中: HashMap中链表和红黑树的用途和转换方式 :                     HashMap是基于哈希表的Map接口实现的,它存储的内容是键值对key,value映射。 该类无序。         在JDK1.7及以前,HashMap的数据结构是有

    2024年02月07日
    浏览(32)
  • HashMap的数据结构(超详细版)

    1.初始容量 初始容量用来规定哈希表数组的长度,默认值为16,因为16是2的整数次幂的原因,再小数据量下的情况下,能减少 哈希冲突 ,提高性能。在大存储容量数据的时候,也尽量将数组长度定义为2的幂次方,这样能更好的与索引计算公式 i=(n-1)hash 配合使用,从而提升性

    2024年03月12日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包