6

我是 Java 新手,我正在尝试学习哈希表。我想将对象插入到我的哈希表中,然后能够在最后打印哈希表中的所有对象。我不确定我这样做是否正确,因为我已经读到我需要重写 get() 方法或 hashCode() 方法,但我不知道为什么。

我正在传递学生姓名的字符串对象。当我在插入后运行调试器时,它会将键显示为“null”,并且插入的索引位于哈希表中的随机位置。前任。1、6、10

这就是我一直在添加的方式。谁能告诉我这是否正确,我真的需要覆盖吗?

提前致谢!

代码

 Hashtable<String,String> hashTable=new Hashtable<String,String>();
 hashTable.put("Donald", "Trump");
 hashTable.put("Mike", "Myers");
 hashTable.put ("Jimmer", "Markus");
4

2 回答 2

4

你做事正确。请记住,aHashtable不是直接访问结构。例如,您不能“从 a 中获取第三项Hashtable”。当您谈论 a 时,“索引”一词没有真正的含义Hashtable:项目的数字索引没有任何意义。

AHashtable保证它将为您保存键值对,从而可以非常快速地根据键得出值(例如:给定Donald,您将Trump很快得到)。当然,必须满足某些条件才能使其正常工作,但对于您的简单字符串到字符串示例,这是有效的。

您应该阅读更多关于哈希表的一般信息,以了解它们在幕后是如何工作的。

编辑(根据 OP 的要求):您正在询问有关Student在 Hashtable 中存储实例的问题。正如我上面提到的,必须解决某些条件才能使 Hashtable 正常工作。这些条件是关于关键部分,而不是价值部分。

如果您的Student实例是value,而简单的 String 是key,那么您无需做任何特别的事情,因为 String 原语已经回答了正确 Hashtable 键所需的所有条件。

如果您的Student实例是key,则必须满足以下条件:

  1. 在内部Student,您必须hashCode以这样的方式覆盖该方法,以便后续调用hashCode将返回完全相同的值。换句话说,表达式x.hashCode() == x.hashCode()必须始终为真。

  2. 在 内部Student,您必须重写该equals方法,使其仅返回true两个相同的 实例,否则Student返回。false

这些条件足以Student充当适当的 Hashtable 键。你可以通过编写一个更好的hashCode实现来进一步优化事情(阅读它......在这里输入很长),但只要你回答了上述两个,你就可以了。

例子:

class Student {
    private String name;
    private String address;

    public int hashCode() {
        // Assuming 'name' and 'address' are not null, for simplification here.

        return name.hashCode() + address.hashCode();
    }

    public boolean equals (Object other) {
        if (!(other instanceof Student) {
            return false;
        }
        if (other == this) {
            return true;
        }

        Student otherStudent = (Student) other;
        return name.equals(otherStudent.name) && address.equals(otherStudent.address);
    }
}
于 2012-12-08T01:14:55.187 回答
1

试试这个代码:

 Hashtable<String,String> hashTable=new Hashtable<String,String>();

 hashTable.put("Donald", "16 years old");
 hashTable.put("Mike", "20 years old");
 hashTable.put ("Jimmer", "18 years old");

Enumeration studentsNames; 
String str; 


// Show all students in hash table. 
studentsNames = hashTable.keys(); 
while(studentsNames.hasMoreElements()) { 
str = (String) studentsNames.nextElement(); 
txt.append("\n"+str + ": " + hashTable.get(str)); 
} 
于 2012-12-08T01:27:04.903 回答