什么是 HashMap?

    简单点来说,HashMap 是一个散列表,它的存储内容是键值对(key—value)映射

    我们需要用算术操作将键(key)转化为数组的索引来访问数组中的键值对,这个算术操作其实就是找到一个合适的散列函数来将查找的键转化为数组的一个索引。理想情况下,不同的键能转化为不同的索引值,不过,如果出现两个或多个键都会散列到相同的索引值,就会发生散列冲突(也叫哈希冲突),具体解决方法会另外介绍。

    HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,访问速度很快。其实哈希表的主干就是数组,因为在不考虑哈希冲突的情况下,仅仅只需要一次定位就能找到,这和数组的特点很像。

    HashMap 的 key 和 value 的类型可以相同也可以不同,可以都是字符串 (String) 型的,也可以 key 是整型 (Integer)、value 是字符串型的。HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类

HashMap 的使用及方法

这里我们简单的介绍一下 HashMap 类的一些方法。

HashMap 类位于 java.util 包中,使用前需要引用它,语法格式如下:

java
import java.util.HashMap;		// 引入HashMap类

我们创建一个实例,HashMap 对象 pairs ,整型的 key 和字符串型的 value :

java
HashMap<Integer,String> pairs = new HashMap<Integer,String>();

添加元素

添加键值对可以使用 put() 方法

java
import java.util.HashMap;

public class test{
public static void main(String[] args) {
// 创建 HashMap 对象 pairs
HashMap<Integer, String> pairs = new HashMap<Integer, String>();
// 添加键值对
pairs.put(1 , "one");
pairs.put(2 , "two");
pairs.put(3 , "three");
pairs.put(4 , "four");
System.out.println(pairs);
}
}

输出结果:

java
{1=one, 2=two, 3=three, 4=four}

访问元素

我们可以使用 get(key) 方法来获取 key 对应的 value

java
import java.util.HashMap;

public class test{
public static void main(String[] args) {
// 创建 HashMap 对象 pairs
HashMap<Integer, String> pairs = new HashMap<Integer, String>();
// 添加键值对
pairs.put(1 , "one");
pairs.put(2 , "two");
pairs.put(3 , "three");
pairs.put(4 , "four");
System.out.println(pairs.get(3)); // 获取对应的 value 值
}
}

得到的结果是 three

删除元素

我们可以使用 remove(key) 方法来删除 key 对应的键值对 (key-value):

java
import java.util.HashMap;

public class test{
public static void main(String[] args) {
// 创建 HashMap 对象 pairs
HashMap<Integer, String> pairs = new HashMap<Integer, String>();
// 添加键值对
pairs.put(1 , "one");
pairs.put(2 , "two");
pairs.put(3 , "three");
pairs.put(4 , "four");
pairs.remove(4);
System.out.println(pairs);
}
}

输出结果:

java
{1=one, 2=two, 3=three}

删除所有键值对

可以使用 clear() 方法:

java
import java.util.HashMap;

public class test{
public static void main(String[] args) {
// 创建 HashMap 对象 pairs
HashMap<Integer, String> pairs = new HashMap<Integer, String>();
// 添加键值对
pairs.put(1 , "one");
pairs.put(2 , "two");
pairs.put(3 , "three");
pairs.put(4 , "four");
pairs.clear();
System.out.println(pairs);
}
}

这样哈希表中所有的键值对就都被删除了。

迭代 HashMap

可以使用 for-each 来迭代 HashMap 中的元素。

如果你只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果你只想获取 value,可以使用 values() 方法。

java
import java.util.HashMap;

public class test{
public static void main(String[] args) {
// 创建 HashMap 对象 pairs
HashMap<Integer, String> pairs = new HashMap<Integer, String>();
// 添加键值对
pairs.put(1 , "one");
pairs.put(2 , "two");
pairs.put(3 , "three");
pairs.put(4 , "four");
// 输出 key 和 value
for (Integer i: pairs.keySet()){
System.out.println("key:" + i + " value:" + pairs.get(i));
}
// 返回所有 value 的值
for (String value: pairs.values()){
System.out.print(value + " , "); // 输出所有 value 的值
}
}
}

输出结果:

java
key:1  value:one
key:2 value:two
key:3 value:three
key:4 value:four
one , two , three , four ,

Java HashMap 方法

以下是常用方法:

clear() 删除 hashMap 中的所有键 / 值对
clone() 复制一份 hashMap
isEmpty() 判断 hashMap 是否为空
size() 计算 hashMap 中键 / 值对的数量
put() 将键 / 值对添加到 hashMap 中
putAll() 将所有键 / 值对添加到 hashMap 中
putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键 / 值对插入到 hashMap 中。
remove() 删除 hashMap 中指定键 key 的映射关系
containsKey() 检查 hashMap 中是否存在指定的 key 对应的映射关系。
containsValue() 检查 hashMap 中是否存在指定的 value 对应的映射关系。
replace() 替换 hashMap 中是指定的 key 对应的 value。
replaceAll() 将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。
get() 获取指定 key 对应对 value
getOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值
forEach() 对 hashMap 中的每个映射执行指定的操作。
entrySet() 返回 hashMap 中所有映射项的集合集合视图。
keySet() 返回 hashMap 中所有 key 组成的集合视图。
values() 返回 hashMap 中存在的所有 value 值。
merge() 添加键值对到 hashMap 中
compute() 对 hashMap 中指定 key 的值进行重新计算
computeIfAbsent() 对 hashMap 中指定 key 的值进行重新计算,如果不存在这个 key,则添加到 hasMap 中
computeIfPresent() 对 hashMap 中指定 key 的值进行重新计算,前提是该 key 存在于 hashMap 中。

关于 HashSet

    Set 不保存重复的元素。Set 中最常被使用的是测试归属性,可以很容易查询某个对象是否在某个 Set 中。查找成了 Set 中最重要的操作。

    HashSet 是基于 HashMap 来实现的。

  • 添加元素可以使用 add() 方法
  • 可以使用 contains() 方法来判断元素是否存在于集合当中

参考文章: