关于equals()方法和clone()方法的疑问 在java中,覆盖Object类的equals()方法的同时为什必须覆盖hashCode()方法?还有,clone()方法在Object中是protected型的,也就是说可以被子类继承且可见的,那为什么我们在给自己写的类实现克隆的时候必须要覆盖该方法呢?为什么不可以直接调用基类方法呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OBJECT 得 clone() 方法 只是浅层次得复制,如果你自己写得类有需要深层次得复制得话,当然要覆盖了JAVA 没有强制你复写equals()方法时候必须得 复写hashCode(), 还是相对于你自己得EQUELS方法怎么写==对比得是HASHCODE equals是对比得对象得值 倘若两个对象equals的话,那么他们的hashCode必然也相等,重写的目的也在于此。 Java规范中指出了a.equals(b)必定可以得出a.hashCode() == b.hashCode();反之不一定成立这样做是因为HashMap等这些类会使用到hashCode的,如果不重写则会造成问题 我上面说得有些错误,EQUEL 是对比得对象得HASHCODE ==只是简单得值对比.,你复写HASHCODE可以不复写HASHCODE ,但是如果你对EQUEL有特殊得要求 那么最好是要复写得 public boolean equals(Object obj) { return (this == obj); }这个是OBJECT里面提供得EQUALS方法你可能会奇怪如果这里用得是==那么不是和==一样了吗,都是比对得值那两个NEW STRING("TEST")不是不一样了吗? 这个是因为STRING对EQUALS和HASHCODE都做了覆写public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; } public int hashCode() { int h = hash; if (h == 0) { int off = offset; char val[] = value; int len = count; for (int i = 0; i < len; i++) { h = 31*h + val[off++]; } hash = h; } return h; } 楼上kingdoom的楼上(哎,也是kingdoom),是不是说错了。你说“我上面说得有些错误,EQUEL 是对比得对象得HASHCODE ==只是简单得值对比.,你复写HASHCODE可以不复写HASHCODE ,但是如果你对EQUEL有特殊得要求 那么最好是要复写得”从Object这个类的代码里面可以看出来,equals和==都是对比两个对象是否是完全同一个对象。而String类复写了equals方法之后,做到了用==来判断两个对象是否是完全同一个对象,用equals来判断两个对象的值是不是相等。应该是这样吧。 == 是判断 栈 上面得,如果判断得是对象其实就是对比判断得引用 STRING 得equels 其实就是对比得HASHCODE 各位说得都很有道理啊那小第就不明白了?为什么既然clone()方法是基类中的protected方法,在子类继承的以后是可见的。我在做设计的时候却不可以调用,编译器会报错,这是为什么?(在没有覆盖的情况下会报错) 首先,如果不覆盖clone()方法,就是浅复制,倘若A类中还包含B类的对象变量的话,那么两个A类对象中的B类对象变量将会指向同一个B类对象。其次,只有A类对象才能克隆A类对象。 java判断字符串表达式的正确性并计算结果 文件输入输出报错 java读取MF格式文件信息中文乱码,大侠们路过进来指点下迷津吧! 关于字符编码问题! 迷惑的Java多线程问题 请问JAVA在图形编程方面前景怎么样啊 初学Java,大家帮帮忙^_^ jvm出现致命错误,出现hs_err_pid*.log 请问,用java可以侦听游戏遥杆的信号吗?该怎样做? java中怎样实现利用socket编写收邮件的代码 请教一个很基础的问题 JAVA老鸟们,给小弟推荐几本学习java的书吧
JAVA 没有强制你复写equals()方法时候必须得 复写hashCode(), 还是相对于你自己得EQUELS方法怎么写==对比得是HASHCODE equals是对比得对象得值
return (this == obj);
}
这个是OBJECT里面提供得EQUALS方法
你可能会奇怪如果这里用得是==那么不是和==一样了吗,都是比对得值那两个NEW STRING("TEST")不是不一样了吗? 这个是因为STRING对EQUALS和HASHCODE都做了覆写
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
public int hashCode() {
int h = hash;
if (h == 0) {
int off = offset;
char val[] = value;
int len = count; for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
你说“我上面说得有些错误,EQUEL 是对比得对象得HASHCODE ==只是简单得值对比.,你复写HASHCODE可以不复写HASHCODE ,但是如果你对EQUEL有特殊得要求 那么最好是要复写得”从Object这个类的代码里面可以看出来,equals和==都是对比两个对象是否是完全同一个对象。
而String类复写了equals方法之后,做到了用==来判断两个对象是否是完全同一个对象,用equals来判断两个对象的值是不是相等。
应该是这样吧。
STRING 得equels 其实就是对比得HASHCODE
那小第就不明白了?为什么既然clone()方法是基类中的protected方法,在子类继承的以后是可见的。我在做设计的时候却不可以调用,编译器会报错,这是为什么?(在没有覆盖的情况下会报错)
其次,只有A类对象才能克隆A类对象。