Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
哈希表Java插入_Java_Hashtable - Fatal编程技术网

哈希表Java插入

哈希表Java插入,java,hashtable,Java,Hashtable,我是Java新手,我正在努力学习哈希表。我想在哈希表中插入对象,然后能够在最后打印哈希表中的所有对象。我不确定我是否做得对,因为我读到我需要重写get()方法或hashCode()方法,但我不确定为什么 我正在传递学生姓名的字符串对象。当我在插入后运行调试器时,它将键显示为“null”,并且插入的索引位于哈希表中的随机位置。例1、6、10 这就是我一直在添加的内容。有人能告诉我这是不是正确的,我真的需要重写吗 提前谢谢 代码 Hashtable<String,String> has

我是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");
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
    。事实上,我们建议你这样做。我只是在简化。