Java集合框架系列——HashMap

这篇博客详细介绍了HashMap的基本概念,如其作为AbstractMap的子类,实现了Cloneable和Serializable接口。HashMap采用链地址法存储结构,初始容量为16并按2的幂扩容,元素无序排列。它不允许键为null但允许值为null。文章还涵盖了HashMap的常用API、遍历方式,并提供了代码示例。
摘要由CSDN通过智能技术生成

直通车:Java集合框架系列目录

  1. 基本概念
  2. 继承关系
  3. 结构特点
  4. 常用API
  5. 遍历方式
  6. 代码示例

1.基本概念

HashMap:一种存储键/值关联的数据结构。

2.继承关系

这里写图片描述

HashMap是一个继承于AbstractMap的散列表,它存储的内容是键值对(key/value)映射。
HashMap实现了Cloneable接口,即覆盖了函数clone(),能被克隆。
HashMap实现java.io.Serializable接口,意即HashMap支持序列化,能通过序列化传输。

3.结构特点

  • 采用“链地址法”
    链地址法,意即数组加链表的结合。在每个数组元素上都有一个链表结构,HashMap通过HashCode对其要插入(put)或查找(get)的元素进行数组元素的快速匹配。
  • 数组初始大小为16,后每次扩容一定是2的幂
    当向容器添加元素的时候,会判断当前容器的元素个数,如果大于等于阈值—即当前数组的长度乘以加载因子的值,就会自动扩容。(加载因子默认为0.75)
  • 元素无序排列
    元素处于哪个“哈希桶”(“桶”即数组元素)取决于键(Key)的哈希值(HashCode)。元素具体在链表的哪个位置只能通过遍历得到。
  • 存储键/值对
    键(Key)与值(Value)共同存储在entry节点中,HashMap存储entry节点。
    HashMap最多只允许一条记录的为Null(多条会覆盖),允许多条记录的为 Null。
  • 不是线程安全的
    可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap

4.常用API

API含义
clear()从 Map 中删除所有映射
remove(Object key)从 Map 中删除键和关联的值
put(Object key, Object value)将指定值与指定键相关联
putAll(Map t)将指定 Map 中的所有映射复制到此 map
entrySet()返回 Map 中所包含映射的 Set 视图。Set 中的每个元素都是一个 Map.Entry 对象,可以使用 getKey() 和 getValue() 方法(还有一个 setValue() 方法)访问后者的键元素和值元素
keySet()返回 Map 中所包含键的 Set 视图。删除 Set 中的元素还将删除 Map 中相应的映射(键和值)
values()返回 map 中所包含值的 Collection 视图。删除 Collection 中的元素还将删除 Map 中相应的映射(键和值)
get(Object key)返回与指定键关联的值
containsKey(Object key)如果 Map 包含指定键的映射,则返回 true
containsValue(Object value)如果此 Map 将一个或多个键映射到指定值,则返回 true
isEmpty()如果 Map 不包含键-值映射,则返回 true
size()返回 Map 中的键-值映射的数目

5.遍历方式

1.遍历HashMap的键值对

第一步:根据entrySet()获取HashMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer integ = null;
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
    Map.Entry entry = (Map.Entry)iter.next();
    // 获取key
    key = (String)entry.getKey();
        // 获取value
    integ = (Integer)entry.getValue();
}

2.遍历HashMap的键

第一步:根据keySet()获取HashMap的“键”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
        // 获取key
    key = (String)iter.next();
        // 根据key,获取value
    integ = (Integer)map.get(key);
}

3.遍历HashMap的值

第一步:根据value()获取HashMap的“值”的集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象
// map中的key是String类型,value是Integer类型
Integer value = null;
Collection c = map.values();
Iterator iter= c.iterator();
while (iter.hasNext()) {
    value = (Integer)iter.next();
}

6.代码示例

package com.sort;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

/**
 * 统计一句英语的简单统计各个单词出现的次数
 * 
 * @author Owner
 * 
 */
public class MapTest3 {

    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++) {
            if (!map.containsKey(arr[i])) {
                map.put(arr[i], 1);
            } else {
                // 说明map中,存在该元素
                int num = map.get(arr[i]);
                map.put(arr[i], ++num);
            }
        }

        System.out.println("统计单词出现的个数,结果如下:");

        Set<String> set = map.keySet();

        for (Iterator<String> iterator = set.iterator(); iterator.hasNext();) {
            String key = iterator.next();

            Integer value = map.get(key);

            System.out.println(key + "=" + value);
        }
    }
}

如有谬误或不完善之处,恳请斧正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值