第一题(equals和hashCode的重写)

来自竞考网(http://www.jingkao.net/)的2015年“甲骨文杯”全国Java程序设计大赛-赛前模拟

考察类的equals()和hashCode()的重写

何为重写?

(1) 父类与子类之间的多态性,对父类的函数进行重新定义。如果在子类中定义某方法与其父类有相同的名称和参数,我们说该方法被重写 (Overriding)。在Java中,子类可继承父类中的方法,而不需要重新编写相同的方法。但有时子类并不想原封不动地继承父类的方法,而是想作一定的修改,这就需要采用方法的重写。方法重写又称方法覆盖。

(2)若子类中的方法与父类中的某一方法具有相同的方法名、返回类型和参数表,则新方法将覆盖原有的方法。

如需父类中原有的方法,可使用super关键字,该关键字引用了当前类的父类。

(3)子类函数的访问修饰权限不能少于父类的;

知道了重写的定义,接下来看看equals()方法的原型

public boolean equals(Object obj) {

        return (this == obj);

}

重写父类的equals方法时,需要按照以下几个规则设计:

1、自反性:对任意引用值X,x.equals(x)的返回值一定为true.

2、对称性:对于任何引用值x,y,当且仅当y.equals(x)返回值为true时,x.equals(y)的返回值一定为true;

3、传递性:如果x.equals(y)=true, y.equals(z)=true,则x.equals(z)=true

4、一致性:如果参与比较的对象没任何改变,则对象比较的结果也不应该有任何改变

5、非空性:任何非空的引用值X,x.equals(null)的返回值一定为false

根据上面的简述,我们可以知道equals的重写格式了

public boolean equals(Object o){
                Person p = (Person)o;
                return p.name.equals(this.name);
        }

所以A对了(要注意重写时返回值类型和参数列表及类型要保持一致)。

既然会重写equals了,那么就可以顺理成章的写出hashcode了

hashCode的原型

public native int hashCode()

是一个本地方法,实现是根据本地机器相关的。

通常重写hashCode()方法按以下设计原则实现。

(1)把某个非零素数,例如17,保存在int型变量result中。

(2)对于对象中每一个关键域f(指equals方法中考虑的每一个域)参照以下原则处理。

boolean型,计算(f?0:1)。

byte、char和short型,计算(int)f。

long型,计算(int)(f^(f>>32))。

float型,计算Float.floatToIntBits(f)。

double型,计算Double.doubleToLongBits(f)得到一个long,再执行long型的处理。

对象引用,递归调用它的hashCode()方法。

数组域,对其中的每个元素调用它的hashCode()方法。

(3)将上面计算得到的散列码保存到int型变量c,然后执行result = 37 * result + c。

(4)返回result。

这里的重写是

public int hashCode(){
      return name.hashCode();
}

由于equals本身就是错的,所以BCD错了

如果答案错了,还请各位指正!!!

时间: 2024-08-27 19:10:27

第一题(equals和hashCode的重写)的相关文章

关于HashSet的equals和hashcode的重写

关于HashSet的equals和hashcode的重写:package Test; import java.util.HashSet; import java.util.Set; public class HashSetTest { public static void main(String[] args) { Set hs = new HashSet(); hs.add(new Student("张三")); hs.add(new Student("lisi"

关于equals与hashcode的重写

我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 ********************************************************************* 第一个问题:为什么需要重写hashCode()方法和equals()方法 Java中的超类Object类中定义的equals()方法是用来比较两个引用所指向的对象的内存

重写equals和hashCode方法的示例

如果一个类有自己特有的"逻辑相等",且需要以此进行比较时,那么就需要重写equals方法. 在Object的规范中,重写equals方法有下面几条通用约定: 自反性. x.equals(x) == true 对称性.if   y.equals(x) == true , then  x.equals(y) == true 传递性.if   x.equals(y) == true y.equals(x) == true , then x.equals(z) == true 一致性.如果比较

Java:重写equals()和hashCode()

以下内容总结自<Effective Java>. 1.何时需要重写equals() 当一个类有自己特有的“逻辑相等”概念(不同于对象身份的概念). 2.设计equals() [1]使用instanceof操作符检查“实参是否为正确的类型”. [2]对于类中的每一个“关键域”,检查实参中的域与当前对象中对应的域值. [2.1]对于非float和double类型的原语类型域,使用==比较: [2.2]对于对象引用域,递归调用equals方法: [2.3]对于float域,使用Float.float

Java 重写 equals 与 hashCode 的注意事项

为什么重写 equals 的时候必须重写 hashCode 大家可能从很多教程中了解到: SUN官方的文档中规定"如果重定义equals方法,就必须重定义hashCode方法,以便用户可以将对象插入到散列(哈希)表中" 那么 SUN 公司是出于什么考虑做了这个规定呢? 在集合框架中的HashSet,HashTable和HashMap都使用哈希表的形式存储数据,而hashCode计算出来的哈希码便是它们的身份证.哈希码的存在便可以: 快速定位对象,提高哈希表集合的性能. 只有当哈希表中对

java equals()和hashCode()重写总结

在实际开发中有时候会遇到需要比较同一个类的不同实例对象的场景,一般情况下继承自Object父类的equals()和hashCode()可以满足需求,但却不能满足所有的场景,比如只需要使用少数几个对象属性来判断比较是否是同一个对象,这时我们就需要自定义的equals()和hashCode()实现来进行重写覆盖Object中的方法. 1. equals()方法重写注意事项 a. 自反性:对于任意的引用值x,x.equals(x)一定为true. b. 对称性:对于任意的引用值x 和 y,当x.equ

【转】Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例

原文地址:http://www.cnblogs.com/luankun0214/p/4421770.html 感谢网友的分享,记录下来只为学习. 1.重写equals方法实例   部分代码参考http://blog.csdn.net/wangloveall/article/details/7899948 重写equals方法的目的是判断两个对象的内容(内容可以有很多,比如同时比较姓名和年龄,同时相同的才是用一个对象)是否相同 如果不重写equals,那么比较的将是对象的引用是否指向同一块内存地址

JAVA中重写equals()方法为什么要重写hashcode()方法?

object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下:(1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2)当obj1.ha

关于重写equals和hashCode

什么时候需要重写equals和hashCode方法 在比较两个对象的内容的时候,需要重写这两个方法.java系统本身提供的(==)比较方法,有两种情况: 1.比较的是基本类型数据,则此时== 跟equals的效果一致,此时比较的是2个值的大小.例如 2.比较的是对象的引用,则此时==跟equals比较的是2个引用的内存地址是否一致. 这里插入一些对象和对象的引用这个知识点, Student stu=new Student("学生A");  语句1 有人会说,stu就是Student类的