哈希表Java插入

Ale*_*x G 6 java hashtable

我是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)

Isa*_*aac 4

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

AHashtable保证它会为你保存键值对,这样根据键可以非常快地得出一个值(例如:given ,你会很快Donald得到)。Trump当然,必须满足某些条件才能正常工作,但对于简单的字符串到字符串示例来说,这是可行的。

您应该阅读有关哈希表的更多信息,了解它们在幕后的实际工作原理。

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

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

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

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

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

这些条件足以充当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)