文章目录
- 一、定义
- 二、核心方法
- 三、实例演示
- 3.1、方法示例
- 3.2、get()方法注意点!
一、定义
Java 的 HashMap 是 Java 集合框架中的一个非常重要的类,它实现了 Map 接口。HashMap基于哈希表的数据结构,允许使用键-值对存储数据。这种存储方式使得HashMap 提供了非常快速的插入、查找和删除操作,平均时间复杂度为O(1)。以下是 HashMap 的一些关键特性:
-
键的唯一性:HashMap 中的键必须是唯一的,不允许有重复的键,但值可以重复。
-
无序性:HashMap 不保证映射的顺序,特别是它不保证顺序会随时间保持不变。
-
允许 null 值和 null 键:HashMap 允许一个 null 键和多个 null 值。但是,null 键只能有一个。
-
非同步:HashMap 是非同步的,如果多个线程同时访问一个 HashMap 实例,并且至少有一个线程从结构上修改了该映射,那么它必须保持外部同步。
-
性能:由于基于哈希表,HashMap 提供了非常高效的查找、插入和删除操作。
二、核心方法
Java HashMap 常用方法列表如下:
方法 | 描述 |
---|---|
put(K key, V value) | 将指定的键-值对放入映射中。如果该映射以前包含该键的映射关系,则替换其旧值。 |
get(Object key) | 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null。 |
remove(Object key) | 如果存在该键的映射关系,则将其从映射中移除。 |
containsKey(Object key) | 如果此映射包含指定键的映射关系,则返回 true。 |
containsValue(Object value) | 如果此映射将一个或多个键映射到指定值,则返回 true。 |
size() | 返回此映射中的键-值对数量。 |
isEmpty() | 如果此映射不包含键-值对映射关系,则返回 true。 |
keySet() | 返回此映射中包含的键的 Set 视图。 |
values() | 返回此映射中包含的值的 Collection 视图。 |
entrySet() | 返回此映射中包含的键-值映射关系的 Set 视图。 |
三、实例演示
3.1、方法示例
下面写的Java程序使用了常用的HashMap方法。
package com.example.demo;import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");// 访问元素System.out.println(map.get("EQUIP_ID"));// 是否包含键System.out.println(map.containsKey("BEGIN_TIME"));// 是否包含值System.out.println(map.containsValue("123456"));// 键值对的数量System.out.println(map.size());// HashMap是否为空System.out.println(map.isEmpty());// 获取所有键的Set集合Set<String> keySets = map.keySet();System.out.println(keySets);// 获取所有值的Collection集合Collection<String> valueSets = map.values();System.out.println(valueSets);// 返回所有的键值对Set集合Set<Map.Entry<String, String>> keyvalueSets = map.entrySet();System.out.println(keyvalueSets);// 移除键值对map.remove("EQUIP_ID");System.out.println(map.size());}
}
控制台的输出也非常的合理,这也比较通俗易懂。
123456
true
true
3
false
[END_TIME, BEGIN_TIME, EQUIP_ID]
[2024-11-25 18:12, 2024-11-22 13:52, 123456]
[END_TIME=2024-11-25 18:12, BEGIN_TIME=2024-11-22 13:52, EQUIP_ID=123456]
2Process finished with exit code 0
3.2、get()方法注意点!
1、看到get方法的详解:返回指定键映射到的值,如果此映射不包含键的映射,则返回null。但返回null不代表不存在该键,也有可能是这个键的值就为null。
2、打个比方:我取出map中不存在的键,返回的就是null,空对象。
public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");System.out.println(map.get("RMC_TIME"));System.out.println(map.remove("EQUIP_ID"));}}
3、或者,我直接在插入键值对的时候,值就为null,那么取出来也是null。
public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");map.put("POS_CODE", null);System.out.println(map.get("RMC_TIME"));System.out.println(map.get("POS_CODE"));}
}
4、那如果我取出不存在key的value,然后插入到一个新的key中,再取出的value是null还是空字符串呢?答案是为null。
因为get得到的值为null,然后插入的键值对就是(VALUE, null)
。
public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("VALUE", map.get("VALUE"));System.out.println(map.get("VALUE"));}
}
5、在大数据处理过程中,和键值对列表打交道是最多的,为了避免取出的值为null
或者为""
,我们需要进行判断:
public class MapTest {public static void main(String[] args) {// 创建一个 HashMap 实例Map<String, String> map = new HashMap<>();// 添加键值对map.put("EQUIP_ID", "123456");map.put("BEGIN_TIME", "2024-11-22 13:52");map.put("END_TIME", "2024-11-25 18:12");map.put("POS_CODE", "");map.put("VALUE", "");if (map.get("VALUE") != null && !map.get("VALUE").isEmpty()) {System.out.println(map.get("VALUE"));}}
}
认识越多的人,越觉得思维方式真的很不一样,多取长补短,多反思总结,执行力是核心竞争力。