HashTable Java ...你能查看我的代码吗?

时间:2009-05-02 03:11:23

标签: java hashtable

我正在为java中的哈希表编写一个类...请你确保我到目前为止正确地执行它。

我需要在其中存储StudentRecord对象....我正在根据学生的ID来计算哈希值,该ID类型为long ...

package proj3;

import java.util.LinkedList;

public class HashTable {

    LinkedList<StudentRecord> [] buckets;
    int size;

    public HashTable(){
            size = 10;
            initialize();       
    }

    public HashTable(int initialSize){
        size = initialSize;
        initialize();
    }

    private void initialize(){
        for(int i=0; i<size; i++){
            buckets[i] = new LinkedList<StudentRecord>();
        }
    }
    /** for testing only
    private int calculateHashString(String s){
        int hash = 0;
        for(int i=0; i<s.length(); i++){
            hash += s.charAt(i);
        }
        return hash % size;
    }
    **/

    private int calculateHash(long l){
        return (int) (l % size);
    }


    public boolean contains(StudentRecord sr){
        int hash = calculateHash(sr.studentID);
        LinkedList<StudentRecord> l = buckets[hash];
        if(l.contains(sr)){
            return true;
        }
        return false;
    }

    public void put(StudentRecord sr){
        int hash = calculateHash(sr.studentID);
        LinkedList<StudentRecord> l = buckets[hash];
        if(!l.contains(sr)){
            buckets[hash].add(sr);
        }
    }

}

5 个答案:

答案 0 :(得分:8)

我认为您可能希望编写单元测试以验证其实际功能,而不管您的f(r)友好SO专家是否理智检查它。

除了简单的测试用例之外,还有一件好事就是将实现的功能与标准的JDK HashMap进行比较。生成随机密钥和/或值,插入,删除,并检查两个实现之间的状态是否相同(达到应有的程度)。

答案 1 :(得分:3)

buckets似乎永远不会被初始化。当您尝试这样做时,编译器应该给您一个警告。坚持集合优先于数组(原语除外)。

通过调用其他构造函数(this(10)可以更简单地实现no-args构造函数。

表达式(int) (l % size)即使有正size也可以返回否定值,原因不止一个。

代码

public boolean contains(StudentRecord sr){
    ...
    if(l.contains(sr)){
            return true;
    }
    return false;
}

可以更明确地写成

public boolean contains(Student student) {
    ...
    return list.contains(student);
}

答案 2 :(得分:2)

看起来不错。

答案 3 :(得分:0)

Tom是对的,您需要将存储桶初始化为新的LinkedList [size]。

我认为你想让尺寸最终,并从较大的值开始,比如256.如果你在将项目添加到表格后调整大小,你需要将它们全部移动到新的桶中(来自更改的哈希算法)。

另一方面,10适合测试 - 在相同的桶上发生大量碰撞!

为了节省内存,您不必在开始时初始化所有新的LinkedList(),您可以将它们保留为null。您可以等待创建每个列表对象,直到新项目实际命中空桶。当然,这将意味着额外的代码,以检查您尝试读取的存储桶是否为空,如果是,则假设它是一个空列表。

答案 4 :(得分:0)

你也必须覆盖equals和hashCode方法。