哈希表
1、定义
哈希表是一种根据关键码(key)直接访问值(value)的一种数据结构。而这种直接访问意味着只要知道key就能在O(1)时间内得到value,因此哈希表常用来统计频率、快速检验某个元素是否出现过等。
//两种写法都可以
HashMap<数据类型,数据类型> 哈希表名=new HashMap<数据类型,数据类型>()
HashMap<数据类型,数据类型> 哈希表名=new HashMap<>()
// 使用钻石操作符
HashMap<String, Integer> map1 = new HashMap<>();
HashMap<String, Integer> map2 = new HashMap<String, Integer>();
2、相关操作
在 Java 中,哈希表通常是通过 HashMap
类来实现的。HashMap
是一个基于哈希表的 Map 接口的实现,它允许存储键值对,并提供快速的查找、插入和删除操作。以下是一些常见的哈希表操作及其示例:
1. 创建 HashMap
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// 创建一个 HashMap
HashMap<String, Integer> map = new HashMap<>();
}
}
2. 插入元素
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
3. 获取元素
int age = map.get("Alice"); // 返回 30
4. 检查键是否存在
boolean hasBob = map.containsKey("Bob"); // 返回 true
5. 检查值是否存在
boolean hasValue = map.containsValue(25); // 返回 true
6. 删除元素
map.remove("Charlie"); // 删除键为 "Charlie" 的元素
7. 遍历 HashMap
// 遍历键值对
for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
// 遍历键
for (String key : map.keySet()) {
System.out.println("Key: " + key);
}
// 遍历值
for (Integer value : map.values()) {
System.out.println("Value: " + value);
}
8. 获取大小
int size = map.size(); // 返回当前 HashMap 中的键值对数量
9. 清空 HashMap
map.clear(); // 清空所有元素
10. 检查是否为空
boolean isEmpty = map.isEmpty(); // 返回 true 如果 HashMap 为空
示例代码
以下是一个完整的示例,展示了上述操作:
import java.util.HashMap;
public class HashMapExample {
public static void main(String[] args) {
// 创建一个 HashMap
HashMap<String, Integer> map = new HashMap<>();
// 插入元素
map.put("Alice", 30);
map.put("Bob", 25);
map.put("Charlie", 35);
// 获取元素
System.out.println("Alice's age: " + map.get("Alice"));
// 检查键是否存在
System.out.println("Contains Bob? " + map.containsKey("Bob"));
// 删除元素
map.remove("Charlie");
System.out.println("After removing Charlie: " + map);
// 遍历 HashMap
for (HashMap.Entry<String, Integer> entry : map.entrySet()) {
System.out.println("Key: " + entry.getKey() + ", Value: " + entry.getValue());
}
// 获取大小和清空 HashMap
System.out.println("Size of map: " + map.size());
map.clear();
System.out.println("Is map empty? " + map.isEmpty());
}
}
以上代码展示了如何使用 HashMap
进行基本的操作。如果你有其他问题或需要更详细的信息,请告诉我!
3、相关习题
- 数组中出现次数超过一半的数字
- 题目描述:给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。
- 实例:
输入:[1,2,3,2,2,2,5,4,2]返回值:2
- 思考:记录每个数出现的次数,返回次数大于数组长度一半的数。
- 代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型一维数组
* @return int整型
*/
public int MoreThanHalfNum_Solution (int[] numbers) {
// write code here
//创建哈希表
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<numbers.length;i++){
//将第一次出现的值放入哈希表
if(!map.containsKey(numbers[i])){
map.put(numbers[i],1);
}
//计数数字出现的次数
else{
map.put(numbers[i],map.get(numbers[i])+1);
}
if(map.get(numbers[i])>numbers.length/2){
return numbers[i];
}
}
return 0;
//判断数字次数出现的值是否大于数组的一般,如果大于,返回值
}
}
2、数组中只出现一次的数字
- 描述:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
- 实例:
- 输入:
[1,4,1,6]
返回值:[4,6]
说明:返回的结果中较小的数排在前面 - 思考:只出现一次的两个数字,需要排序
- 代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型一维数组
*/
public int[] FindNumsAppearOnce (int[] nums) {
// write code here
//创建哈希表,存放所有数出现的次数,把超过1的数据去除。
int[] result = new int[2];
int index = 0;
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(!map.containsKey(nums[i])){
map.put(nums[i],1);
}else{
map.remove(nums[i]);
}
}
//遍历哈希表,取出key
for (Integer key : map.keySet()) {
result[index++] = key; // 将找到的数字放入结果数组
}
//数组中的两个数排序
if (result[0] > result[1]) {
int temp = result[0];
result[0] = result[1];
result[1] = temp;
}
return result;
}
}
3、缺失的第一个正数
- 描述:给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数
- 实例:
- 思考:不考虑小于0的;然后看1,2,3,4,5…那个没有出现,较好的看元素是否出现,用哈希表比较好。
- 代码:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型一维数组
* @return int整型
*/
public int minNumberDisappeared (int[] nums) {
// write code here
//创建一个哈希表
//把所有数存在表里,不存0一下的;
HashMap<Integer,Integer> map=new HashMap<>();
for(int i=0;i<nums.length;i++){
if(nums[i]>0){
map.put(nums[i],1);
}
}
//遍历所有整数
int res=1;
while(map.containsKey(res)){
res++;
}
return res;
}
}