题目描述
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。
你可以按任意顺序返回答案。
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] res = new int[2];
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (map.containsKey(target - nums[i])) {
res[0] = map.get(target - nums[i]);
res[1] = i;
} else {
map.put(nums[i], i);
}
}
return res;
}
}
小结:用Java二刷hot100的第一道题,因为一刷hot100用的是C++,发现Java竟然有些生疏了,这道题思路比较简单,有了一刷的的经验也是一下子就想到了哈希表,下面总结了Java Map相关的API还有一些遗忘的知识点。
Java Map常用API
方法/操作 | 功能说明 | 返回类型 | 特性要点 |
---|---|---|---|
put(key, value) |
键值对插入/更新(存在则覆盖) | V |
返回旧值或 null,HashMap允许null键值 |
size() |
返回键值对数量 | int |
最大值为 Integer.MAX_VALUE |
clear() |
清空所有元素 | void |
容量保留机制(如HashMap桶数组不重置) |
isEmpty() |
判断集合空状态 | boolean |
等效逻辑:size() == 0 |
get(key) |
按键查值 | V |
可能返回null(需配合containsKey 验证) |
remove(key) |
删除指定键元素 | V |
Java 8+支持条件删除:remove(key, value) |
containsKey(key) |
键存在性验证 | boolean |
哈希结构时间复杂度O(1) |
containsValue(value) |
值存在性验证 | boolean |
全表扫描,时间复杂度O(n) |
keySet() |
获取键集合视图 | Set<K> |
动态关联原数据(删除操作会同步) |
values() |
获取值集合视图 | Collection<V> |
允许重复值,不可直接增删 |
putAll(map2) |
合并映射集(重复键覆盖) | void |
非原子操作,线程不安全 |
Java不同Map的对比
特性 | HashMap | LinkedHashMap | TreeMap | ConcurrentHashMap |
---|---|---|---|---|
底层结构 | 数组+链表/红黑树 | 哈希表+双向链表 | 红黑树 | 分段锁+链表/红黑树 |
数据顺序 | 完全无序 | 插入顺序/访问顺序 | 键的自然或定制排序 | 无序 |
线程安全 | ❌ | ❌ | ❌ | ✅(CAS+分段锁) |
允许null键/值 | ✅/✅ | ✅/✅ | ❌/✅ | ❌/❌ |
时间复杂度 | O(1)(平均) | O(1)(访问) | O(log n) | O(1)(高并发优化) |
内存占用 | 低 | 中(维护链表) | 高(树节点) | 中(分段存储) |
典型场景 | 高频随机读写 | 缓存淘汰策略 | 范围查询/排序需求 | 高并发计数/缓存 |
Java 数组初始化
- 静态初始化数组
int[] ages = new int[]{12, 24, 36};
int[] ages = {12, 24, 36};
- 动态初始化数组
int[] ages = new int[3]; // {0, 0, 0}