Java hashcode实现中的更改如何影响hashSet

Java hashcode实现中的更改如何影响hashSet,java,data-structures,collections,hashmap,Java,Data Structures,Collections,Hashmap,我实现了hashSet,并添加了一些对象,但后来我们更改了hashcode实现 1> 在这种情况下会发生什么 2> 如何防止hashcode实现的更改通常情况下,答案是:视情况而定 假设您更改了其中一个类的hashCode()实现 1) 如果(您的应用程序没有持久化其数据) 然后,当您重新启动应用程序时,每个部分都将使用新的实现。因此:没问题 2) 如果(您的应用程序确实保留了其数据) 然后,当您重新启动应用程序时,将重新加载其数据;根据您更改hashCode()的方式/位置。。。可能会发生有趣

我实现了hashSet,并添加了一些对象,但后来我们更改了hashcode实现

1> 在这种情况下会发生什么


2> 如何防止hashcode实现的更改通常情况下,答案是:视情况而定

假设您更改了其中一个类的hashCode()实现

1) 如果(您的应用程序没有持久化其数据) 然后,当您重新启动应用程序时,每个部分都将使用新的实现。因此:没问题

2) 如果(您的应用程序确实保留了其数据) 然后,当您重新启动应用程序时,将重新加载其数据;根据您更改hashCode()的方式/位置。。。可能会发生有趣的事情

关于你的第二个问题;“解决”这个问题没有通用的方法,但有一些众所周知的做法,如果你遵循这些做法,那么有人弄糟的可能性就会降低:

1) 教育和技能:尽量确保每个接触代码的人都知道自己在做什么(不要盲目地遵循命令“但你告诉我要做xyz,所以我坐下来做了xyz,根本不考虑后果”)

2) 良好的设计和现有组件的重复使用。比如:标准java附带了“已知”好的集合、映射和集合。为什么你认为你必须重新发明轮子,为什么你认为你的实现会“更好”


3) 好的测试。执行TDD,并确保每个新函数都有覆盖其所有行为的单元测试。然后确保当有人将代码推入版本控制系统时,单元测试自动运行;所以你会注意到东西什么时候坏了。除此之外,为那些无法通过单元测试的方面构建合理的功能/集成测试。

通常,答案是:这取决于

假设您更改了其中一个类的hashCode()实现

1) 如果(您的应用程序没有持久化其数据) 然后,当您重新启动应用程序时,每个部分都将使用新的实现。因此:没问题

2) 如果(您的应用程序确实保留了其数据) 然后,当您重新启动应用程序时,将重新加载其数据;根据您更改hashCode()的方式/位置。。。可能会发生有趣的事情

关于你的第二个问题;“解决”这个问题没有通用的方法,但有一些众所周知的做法,如果你遵循这些做法,那么有人弄糟的可能性就会降低:

1) 教育和技能:尽量确保每个接触代码的人都知道自己在做什么(不要盲目地遵循命令“但你告诉我要做xyz,所以我坐下来做了xyz,根本不考虑后果”)

2) 良好的设计和现有组件的重复使用。比如:标准java附带了“已知”好的集合、映射和集合。为什么你认为你必须重新发明轮子,为什么你认为你的实现会“更好”


3) 好的测试。执行TDD,并确保每个新函数都有覆盖其所有行为的单元测试。然后确保当有人将代码推入版本控制系统时,单元测试自动运行;所以你会注意到东西什么时候坏了。除此之外,为那些无法通过单元测试进行测试的方面构建合理的功能/集成测试。

什么是“在运行时更改”?如果更改了hashcode实现,则编译并重新部署了新代码,因此在重新启动代码时必须重新生成hashset,那么问题是什么?你的意思是什么“在运行时更改”?如果更改了hashcode实现,则编译并重新部署了新代码,因此在重新启动代码时必须重建hashset,那么问题是什么?