比方说,我有一个班,学生。每个学生对象都有一个唯一的字段(int ID)和其他公共字段(如String schoolName等)。
现在只考虑字段ID生成hashcode()和equals()可以吗?
是的,您绝对可以使用ID作为哈希代码和等于。根据 HashMap 中的存储桶数量,具有不同 ID 的多个对象将共享同一个存储桶,然后 equals 方法将识别正确的对象。由于您计划使用唯一的 ID,因此 equals 方法会将 ID 与存储桶中的每个对象进行比较 -
然而,有一个陷阱。如果ID是自动递增的,那么可以在Hashcode中使用ID,这样对象就可以均匀地分布在桶中。然而,如果你的ID字段是某种模式,如4,8,12,16等。,您将最终把大多数对象放在一部分桶中。因此,在这种情况下,使用Hashcode生成一个质数,因为质数是均匀分布在桶中的最佳候选。
这取决于您的对象的意图和目标受众。
>
意图:可能会出现学生结婚并更改姓氏的情况。现在,如果您的代码依赖于. equals()来确定是否有要保存的更改,那么这些更改将不会被选中保存。对于学生对象上可能更改的任何其他字段也是如此。
受众:如果您将对象打包到库中并将其提供给其他人。当且仅当所有非瞬态字段相等时,他们可能期望 Student 对象的实例相等。