HashMap
我们在做力扣第一题的时候,除了暴力解法之外哈希表是最优解,但是哈希表也有很多种类,比如HashSet、HashMap、数组等,那我们为什么选择HashMap呢?
在Java中,HashMap
是一个广泛使用的集合类,实现了Map
接口,用于存储键值对(即:key和val)。它基于哈希表实现,提供了快速的查找、插入和删除操作。
以下是关于HashMap
的一些重要特点和用法:
重要特点
- 键值对存储:
HashMap
存储的是键值对,其中键必须是唯一的,而值可以重复。 - 哈希表实现:内部使用哈希表来存储数据,通过键的哈希码来快速定位。
- 允许null键和null值:
HashMap
允许一个键为null
,并且允许多个值为null
。 - 非线程安全:
HashMap
不是线程安全的,在多线程环境下,需要使用Collections.synchronizedMap()
方法或者使用ConcurrentHashMap
来保证线程安全。 - 无序性:
HashMap
不保证元素的顺序,特别是它不保证该顺序恒久不变。
因为在本题中涉及到对数组元素的查找,包括元素值和下角标,所以哈希表中要存储两个值,而HashSet
只能存储单个数据,数组只能存储少量数据,只有HashMap
符合本题特征,故使用。
HashMap
的基本使用方法:
创建HashMap对象
使用构造函数创建一个HashMap
对象:
Map<String, Integer> map = new HashMap<>();
- 1
添加元素
使用put(K key, V value)
方法向HashMap
中添加键值对:
map.put("key1", 1);
map.put("key2", 2);
- 1
- 2
获取元素
使用get(Object key)
方法根据键获取对应的值:
Integer value = map.get("key1");
System.out.println(value); // 输出 1
- 1
- 2
删除元素
使用remove(Object key)
方法根据键删除对应的键值对:
map.remove("key1");
- 1
遍历元素
有多种方式可以遍历HashMap
中的元素:
-
使用
keySet()
方法遍历键:for (String key : map.keySet()) { Integer value = map.get(key); System.out.println(key + ": " + value); }
- 1
- 2
- 3
- 4
-
使用
entrySet()
方法遍历键值对:for (Map.Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + ": " + value); }
- 1
- 2
- 3
- 4
- 5
检查元素是否存在
使用containsKey(Object key)
方法检查是否包含某个键:
boolean containsKey = map.containsKey("key1");
System.out.println(containsKey); // 输出 true 或 false
- 1
- 2
获取大小
使用size()
方法获取HashMap
中键值对的数量:
int size = map.size();
System.out.println(size);
- 1
- 2
清空HashMap
使用clear()
方法清空HashMap
中的所有元素:
map.clear();
- 1
判断HashMap是否为空
使用isEmpty()
方法判断HashMap
是否为空:
boolean isEmpty = map.isEmpty();
System.out.println(isEmpty); // 输出 true 或 false
- 1
- 2
其他常用方法
putIfAbsent(K key, V value)
:如果指定的键尚未与某个值关联,则将其与给定值关联。replace(K key, V value)
:替换指定键对应的值。getOrDefault(Object key, V defaultValue)
:获取指定键对应的值,如果键不存在,则返回默认值。
两数之和(题解)
一、题目:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
- 1
- 2
- 3
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
- 1
- 2
二、思路:
- 本题可以用暴力直接双循环写出来,或者就是当我们需要查询一个元素是否出现过,或者一个元素是否在集合里的时候,就要第一时间想到哈希法。
- 此题可以理解为在一个集合中寻找是否存在一个与当前遍历数组元素相加之和等于
target
的数。 - 因为本题,我们不仅要知道元素有没有遍历过,还要知道这个元素对应的下标,需要使用
key
value
结构来存放,key
来存元素,value
来存下标,那么使用HashMap正合适。
三、代码实现:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer,Integer> map1 = new HashMap<>();// 创建HashMap对象
for(int i = 0; i < nums.length; i ++){// 遍历数组
if(map1.containsKey(target - nums[i])){// 查找当前的map中是否有满足要求的值
return new int []{i, map1.get((target - nums[i]))};// 有则返回数组
}
else{
map1.put(nums[i], i);//没有的话,把访问过的元素和下标加入Map中
// 一定要在第一遍获取HashMap的值之后在往里面添加!
}
}
return null;
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
四、注意点:
- 往HashMap里面添加的时候一定要等第一遍获取值之后再添加,因为如果
target
=6,nums[i] = 3
的话,那么就会把第一个添加的元素3返回两次造成错误。
评论记录:
回复评论: