当前位置: 首页 > 知识库问答 >
问题:

我可以只使用一个唯一字段生成hashcode()和equals()吗?

郜杰
2023-03-14

比方说,我有一个班,学生。每个学生对象都有一个唯一的字段(int ID)和其他公共字段(如String schoolName等)。

现在只考虑字段ID生成hashcode()和equals()可以吗?

共有2个答案

汝弘深
2023-03-14

这取决于您的对象的意图和目标受众。

>

  • 意图:可能会出现学生结婚并更改姓氏的情况。现在,如果您的代码依赖于. equals()来确定是否有要保存的更改,那么这些更改将不会被选中保存。对于学生对象上可能更改的任何其他字段也是如此。

    受众:如果您将对象打包到库中并将其提供给其他人。当且仅当所有非瞬态字段相等时,他们可能期望 Student 对象的实例相等。

  • 管杜吟
    2023-03-14

    是的,您绝对可以使用ID作为哈希代码和等于。根据 HashMap 中的存储桶数量,具有不同 ID 的多个对象将共享同一个存储桶,然后 equals 方法将识别正确的对象。由于您计划使用唯一的 ID,因此 equals 方法会将 ID 与存储桶中的每个对象进行比较 -

    然而,有一个陷阱。如果ID是自动递增的,那么可以在Hashcode中使用ID,这样对象就可以均匀地分布在桶中。然而,如果你的ID字段是某种模式,如4,8,12,16等。,您将最终把大多数对象放在一部分桶中。因此,在这种情况下,使用Hashcode生成一个质数,因为质数是均匀分布在桶中的最佳候选。

     类似资料:
    • 我试图从一个XSD文件生成一个包含toString、equals和hashCode方法的Java类。我得到了toString的工作,但我无法弄清楚如何让CXF插件生成equals和hashCode方法。 这是我的XSD文件: 很好,我意识到工件不存在,但我不知道如何配置CXF插件来生成equals和hashCode方法。您知道如何配置CXF插件来生成equals和hashCode方法吗?提前感谢您

    • 问题内容: 我需要一个Java实现,它忽略类中字段的顺序。首先,节点可以是第二个节点,第二个可以是节点优先。 这是我的方法取决于顺序: 有没有一种方法可以计算出以下边缘相同但唯一的哈希值? 应该是。 问题答案: 您可以使用某种交换运算来代替现在的运算,例如加法: 我建议您仍然使用乘数,因为它为哈希码提供了一些熵。在这里查看我的回答: 遵循一些良好的哈希规则是: 混淆您的运营商。通过混合您的运算符,

    • 我已经习惯了从命令行使用XJC工具。但是我意识到我不能使用它生成带有和方法的Java类。我用了这个: 1.可以用CXF XJC Maven插件从DTD文件生成和方法吗?

    • 下面是关于Spring Boot服务器存根的生成,使用swagger代码(-l Spring)。 Swagger codegen 二进制文件(当前:v2.3.1)是否有任何选项可以在没有hashCode()和equals()方法的情况下生成dto模型? 我在配置帮助中没有找到任何选项。我希望生成的 dto 模型扩展一个抽象类,其中 hashCode() 和 equals() 方法已经声明,因此不应

    • 问题内容: 的两个实例是否可能具有相同的值? 从理论上讲,对象是从其内存地址派生的,因此所有对象都应该是唯一的,但是如果对象在GC中移动,该怎么办? 问题答案: 给定合理的对象集合,很可能会有两个具有相同的哈希码。在最好的情况下,它成为生日问题,与数以万计的对象发生冲突。在实践中,使用相对较小的可能的哈希码池创建的对象,仅数千个对象就很容易发生冲突。 使用内存地址只是获得一个稍微随机数的一种方法。

    • 问题内容: 建议和有时是必要的,即表示值(类 值类 )来覆盖,[和任选]的方法。这些方法返回的值取决于类及其超类的成员变量的全部或子集。为了实现它们正常,你必须了解理论的一点点 散列 和代数和集理论的一点点(不要太多,几乎一切都在explaind 的javadoc 这些方法和有效的Java形式乔希布洛赫。) 在大多数情况下,此方法的实现遵循一个模板,并且IDE(如Eclipse JDT)包括生成它