力扣-1.两数之和
题目描述
给定一个整数数组 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}