Logo

郎哥编程

HashMap类

2019-12-27 247

HashMap是最常用的Map接口实现类,HashMap根据键的Hash值计算元素的存储位置,并将Hash值和元素同时存储起来,程序访问该存储元素时,只需要提供Hash值就可以,其访问速速非常高效。

HashMap同HashSet类似,也是根据元素的哈希码(Hash值)进行存储的,HashMap根据每个存储对象的哈希码,用固定的算法算出它的存储索引,把存储元素存放在一个叫做散列表的相应位置中。当后加入元素的哈希码与已经加入的元素哈希码相同时,HashMap就会创建一个链表,将相同哈希码的元素存入一个链表,并将该链表的头指针存储到哈希码对应的数组元素中。HashMap存储结构如下图所示:

image.png

HashMap存储结构

 

哈希码(Hash值)计算方式通过Object类的hashcode获取,代码如下:

static final int hash(Object key) {
  int h;
  return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

代码通过hashcode的高16位实现,能保证数组的长度比较小的时候,保证高低bit都参与到hash计算中,不会有大的开销。

需要注意的是,虽然HashMap和HashSet实现的接口规范不同,但是它们底层的 Hash 存储机制完全相同。实际上,HashSet 本身就是在 HashMap 的基础上实现的。

HashMap在实际编程中,应用非常广泛。例如,在员工管理信息系统中,需要按照员工号来存储大量的员工信息,并且要考虑到查速度。这时就可以使用HashMap作为员工信息的存储结构,将员工号作为键值,员工对象作为值来存储到HashMap中。

案例1:编写一个程序,用于简单统计各个单词出现的次数,key为单词,value为次数,使用HashMap存储。

在PCoreUnit5项目新建map包,在map包下新建HashMapTest1类。代码如下:

package map;
 
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
 
/** 
* @ClassName: HashMapTest1 
* @Description: 集合框架(HashMap类)案例1
* @author 编程训练营 
* @date 
* 
*/
 
public class HashMapTest1 {
 
    /**
     * @Title: main
     * @Description: Java程序入口main方法
     * @param @param args 参数
     *
     * @return void 返回类型 @throws
     */
 
    public static void main(String[] args) {
 
       Scanner sc = new Scanner(System.in);
       System.out.println("请输入一句英语,单词间用空格隔开:");
       String sentence = sc.nextLine();
       String[] arr = sentence.split(" ");
 
       // 键代表着单词,值代表着次数
       Map<String, Integer> map = new HashMap<String, Integer>();
       for (int i = 0; i < arr.length; i++) {
           // 判断单词(key)是否在Map内
           if (!map.containsKey(arr[i])) {
              // 添加key-value键值对到map
              map.put(arr[i], 1);
           } else {
              // 单词(key)已在Map内
              int num = map.get(arr[i]);
              // 覆盖key对应的value
              map.put(arr[i], ++num);
           }
       }
       System.out.println("统计单词出现的个数,结果如下:");
       // 从map获取所有key
       Set<String> set = map.keySet();
        // 遍历key所在的set集合
       for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
           String key = iterator.next();
           // 获取指定key的value
           Integer value = map.get(key);
           System.out.println(key + "=" + value);
       }
 
    }
 
}

该程序用于简单统计各个单词出现的次数。因为HashMap存储的是键值对,因此不能用迭代器、foreach等方法遍历HashMap。如果需要遍历HashMap,可以通过HashMap的keySet方法返回HashMap中key值的集合,通过遍历Key值集合读取HashMap中的元素。程序输出结果如下图所示:

程序执行结果如下图所示:

image.png

在Map集合中,存储的元素是通过Key来进行访问的,Key是一个字符串,通过Key可以直接访问Map存储的元素。在Map集合中,Key和value是映射关系,key—value也称为键值对。

代码在线纠错(通义千问 qwen-max)

支持粘贴多个代码文件,提交后由阿里云通义千问自动分析代码漏洞、语法错误、逻辑问题并给出修改建议。
您已解锁 AI 代码纠错功能,可正常使用!

评论区

登录 后发表评论
暂无评论