📜  实现HashMap API的Java程序(1)

📅  最后修改于: 2023-12-03 14:53:36.905000             🧑  作者: Mango

实现HashMap API的Java程序

简介

Java中的HashMap是一种常用的数据结构,它可以允许我们存储key-value键值对,并通过key快速查找对应的value。在本文中,我们将通过自己编写一个程序来实现HashMap API,包括以下常用方法:

  • put(key, value)
  • get(key)
  • remove(key)
  • size()
  • containsKey(key)
实现代码

首先,我们需要定义一个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格式的代码片段。