哈希表Java插入
我是Java新手,我正在努力学习哈希表。我想在哈希表中插入对象,然后能够在最后打印哈希表中的所有对象。我不确定我是否做得对,因为我读到我需要重写get()方法或hashCode()方法,但我不确定为什么 我正在传递学生姓名的字符串对象。当我在插入后运行调试器时,它将键显示为“null”,并且插入的索引位于哈希表中的随机位置。例1、6、10 这就是我一直在添加的内容。有人能告诉我这是不是正确的,我真的需要重写吗 提前谢谢 代码哈希表Java插入,java,hashtable,Java,Hashtable,我是Java新手,我正在努力学习哈希表。我想在哈希表中插入对象,然后能够在最后打印哈希表中的所有对象。我不确定我是否做得对,因为我读到我需要重写get()方法或hashCode()方法,但我不确定为什么 我正在传递学生姓名的字符串对象。当我在插入后运行调试器时,它将键显示为“null”,并且插入的索引位于哈希表中的随机位置。例1、6、10 这就是我一直在添加的内容。有人能告诉我这是不是正确的,我真的需要重写吗 提前谢谢 代码 Hashtable<String,String> has
Hashtable<String,String> hashTable=new Hashtable<String,String>();
hashTable.put("Donald", "Trump");
hashTable.put("Mike", "Myers");
hashTable.put ("Jimmer", "Markus");
Hashtable Hashtable=新的Hashtable();
hashTable.put(“唐纳德”、“特朗普”);
hashTable.put(“Mike”、“Myers”);
hashTable.put(“Jimmer”、“Markus”);
您做的事情是正确的。请记住,哈希表
不是直接访问结构。例如,您不能“从哈希表中获取第三项”。当你谈论一个哈希表时,“索引”一词没有真正的意义:项目的数字索引没有任何意义
Hashtable
保证它将为您保存键值对,这样就可以非常快速地根据一个键得出一个值(例如:给定Donald
,您将非常快速地得到Trump
)。当然,必须满足某些条件才能正常工作,但对于简单的字符串到字符串示例,这是可行的
一般来说,您应该阅读更多关于哈希表的内容,以了解它们在幕后是如何工作的
EDIT(根据OP的请求):您要求在哈希表中存储Student
实例。如上所述,哈希表要正常工作,必须满足某些条件。这些条件涉及关键部分,而不是价值部分
如果您的Student
实例是值,一个简单的字符串是键,那么您没有什么特别的事情要做,因为字符串原语已经回答了正确的哈希表键所需的所有条件
如果您的学生
实例是关键,则必须满足以下条件:
在Student
内部,您必须重写hashCode
方法,以便后续调用hashCode
将返回完全相同的值。换句话说,表达式x.hashCode()==x.hashCode()
必须始终为真
在Student
内部,必须重写equals
方法,使其仅对Student
的两个相同实例返回true
,否则返回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);
}
}
请尝试以下代码:
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));
}
Hashtable Hashtable=新的Hashtable();
hashTable.put(“Donald”,“16岁”);
hashTable.put(“迈克”,“20岁”);
hashTable.put(“Jimmer”,“18岁”);
列举学生人数;
字符串str;
//在哈希表中显示所有学生。
studentsNames=hashTable.keys();
while(studentsNames.hasMoreElements()){
str=(字符串)studentsNames.nextElement();
txt.append(“\n”+str+”:“+hashTable.get(str));
}
看起来不错。您在调试器中看到的是支持数组的具体实现细节,等等。除非你很好奇,否则你不会真的去看它。@GregS谢谢Greg的快速回复。如果我使用一个Student对象而不是一个String对象来进行插入,我是否必须重写这些内容?你介意告诉我怎样才能实现这样一件事吗?谢谢你和所有人的帮助抱歉最后一个问题。。。既然我正在重写,我不需要使用“@”吗?再次感谢!是的,您可以使用@Override
。事实上,我们建议你这样做。我只是在简化。