哈希表Java。。。你能查一下我的密码吗

哈希表Java。。。你能查一下我的密码吗,java,hashtable,Java,Hashtable,我正在用java为哈希表编写一个类。。。到目前为止,你能确保我做得正确吗 我需要在其中存储StudentRecord对象。。。。我正在根据long类型的学生ID计算哈希值 package proj3; import java.util.LinkedList; public class HashTable { LinkedList<StudentRecord> [] buckets; int size; public HashTable(){

我正在用java为哈希表编写一个类。。。到目前为止,你能确保我做得正确吗

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

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);
        }
    }

}
packageproj3;
导入java.util.LinkedList;
公共类哈希表{
LinkedList[]存储桶;
整数大小;
公共哈希表(){
尺寸=10;
初始化();
}
公共哈希表(int initialSize){
大小=初始大小;
初始化();
}
私有void初始化(){

for(inti=0;i看起来不错。

看起来不错。

我认为您可能需要编写单元测试来验证它的实际功能,而不依赖于您的f(r)是否经过专家的检查


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

我认为您可能需要编写单元测试来验证它的实际功能,这与您的f(r)专家是否检查它无关


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

bucket
似乎从未初始化过。当您尝试初始化时,编译器应该给您一个警告。坚持使用集合而不是数组(原语除外)

通过调用另一个构造函数(
this(10
),可以更简单地实现无参数构造函数

表达式
(int)(l%size)
可以返回负数,即使大小为正,原因不止一个

代码

public boolean contains(StudentRecord sr){
    ...
    if(l.contains(sr)){
            return true;
    }
    return false;
}
可以更清楚地写为

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

bucket
似乎从未初始化过。当您尝试初始化时,编译器应该给您一个警告。坚持使用集合而不是数组(除了基元)

通过调用另一个构造函数(
this(10
),可以更简单地实现无参数构造函数

表达式
(int)(l%size)
可以返回负数,即使大小为正,原因不止一个

代码

public boolean contains(StudentRecord sr){
    ...
    if(l.contains(sr)){
            return true;
    }
    return false;
}
可以更清楚地写为

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

Tom是对的,您需要将bucket初始化为新的LinkedList[size]

我认为您希望将大小设置为final,并从更大的值开始,例如256。如果在将项目添加到表中后调整大小,则需要将它们全部移动到新的存储桶中(从更改的哈希算法)

另一方面,10对于测试来说是很好的——在同一个桶上有很多碰撞


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

Tom是对的,您需要将bucket初始化为新的LinkedList[尺寸]

我认为您希望将大小设置为final,并从更大的值开始,例如256。如果在将项目添加到表中后调整大小,则需要将它们全部移动到新的存储桶中(从更改的哈希算法)

另一方面,10对于测试来说是很好的——在同一个桶上有很多碰撞


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

您还必须重写equals和hashCode方法。

您可以也必须重写equals和hashCode方法。

这是家庭作业吗?如果是,你应该这样标记这个问题。在java中,有一个[contract][1],包括.equals(Object)和.hashCode()方法,允许你独立于键的类型实现哈希表。[1]:这是家庭作业吗?如果是的话,你应该这样标记这个问题。在java中,有一个[contract][1],包括.equals(Object)和.hashCode()方法,允许你独立于键的类型实现哈希表。[1]: