目录
一. HashMap概述
HashMap
是 Java 中的一个非常重要的类,它实现了 Map
接口,用于存储键值对(key-value pairs)。HashMap
是基于哈希表的 Map 接口实现,它允许空键(null key)和空值(null value),并且不保证映射的顺序。
二. HashMap特点
- 基于哈希表:
HashMap
使用哈希表来存储数据,因此它具有很快的查找速度,通常为常数时间复杂度 O(1)。 - 键值对存储:
HashMap
存储的是键值对,其中每个键映射到一个值。 - 键的唯一性:
HashMap
中的键是唯一的,不允许重复的键存在。如果尝试插入具有相同键的另一个值,旧值将被新值替换。 - 允许空值和空键:
HashMap
允许键或值为null
。 - 不保证顺序:
HashMap
不保证元素的顺序,这意味着元素的顺序可能会在每次使用时发生变化。 - 非同步:
HashMap
不是线程安全的。如果需要线程安全的HashMap
,可以使用Collections.synchronizedMap
方法包装它,或者使用ConcurrentHashMap
。
三. HashMap构造方法
HashMap
提供了多种构造方法,允许你指定初始容量和加载因子等参数:
HashMap()
:创建一个初始容量为 16,加载因子为 0.75 的空HashMap
。HashMap(int initialCapacity)
:创建一个指定初始容量和默认加载因子(0.75)的空HashMap
。HashMap(int initialCapacity, float loadFactor)
:创建一个指定初始容量和加载因子的空HashMap
。HashMap(Map<? extends K, ? extends V> m)
:创建一个包含映射关系与指定 Map 相同的HashMap
。
四. HashMap的常用方法
put(K key, V value)
:将指定的值与此映射中的指定键关联。get(Object key)
:返回指定键所映射的值;如果映射中不包含该键,则返回null
。remove(Object key)
:如果存在一个键的映射关系,则将其从映射中移除。keySet()
:返回映射中包含的键的Set
视图。values()
:返回映射中包含的值的Collection
视图。entrySet()
:返回映射中包含的键值映射关系的Set
视图。clear()
:从映射中移除所有键值对。
五. 使用注意事项
- 当
HashMap
中的元素数量超过容量和加载因子的乘积时,HashMap
会自动进行扩容,这涉及到重新计算哈希值和重新分配元素,可能会导致性能下降。 HashMap
的keySet()
、values()
和entrySet()
方法返回的集合视图支持对原HashMap
的修改。- 在多线程环境中,如果需要线程安全的
HashMap
,可以使用Collections.synchronizedMap
方法包装它,或者使用ConcurrentHashMap
。
六. 代码示例
代码示例中主要使用了一些map操作方法
package com.example.demo01;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 文件名:HashMapMian
* 创建者:
* 创建时间:2024-11-02
* 描述:HashMap常用操作方式示例
*/
public class HashMapMian {
public static void main(String[] args) {
Map<String,Integer> map = new HashMap<>();
//1.调用put()方法增添数据
map.put("小红",19);
map.put("小明",25);
map.put("小黑",27);
map.put("小白",21);
//2.根据key获取value
System.out.println(map.get("小明"));
//3.调用remove()方法删除数据
map.remove("小明");
//4.调用containsKey()方法查看是否存在指定的键
boolean b = map.containsKey("小红");
System.out.println(b);
//5.调用containsValue()方法查看是否存在指定的值
boolean bbb = map.containsValue(19);
//6.调用isEmpty()方法查看集合是否为空
boolean empty = map.isEmpty();
System.out.println(empty);
//7.获取key列表
Set<String> keyedSet = map.keySet();
System.out.println("key: "+keyedSet);
//8.获取所有值
Collection<Integer> values = map.values();
System.out.println(values);
//用 Java8 流来处理值,value求和
int sumOfAges = map.values().stream()
.mapToInt(Integer::intValue)
.sum();
System.out.println("求和: "+sumOfAges);
// 过滤出所有大于 25 的年龄
Collection<Integer> filteredValues = map.values().stream()
.filter(value -> value > 25)
.collect(Collectors.toList());
System.out.println("大于 25 的年龄: "+filteredValues);
//9.清空map集合
map.clear();
System.out.println(map.isEmpty());
}
}