| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1244 人关注过本帖
标题:请教有关equals()和hashCode()的问题
只看楼主 加入收藏
tottibuffon
Rank: 2
等 级:论坛游民
帖 子:105
专家分:20
注 册:2009-6-5
结帖率:83.87%
收藏
已结贴  问题点数:20 回复次数:10 
请教有关equals()和hashCode()的问题
import java.lang.*;
public class MyDate {
  private int day;
  private int month;
  private int year;

  public MyDate(int day, int month, int year) {
     this.day   = day;
     this.month = month;
     this.year  = year;
  }
  public MyDate(int month,int year){
     this.month =month;
     this.year = year;
  }
  public MyDate(int year){
      this.year = year;
  }
  public MyDate(MyDate date) {
    this.day   = date.day;
    this.month = date.month;
    this.year  = date.year;
  }

  public int getDay() {
    return day;
  }

  public void setDay(int day) {
    this.day = day;
  }

  public MyDate addDays(int more_days) {
    MyDate new_date = new MyDate(this);

    new_date.day = new_date.day + more_days;
    // Not Yet Implemented: wrap around code...

    return new_date;
  }
  public void print() {
    System.out.println("MyDate: " + day + "-" + month + "-" + year);
    //取对象名称,没做到
    //Class.forName(d.getClass());
    //public final Class getClass()
    //static Class forName(String className)
     
  }
  public boolean equals(MyDate day1){

      if(day1.year==this.year&&day1.month==this.month&&day1.day==this.day)
          return("ture");
      else
          return("false");

  }
 public int hashCode(){

 }

}

equals()方法和hashCode()方法该怎么重写?
原版的equals()方法和hashCode()是如何?
搜索更多相关主题的帖子: hashCode equals 
2009-09-24 20:16
tottibuffon
Rank: 2
等 级:论坛游民
帖 子:105
专家分:20
注 册:2009-6-5
收藏
得分:0 
补充下,那个equals()方法和hashCode()方法是在import java.lang.*的Object类中,能不能通过import语句调用equals()方法和hashCode()方法?
2009-09-24 20:31
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:10 
JDK 1.6文档对hashCode()和equals()的规定如下
hashCode
public int hashCode()返回该对象的哈希码值。支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。  
hashCode 的常规协定是:  
 
在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。  
如果根据 equals(Object) 方法,两个对象是相等的,那么对这两个对象中的每个对象调用 hashCode 方法都必须生成相同的整数结果。  
如果根据 equals(java.lang.Object) 方法,两个对象不相等,那么对这两个对象中的任一对象上调用 hashCode 方法不 要求一定生成不同的整数结果。但是,程序员应该意识到,为不相等的对象生成不同整数结果可以提高哈希表的性能。  
实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。)  
 
 
返回:
此对象的一个哈希码值。
另请参见:
equals(java.lang.Object), Hashtable


equals
public boolean equals(Object obj)指示其他某个对象是否与此对象“相等”。  
equals 方法在非空对象引用上实现相等关系:  
 
自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。  
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。  
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。  
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。  
对于任何非空引用值 x,x.equals(null) 都应返回 false。  
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。  
 
注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。  
 
 
参数:
obj - 要与之比较的引用对象。  
返回:
如果此对象与 obj 参数相同,则返回 true;否则返回 false。
另请参见:
hashCode(), Hashtable


貌似equals()比较要求引用的是同一个对象,所以你如果仅仅要比较两个对象的成员变量(属性)是否完全相同,我觉得没有必要重写equals()方法,你完全可以重新编制一个方法比如equal(),这样也就无需重写hashCode方法了,只是你上面的equals()方法应该是无法通过编译的,因为你把私有成员(private)当成公有成员使用了,而且你把boolean类型的数据取值也弄错了,true和false是不应该加引号的,加了引号就是String类型了。正确的代码应该是这样的:
  public boolean equal(MyDate day1){
 
      if(year==day1.getYear() && month==day1.getMonth() && day== day1.getDay())
          return(ture);
      else
          return(false);
 
  }
2009-09-24 23:03
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
补充一下,对于你要提供别的类存取的每个私有成员,你都应该编写相应的Get和Set方法,就像你代码中编写了getDay()和setDay()一样,你还应该编写getYear()和setYear()以及getMonth()和setMonth()方法,否则你这个类中的两个属性是无法存取的,你的类也就毫无意义了
2009-09-24 23:07
tottibuffon
Rank: 2
等 级:论坛游民
帖 子:105
专家分:20
注 册:2009-6-5
收藏
得分:0 
回复 4楼 ygp_sfec
public int hashCode();应该怎么写?你说的不用重写的话该怎么调用public int hashCode()?
2009-09-25 07:17
tottibuffon
Rank: 2
等 级:论坛游民
帖 子:105
专家分:20
注 册:2009-6-5
收藏
得分:0 
回复 4楼 ygp_sfec
还有哦,已经有
 public MyDate(int day, int month, int year) {
     this.day   = day;
     this.month = month;
     this.year  = year;
  }
函数了,那getDay和setDay那些是不是重复了?
2009-09-25 07:23
tottibuffon
Rank: 2
等 级:论坛游民
帖 子:105
专家分:20
注 册:2009-6-5
收藏
得分:0 
回复 4楼 ygp_sfec
---------- Javac编译 ----------
MyDate.java:66: 找不到符号
符号: 变量 ture
位置: 类 MyDate
          return ture;
                 ^
MyDate.java:68: 找不到符号
符号: 变量 fault
位置: 类 MyDate
          return fault;
                 ^
2 错误

输出完成 (耗时 0 秒) - 正常终止

按你的方法写完还是有错误
2009-09-25 07:25
flyingcloude
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:6
帖 子:598
专家分:1512
注 册:2008-1-13
收藏
得分:10 
以下是引用tottibuffon在2009-9-25 07:25:21的发言:

---------- Javac编译 ----------
MyDate.java:66: 找不到符号
符号: 变量 ture
位置: 类 MyDate
          return ture;
                 ^
MyDate.java:68: 找不到符号
符号: 变量 fault
位置: 类 MyDate
   ...
return ture---->return true;
return fault--->return false;


你能学会你想学会的任何东西,这不是你能不能学会的问题,而是你想不想学的问题
2009-09-25 09:13
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
我把true写到了,不应该是ture,应该是true,就是正确的意思,后面的fault是你自己写错了,应该是false是否的意思,boolean类型只有两个取值,一个true,一个false,就好好比一个判断题,你只能选择“是”或者“否”。
另外,所有类都的最终超类都是Object,Object里面有了equals和hashCode方法了,编程中任何类都可以调用该两个方法,实在要重写,eclipse集成开发环境可自动生成这两个方法,你可以自动生成后看看代码就明白这两个方法的功能了。
另外,好奇地问一句,你变什么程序要调用hashCode方法?
2009-09-25 17:52
ygp_sfec
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:87
专家分:115
注 册:2009-9-8
收藏
得分:0 
还有,在类本身立引用私有成员变量,不必在前面使用this前缀的,但是你在类里面定义本身类的对象,是不可以直接用后缀引用私有成员的,而应该用公有的get方法和set方法来存取
2009-09-25 17:55
快速回复:请教有关equals()和hashCode()的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017775 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved