Hashmap的简单学习

对于HashMap在IDEA中使用的简单了解:

存储的内容是键值对(key-value)映射

HashMap<E,E>Sites = new HashMap<E,E>();

·添加数据:put(key,value)

·访问数据:get(key)

·删除集合中所有元素:clear()

·删除元素:remove(key)

·计算大小:size()

·迭代遍历:

       for(Integer i:Sites.keySet())

{

System.out.println("key:"+i+"value:"+Sites.get(i));

}


当提到HashMap时,通常指的是一种用于存储键值对的数据结构,其中每个键都是唯一的,并且可以通过键来快速检索对应的值。HashMap是一个非常重要且广泛使用的数据结构,它提供了高效的插入、删除和查找操作。

以下是关于HashMap的基本概念和用法:

1. 基本概念

  • 键值对(Key-Value Pair):HashMap 存储的基本单位,每个键都唯一且与一个值相关联。

  • 哈希函数(Hash Function):将键映射到具体存储位置的算法。它通过计算键的哈希码(一个整数)来实现。

  • 哈希表(Hash Table):实际存储哈希映射的数据结构,通常是一个数组,每个元素是一个链表或红黑树(在Java 8之后的版本中)。

  • 装载因子(Load Factor):哈希表在扩容前允许的最大装载因子。装载因子越大,哈希表的填充程度可以越高,但会增加冲突的可能性。

1.1 哈希表

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

哈希表的关键思想是使用哈希函数,将键 key 映射到对应表的某个区块中。我们可以将算法思想分为两个部分:

向哈希表中插入一个关键码值:哈希函数决定该关键字的对应值应该存放到表中的哪个区块,并将对应值存放到该区块中。

在哈希表中搜索一个关键码值:使用相同的哈希函数从哈希表中查找对应的区块,并在特定的区块搜索该关键字对应的值。
 

哈希表(Hash Table):通过键 key 和一个映射函数 Hash(key) 计算出对应的值 value,把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

哈希函数(Hash Function):将哈希表中元素的关键键值映射为元素存储位置的函数。

哈希冲突(Hash Collision):不同的关键字通过同一个哈希函数可能得到同一哈希地址。

哈希表的两个核心问题是:「哈希函数的构建」 和 「哈希冲突的解决方法」。

常用的哈希函数方法有:直接定址法、除留余数法、平方取中法、基数转换法、数字分析法、折叠法、随机数法、乘积法、点积法等。

常用的哈希冲突的解决方法有两种:开放地址法和链地址法。

2. 常见操作

  • 插入(Insertion):将一个键值对添加到HashMap中。如果键已经存在,将会替换对应的值。

  • 删除(Deletion):根据键删除对应的键值对。

  • 查找(Lookup):根据键查找对应的值。

3. 碰撞解决

由于哈希函数的有限性,不同的键可能会产生相同的哈希码,这就是所谓的“碰撞”。

常见的碰撞解决方法包括:

  • 链地址法:在哈希表的每个槽(桶)中,使用一个链表来存储具有相同哈希码的键值对。

  • 开放地址法:当发生碰撞时,线性地探测下一个可用的槽。

  • 再哈希(Rehashing):在发生碰撞时,使用另一个哈希函数来寻找一个新的位置。

4. 实际应用

HashMap在实际编程中应用广泛,特别是对于需要快速查找、插入和删除的场景:

  • 缓存实现:通过将计算结果存储在HashMap中,可以避免重复计算。

  • 数据库索引:在数据库查询时,可以使用HashMap作为索引来快速定位数据。

  • 词频统计:可以使用HashMap来统计文本中各个单词出现的频率。

5.例题

HashMap获取字符“asdkljflasdjfl”出现的个数。

import java.util.*;//引入java内所有java类
public class second_work {
    public static void main(String[] args){
        String s="asdkljflasdjfl";
        char ch[]=s.toCharArray();
        //.toCharArray()可将字符串转化为字符数组,是String类的一个方法,
        // 用于将字符串转换为一个字符数组。它返回一个新的字符数组,该数组包含字符串中的所有字符,
        // 且顺序与原字符串保持一致。
        Map<Character,Integer> map=new HashMap<>();
        for(char c:ch)//基于范围的for循环它可以用来遍历一个容器或数组中的元素,其中c是一个迭代变量,
                      // 用于存储每个元素的值。在这个循环中,每次迭代都会将容器或数组中的下一个元素赋值给迭代变量c,
                      // 直到遍历完所有元素为止
        {
            if(map.containsKey(c)){
                map.put(c,map.get(c)+1);
            }
            else {
                map.put(c,1);//添加数据
            }//Map.containsKey(key)该方法判断Map集合
            // 对象中是否包含指定的键名。如果Map集合中包含指定的键名,则返回true,否则返回false。
        }
        for(Map.Entry<Character,Integer> entry:map.entrySet())//迭代遍历
        {
            System.out.println(entry.getKey()+"("+entry.getValue()+")");
        }
    }
}

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值