java - 查找没有哈希码的对象

标签 java collections java-8 java-7 deterministic

我需要使程序更具确定性:即重构它,以便结果更少依赖于运行。

可能的非确定性原因之一是:使用 HashMap/HashSet/etc 以及使用默认对象 hashCode() 的键。

重点是默认对象的 hashCode() 使用对内存中对象的实际引用,这意味着每次重新运行它都可能不同。

有没有一种好方法可以打印出所有没有重新定义 hashCode() 方法并由其哈希使用的类?

代码库巨大(高达数百MB的代码),有很多内部类、接口(interface)、抽象类等。并且弄清楚要关注哪些映射/集合本身就是一个问题

最佳答案

您的前提“我需要制作一个更具确定性的程序”存在根本缺陷。您的程序要么是正确的,要么是损坏的。如果它依赖于未指定的属性,那么它就会被破坏,并且尝试使其“不那么破坏”是没有意义的。你必须修复错误的部分。

例如,无论您如何实现 hashCode() 方法,依赖 HashMapHashSet 的迭代顺序总是会被破坏。正如 this answer 所演示的,相同内容的 HashSet 可以显示其元素的不同顺序,具体取决于其实际容量(集合历史记录的函数)或实际 Java 运行时版本,尽管包含元素有一个 well defined hashCode() implementation

因此,混杂类的 hashCode() 方法不会改进您的应用程序,您必须修复错误依赖返回数字的部分(并且可能依赖其他未指定的实现)详细信息)。

关于java - 查找没有哈希码的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48771571/

相关文章:

java-8 - 最新的 websphere liberty 全平台会运行 oracle java 8 吗?

java - 使用抽象类和 Android Activity

c# - 非基于哈希的集合集合,用于使用自定义相等比较器存储唯一对象 - C#

java - Java 8 中是否有一种方法可以让线程 hibernate 直到使用特定时钟的 Instant?

scala - 发生错误时使用失败来破坏集合的 `find` 方法的惯用 Scala 方法是什么?

java - subList() 与其他类似的 Collections 方法有不同的行为,一旦 subList 被改变

java - 线程运行方法内部使用的方法的同步

java - 如果GC后JConsole显示的 "Heap"内存使用量通常返回0,是否没有内存泄漏?

java - 创建测试程序来记录模具上滚动的频率?

java - Java 中的 Lambda - 无法分析 lambda 代码