我是Java的新手,我正在尝试学习哈希表.我想将对象插入到我的哈希表中,然后能够在最后打印哈希表中的所有对象.我不确定我这样做是否正确,因为我已经读过我需要覆盖get()方法或hashCode()方法,但我不知道为什么.
我正在传递学生姓名的String对象.当我在插入后运行调试器时,它将键显示为"null",并且我的插入的索引位于哈希表中的随机位置.防爆.1,6,10
这就是我一直在添加的方式.任何人都可以告诉我这是否正确,我真的需要覆盖的东西吗?
提前致谢!
码
Hashtable<String,String> hashTable=new Hashtable<String,String>();
hashTable.put("Donald", "Trump");
hashTable.put("Mike", "Myers");
hashTable.put ("Jimmer", "Markus");
Run Code Online (Sandbox Code Playgroud)
你做事是正确的。请记住,aHashtable不是直接访问结构。Hashtable例如,您不能“从 a 获取第三项”。当您谈论 a 时,术语“索引”没有真正的含义Hashtable:项目的数字索引没有任何意义。
AHashtable保证它会为你保存键值对,这样根据键可以非常快地得出一个值(例如:given ,你会很快Donald得到)。Trump当然,必须满足某些条件才能正常工作,但对于简单的字符串到字符串示例来说,这是可行的。
您应该阅读有关哈希表的更多信息,了解它们在幕后的实际工作原理。
编辑(根据OP的要求):您询问有关Student在哈希表中存储实例的问题。正如我上面提到的,必须满足某些条件才能使哈希表正常工作。这些条件涉及关键部分,而不是价值部分。
如果您的Student实例是value,而一个简单的 String 是 key ,那么您不需要做任何特别的事情,因为 String 原语已经满足了正确的 Hashtable 键所需的所有条件。
如果您的Student实例是key,那么必须满足以下条件:
在 内部Student,您必须hashCode以这样的方式重写该方法,以便后续调用hashCode将返回完全相同的值。换句话说,表达式x.hashCode() == x.hashCode()必须始终为真。
在 内部Student,您必须重写该equals方法,使其仅返回true两个相同的实例Student,false否则返回。
这些条件足以充当Student适当的哈希表键。您可以通过编写更好的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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
32782 次 |
| 最近记录: |