我是Java的新手,我正在尝试了解哈希表。我想将对象插入到我的哈希表中,然后能够在最后打印哈希表中的所有对象。我不确定我这样做是否正确,因为我已经读过我需要覆盖get()方法或hashCode()方法,但我不确定原因。
我传递学生姓名的String对象。当我在插入后运行调试器时,它将键显示为“null”,并且我的插入的索引位于哈希表中的随机位置。防爆。 1,6,10
这就是我一直在添加的方式。任何人都可以告诉我这是否正确,我真的需要覆盖一些事情吗?
提前致谢!
CODE
Hashtable<String,String> hashTable=new Hashtable<String,String>();
hashTable.put("Donald", "Trump");
hashTable.put("Mike", "Myers");
hashTable.put ("Jimmer", "Markus");
答案 0 :(得分:4)
你正确地做事。请记住,Hashtable
不是直接访问结构。例如,您无法“从Hashtable
获取第三项”。当你谈论Hashtable
时,术语“索引”没有任何实际意义:项目的数字索引毫无意义。
Hashtable
保证它将为您保存键值对,其方式是非常快速结束基于键的值(例如:给定Donald
,您很快就会得到Trump
。当然,必须满足某些条件才能正常工作,但是对于简单的String-to-String示例,这是有效的。
您应该阅读有关哈希表的更多信息,以了解它们在幕后的实际工作方式。
编辑(根据OP的请求):您要求在Hashtable中存储Student
个实例。如上所述,必须解决某些条件才能使Hashtable正常工作。这些条件与键部分有关,而不是值部分。
如果你的Student
实例是值,而一个简单的字符串是键,那么你没什么特别的,因为String原语已经回答了正确的Hashtable密钥所需的所有条件。
如果您的Student
实例是键,则必须满足以下条件:
在Student
内,您必须覆盖hashCode
方法,以便hashCode
的后续调用将返回完全相同的值。换句话说,表达式x.hashCode() == x.hashCode()
必须始终为真。
在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);
}
}
答案 1 :(得分: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));
}