文档章节

java中重写equals方法

明舞
 明舞
发布于 2014/09/11 11:40
字数 737
阅读 25
收藏 0
import java.util.Date;
class Dog{
 private String name;
 private Date birthday;
  public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
   this.birthday = birthday;
 }
 
}
public class Cat {
 /**Cat类中含有name和birthday两私有成员变量,且重写了equals方法和hashCode方法
  * 
  * @param  name 和 birthday
  * 
  */
 
 private String name;
 private Date birthday;
 
 public Cat(){}
 
  
 
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 
 /*
  * 重写equals必须注意:
  *   1 自反性:对于任意的引用值x,x.equals(x)一定为true
  *   2  对称性:对于任意的引用值x 和 y,当x.equals(y)返回true,y.equals(x)也一定返回true
  *   3 传递性:对于任意的引用值x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也一定返   回 true
   * 4 一致性:对于任意的引用值x 和 y,如果用于equals比较的对象信息没有被修改,
   *           多次调用x.equals(y)要么一致地返回true,要么一致地返回false
   *   5 非空性:对于任意的非空引用值x,x.equals(null)一定返回false
   * 
   * 请注意:
   * 重写equals方法后最好重写hashCode方法,否则两个等价对象可能得到不同的hashCode,这在集合框架中使用可能产生严重后果
  */
 
 
 /*
  *  1.重写equals方法修饰符必须是public,因为是重写的Object的方法.
     *  2.参数类型必须是Object.
  */ 
 public boolean equals(Object other){       //重写equals方法,后面最好重写hashCode方法
  
  if(this == other)                                      //先检查是否其自反性,后比较other是否为空。这样效率高
   return true;
  if(other == null)         
   return false;
  if( !(other instanceof Cat))
   return false;
  
  final Cat cat = (Cat)other;
  
  if( !getName().equals(cat.getName()))
   return false;
  if( !getBirthday().equals(cat.getBirthday()))
   return false;
  return true;
 }
 
 public int hashCode(){                 //hashCode主要是用来提高hash系统的查询效率。当hashCode中不进行任何操作时,可以直接让其返回 一常数,或者不进行重写。
  int result = getName().hashCode();
  result = 29 * result +getBirthday().hashCode();
  return result;
  //return 0;
 }
 public static void main(String[] args) {  
  
  Date dayA = new Date(4000000);  
  Cat a = new Cat();
  a.setName("a");
  a.setBirthday(dayA);
  
  Date dayB = new Date(1000000);
  Cat b = new Cat();
  b.setName("a");
  b.setBirthday(dayB);
  
  Date dayC = dayA;
  Cat c = new Cat();
  c.setName("a");
  c.setBirthday(dayC);
  
  Date dayE = dayA;
  Cat e = new Cat();
  e.setName(a.getName());
  e.setBirthday(a.getBirthday());
  
  Date dayD = dayC;
  Dog d = new Dog();
  d.setName("a");
  d.setBirthday(dayD);
  
  System.out.println(a.equals(b));     //调用自己类中所定义的equals方法
  System.out.println(a.equals(a));
  System.out.println(a.equals(c));
  
  System.out.println(d.equals(a));
  System.out.println(a.equals(d));      //验证重写equals的对称性
  System.out.println(a.equals(e));
  System.out.println(e.equals(c));      //验证重写equals的传递性
  System.out.println(d.getName().equals(a.getName()));   //调用Object类中equals方法
  System.out.println(d.getBirthday().equals(b.getBirthday()));
  
  System.out.println("比较hanshCode的值");
  
  /*
   *    * 比较hashCode方法中返回的值
   * 如果equals返回为true,则hashCode一定返回true。
   * 如果equals返回为false,hashCode返回值不一定不相同。
   * 如果hashCode返回值不同,则equals返回值一定为false。
   * 如果hashCode返回值不同,则equals返回值不一定为false。
   */
  System.out.println(a.hashCode());
  System.out.println(b.hashCode());
  System.out.println(a.hashCode()== b.hashCode());    //如果equals返回false,则各hashCode不一定返回不同值
  System.out.println(a.hashCode() == c.hashCode());    
        
 }
}


© 著作权归作者所有

上一篇: http状态码大全
下一篇: 上海X公司面试
明舞
粉丝 227
博文 424
码字总数 516555
作品 0
程序员
私信 提问
Java拾遗:001 - 重写 equals 和 hashCode 方法

重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被设计成可覆盖(override)的。但任何一个子类在覆盖这些方法时都应遵守一些通用...

一别丶经年
2018/08/02
0
0
Java中关系操作符“==”和equals()方法的区别

一、前言 如果问你Java中==和equals()有何区别,相信你的第一反应会回答:==比较的是它们所指向的对象地址,而equals()方法比较的是它们的内容值。实际上,这样的回答是不全面的。 二、关系操...

Lienson
03/29
0
0
GC复制存活的对象,内存地址会变吗?以前的引用怎么办?

问题 先执行gc方法,10S后打印数组的地址,发现没变,是不是说明复制算法不改变对象的内存地址 解读 toString打印的值现有的匿名回答是正解:题主做的实验根本没有涉及对象地址。java.lang.O...

细节探索者
02/13
0
0
Java 208 道面试题:Java 基础模块答案

目前市面上的面试题存在两大问题:第一,题目太旧好久没有更新了,还都停留在 2010 年之前的状态;第二,近几年 JDK 更新和发布都很快,Java 的用法也变了不少,加上 Java 技术栈也加入了很多...

王磊的博客
03/05
0
0
最最最常见的Java面试题总结-第一周

这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。 Github地址:https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试...

Amsour丶
2018/08/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

偶遇 JDK 1.8 还未修复的 SecureRandom.getInstance("SHA1PRNG") 之 bug

楼主今天兴高采烈的在部署环境,下载 JDK,打包项目,上传至服务器。 配置 JDK ,打包上传项目楼主就不在这里重复了,读者自行解决哈! 1. 启动项目 java -jar xxxx.jar 令楼主没有想到的是:...

Ryan-瑞恩
15分钟前
7
0
【更新】Stimulsoft Reports v2019.3.1发布,新增对OData v4的支持功能

下载Stimulsoft Report.Ultimate v2019.3.1试用版 集所有报表解决方案于一体的综合性平台 Stimulsoft Reports.Ultimate是集所有报表解决方案于一体的综合性平台,拥有在JavaScript、ASP.NET...

xiaochuachua
15分钟前
1
0
JVM源码分析之javaagent原理完全解读

JVM源码分析之javaagent原理完全解读 概述 本文重点讲述javaagent的具体实现,因为它面向的是我们Java程序员,而且agent都是用Java编写的,不需要太多的C/C++编程基础,不过这篇文章里也会讲...

BryceLoski
21分钟前
1
0
git记住密码

git取消记住密码 git config --system --unset credential.helper git记住密码 git config --global credential.helper store...

大灰狼wow
22分钟前
2
0
java 面试知识点笔记(十四)异常体系

问:Error和Exception的区别? ps:Throwable上层是Object Error:程序无法处理的系统错误,编译器不做检查 Exception:程序可以处理的异常,捕获后可能恢复 RuntimeException:不可预知的,...

断风格男丶
25分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部