当覆盖java.lang.Object的equals()函数时,javadocs建议,
通常,无论何时重写此方法,都必须重写hashCode方法,以维护hashCode方法的常规约定,该约定规定相等的对象必须具有相等的哈希码。
hashCode()方法必须为每个对象返回一个 唯一的整数 (当根据内存位置比较对象时,这很容易做到,只需返回对象的 唯一的整数 地址即可)
应该如何重写hashCode()方法,以便仅根据对象的属性为每个对象返回 唯一的整数 ?
public class People{
public String name;
public int age;
public int hashCode(){
// How to get a unique integer based on name and age?
}
}
/*******************************/
public class App{
public static void main( String args[] ){
People mike = new People();
People melissa = new People();
mike.name = "mike";
mike.age = 23;
melissa.name = "melissa";
melissa.age = 24;
System.out.println( mike.hasCode() ); // output?
System.out.println( melissa.hashCode(); // output?
}
}
并不是说一个对象的哈希码必须完全唯一,只是两个相等对象的哈希码返回相同的哈希码。有两个不相等的对象返回相同的哈希码是完全合法的。但是,哈希码在一组对象上的分布越独特,您从HashMaps和其他使用hashCode的操作中获得的性能就越好。
像IntelliJ
Idea这样的IDE都具有用于equals和hashCode的内置生成器,这些生成器通常可以很好地为大多数对象提供“足够好”的代码(并且可能比某些手工制作的超灵巧哈希函数要好)。
例如,这是Idea为您的People类生成的hashCode函数:
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
我们正在编写一个类,它需要非常复杂的逻辑来计算equals()和hashCode()。类似于:
问题内容: and方法必须一致,这意味着当两个对象根据方法相等时,它们的方法应返回相同的哈希值。 如果我们不重写hashCode()方法,则Java将返回唯一的哈希码。 为什么取消注释该行会导致编译错误? 如果对象的哈希码不相等,即使默认哈希码有所不同,为什么它们显示为相等? 问题答案: 平等仅由方法equals()确定。并且hashCode()方法可用于其他情况,例如Map或Set。实际调用eq
本文向大家介绍hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?相关面试题,主要包含被问及hashCode 与 equals ?为什么重写equals时必须重写hashCode方法?时的应答技巧和注意事项,需要的朋友参考一下 面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” ha
问题内容: 我应该如何实施和在Java下面的类? 问题答案: 在Eclipse中,右键单击->源->生成hashCode(),然后equals()给出以下信息: 我已选择代码作为唯一字段
我有这样的记录: 它获取default和方法。 如何调整这些方法使其具有自定义行为?假设,我想忽略方法中的。
我试图覆盖提到的方法为我的: MyObject: 如何重写hashcode(),equals()和compareTo()方法? 目前我有以下几点: 我读到通过id比较是不够的,这是对象是数据库的持久实体(见这里)。 此类型的所有对象的名称和编号不是唯一的。 那么我应该如何覆盖它呢? 我还需要比较它里面的hashMap吗? 我很困惑。该对象唯一独特的地方是map myMap,它将在生命周期的后期填充