哈希表Java插入

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

看起来很好。调试器中所看到的是支持数组等细节实现的具体细节。除非你好奇,否则不应该去看它。 - President James K. Polk
@GregS 谢谢 Greg 快速回复。如果我使用学生对象进行插入,而不仅仅是一个字符串对象,我需要覆盖一些内容吗?您介意向我展示如何实现这样的事情吗?感谢您和大家的帮助。 - Alex G
2个回答

4
你做得很正确。记住,哈希表不是一种直接访问结构。例如,你不能“从哈希表中获取第三个项目”。当谈到哈希表时,“索引”这个术语没有真正的意义:项的数字索引没有任何含义。
哈希表保证以键值对的形式保存数据,使得基于键来确定值非常快速(例如,给定“Donald”,你会很快得到“Trump”)。当然,为了使其正常工作,必须满足某些条件,但对于简单的字符串到字符串的例子,这样就可以了。
你应该阅读更多关于哈希表的一般知识,以了解它们在幕后是如何工作的。
编辑(按照OP的要求):你正在询问如何在Hashtable中存储Student实例。如上所述,哈希表必须满足某些条件才能正常工作。这些条件涉及“键”部分而不是“值”部分。
如果你的Student实例是“值”,并且一个简单的字符串是“键”,那么你无需进行特殊处理,因为字符串原语已经回答了Hashtable键所需的所有条件。
如果你的Student实例是“键”,则必须满足以下条件:
1. 在Student内部,必须以这样的方式重写hashCode方法,即后续对hashCode的调用将返回完全相同的值。换句话说,表达式x.hashCode() == x.hashCode()必须始终为真。
2. 在Student内部,必须以这样的方式重写equals方法,即仅对两个相同的Student实例返回true,并在其他情况下返回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);
    }
}

抱歉,最后一个问题...由于我正在覆盖,我不需要使用“@”吗?再次感谢! - Alex G
1
是的,你可以使用@Override。实际上建议这样做。我在这里只是简化了一下。 - Isaac

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接