📅  最后修改于: 2023-12-03 14:53:36.905000             🧑  作者: Mango
Java中的HashMap是一种常用的数据结构,它可以允许我们存储key-value键值对,并通过key快速查找对应的value。在本文中,我们将通过自己编写一个程序来实现HashMap API,包括以下常用方法:
首先,我们需要定义一个Entry类来表示HashMap中的每个键值对。该类包括key、value和next三个属性,并提供相应的getter和setter方法。
class Entry {
private String key;
private Object value;
private Entry next;
Entry(String key, Object value) {
this.key = key;
this.value = value;
this.next = null;
}
// getter和setter方法
}
接下来,我们可以定义一个HashMap类,该类主要包括上述提到的五个方法。为了方便起见,我们在实现过程中使用了Java的ArrayList和LinkedList类。
import java.util.ArrayList;
import java.util.LinkedList;
class HashMap {
private ArrayList<LinkedList<Entry>> buckets;
private int capacity;
private int size;
HashMap(int capacity) {
this.buckets = new ArrayList<>(capacity);
for (int i = 0; i < capacity; i++) {
this.buckets.add(new LinkedList<>());
}
this.capacity = capacity;
this.size = 0;
}
void put(String key, Object value) {
int index = key.hashCode() % capacity;
LinkedList<Entry> list = buckets.get(index);
for (Entry entry: list) {
if (entry.getKey().equals(key)) {
entry.setValue(value);
return;
}
}
list.add(new Entry(key, value));
size++;
}
Object get(String key) {
int index = key.hashCode() % capacity;
LinkedList<Entry> list = buckets.get(index);
for (Entry entry: list) {
if (entry.getKey().equals(key)) {
return entry.getValue();
}
}
return null;
}
void remove(String key) {
int index = key.hashCode() % capacity;
LinkedList<Entry> list = buckets.get(index);
Entry prev = null;
for (Entry entry: list) {
if (entry.getKey().equals(key)) {
if (prev == null) {
list.removeFirst();
} else {
prev.setNext(entry.getNext());
}
size--;
return;
}
prev = entry;
}
}
int size() {
return size;
}
boolean containsKey(String key) {
int index = key.hashCode() % capacity;
LinkedList<Entry> list = buckets.get(index);
for (Entry entry: list) {
if (entry.getKey().equals(key)) {
return true;
}
}
return false;
}
}
为了验证我们实现的HashMap是否正确,我们可以编写一个简单的测试程序,例如:
public class Main {
public static void main(String[] args) {
HashMap map = new HashMap(10);
map.put("apple", 2.3);
map.put("banana", 1.2);
map.put("orange", 3.4);
System.out.println(map.containsKey("apple")); // true
System.out.println(map.containsKey("pear")); // false
System.out.println(map.get("banana")); // 1.2
System.out.println(map.get("pear")); // null
map.remove("banana");
System.out.println(map.containsKey("banana")); // false
System.out.println(map.size()); // 2
}
}
运行该程序后,将输出以下结果:
true
false
1.2
null
false
2
以上代码块即为markdown格式的代码片段。