📜  Java中的哈希表(1)

📅  最后修改于: 2023-12-03 15:02:01.540000             🧑  作者: Mango

Java中的哈希表

哈希表(Hash table)是一种用于存储键值对的数据结构。在Java中,哈希表也被称作HashMap。它是一种基于哈希算法实现的数据结构,可以快速地插入、查找、删除数据。

哈希算法

哈希算法是一种可以将任意长度的数据转换为固定长度(通常比原始数据要小)的算法。这个转换过程其实就是哈希函数的计算过程。通过哈希函数的计算,可以将数据映射到哈希表的特定位置,从而实现快速的数据存储和查询。

在Java中,哈希函数主要是通过对键值进行哈希计算来实现的。哈希函数使用了键值的所有信息来生成哈希值,而哈希值则用来确定键值在哈希表中的位置。因此,如果两个键值的哈希值相同,它们就会被存储在哈希表中的同一个位置。这种情况叫做哈希冲突(Hash Collision)。

哈希表的特点

哈希表具有以下几个特点:

  • 高效性:插入、查找、删除数据都可以达到O(1)的时间复杂度;
  • 动态扩容:当哈希表容量不足时,自动扩容,并重新计算键值的哈希值;
  • 链式存储冲突元素:当出现哈希冲突时,使用链表将相同哈希值的元素进行存储;
  • 桶(Bucket):哈希表中的每个存储位置被称为桶,每个桶中可以存储多个元素。
创建哈希表

在Java中,可以通过Hashtable或HashMap类来创建哈希表。

Hashtable

Hashtable是一个线程安全的哈希表,因此它具有较高的开销,对于多线程环境下的操作,使用Hashtable更为安全。Hashtable的使用方式和HashMap相似,可以使用put()方法来插入数据,使用get()方法来查找数据,使用remove()方法来删除数据。

Hashtable的创建方式如下:

Hashtable<String, Integer> table = new Hashtable<>();

上面的代码创建了一个存储String类型的键和Integer类型的值的哈希表对象。可以使用put()方法来插入数据,如下所示:

table.put("one", 1);
table.put("two", 2);
table.put("three", 3);
HashMap

HashMap是一个非线程安全的哈希表,因此它的开销相对较小,对于单线程环境下的操作,使用HashMap更加高效。HashMap的使用方式和Hashtable相似,可以使用put()方法来插入数据,使用get()方法来查找数据,使用remove()方法来删除数据。

HashMap的创建方式如下:

HashMap<String, Integer> map = new HashMap<>();

上面的代码创建了一个存储String类型的键和Integer类型的值的哈希表对象。可以使用put()方法来插入数据,如下所示:

map.put("one", 1);
map.put("two", 2);
map.put("three", 3);
哈希表的遍历

使用HashMap或Hashtable创建的哈希表都可以使用迭代器(Iterator)进行遍历。在Java中,可以使用以下三种方式进行哈希表的遍历:

使用Iterator遍历哈希表

可以使用HashMap或Hashtable自带的keySet方法获取键集,通过键集获取值,然后用迭代器遍历。

Iterator<String> iterator = map.keySet().iterator();
while(iterator.hasNext()){
    String key = iterator.next();
    Integer value = map.get(key);
    System.out.println("key: " + key + ", value: " + value);
}
使用Iterator遍历哈希表的另一种方式
Iterator<Map.Entry<String, Integer>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
    Map.Entry<String, Integer> entry = iterator.next();
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println("key: " + key + ", value: " + value);
}
使用foreach遍历哈希表
for (Map.Entry<String, Integer> entry : map.entrySet()) {
    String key = entry.getKey();
    Integer value = entry.getValue();
    System.out.println("key: " + key + ", value: " + value); 
}
哈希表的常用方法

在Java中的哈希表提供了以下常用的方法:

  • put(Object key, Object value):将键值对插入哈希表;
  • get(Object key):根据键获取值;
  • remove(Object key):根据键删除键值对;
  • containsKey(Object key):判断哈希表中是否包含指定的键;
  • containsValue(Object value):判断哈希表中是否包含指定的值;
  • clear():清空哈希表;
  • size():获取哈希表中键值对的数量;
  • isEmpty():判断哈希表是否为空。
HashMap<String, Integer> map = new HashMap<>();

map.put("one", 1);
map.put("two", 2);
map.put("three", 3);

if (map.containsKey("one")) {
    System.out.println("one: " + map.get("one"));
}

if (map.containsValue(3)) {
    System.out.println("3 exists");
}

map.remove("two");

System.out.println("keys: " + map.keySet());
System.out.println("values: " + map.values());
System.out.println("size: " + map.size());

以上代码演示了哈希表的插入、查找、删除等常用操作。

总结

哈希表是一种高效的数据结构,对于存储键值对的数据处理场景非常适用。在Java中,可以使用Hashtable或HashMap来创建哈希表,并通过put、get、remove等方法进行操作。此外,还可以使用迭代器或foreach方法对哈希表进行遍历,并提供了containsKey、containsValue、size等常用方法供使用者使用。