可以不同不过api上是这么写的 Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
不对的 hashCode肯定也一样,不信可以验证 ------------------- class A{ int a; public A(int a){this.a = a;} public boolean equals(Object o){return true;} public int hashCode(){return a;} }老兄,这个类有问题吗,equals返回true,hashCode也肯定一样?
to; sswater(光杆兵)既然是相互独立的方法而已,要怎么实现随你便。那么请解释下面的结果吧 class A{ public int hashCode(){this.toString();return 55;} public static void main(String[] args) { A ss=new A(); ss.hashCode();
} }
to; sswater(光杆兵)既然是相互独立的方法而已,要怎么实现随你便。那么请解释下面的结果吧 class A{ public int hashCode(){this.toString();return 55;} public static void main(String[] args) { A ss=new A(); ss.hashCode();
TO :ChDw(米) ( ) 刚上完课回来,唉,美女总是配丑男!都会调用它了,你还说没有直接关系!如果它们都已经独立了,那还存在什么调用关系!你们几个人认识的吧!还有啊,我是针对上面说不可以随意写,而不是说不能复写hashCode!你们几个人认识的吧!当然我没说他们有直接关系,因为你所说的直接关系指的是什么,你举个例子吧!最后,我还是觉得,你们是认识的吧!
对的,但是不建议这么做的。public class Test { int value; public Test(int value) { this.value = value; } /** * 覆写equals 根据value判断 * @param o * @return */ public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } final Test test = (Test) o; if (value != test.value) { return false; } return true; } public static void main(String[] args) { Test test1 = new Test(1); Test test2 = new Test(1); System.out.println("test1 hashcode is:" + test1.hashCode()); System.out.println("test2 hashcode is:" +test2.hashCode()); System.out.println("test1 equals test2 is:" + test1.equals(test2)); } }此代码在我机器上执行的结果为: test1 hashcode is:24287316 test2 hashcode is:7254922 test1 equals test2 is:true请说不对的同志执行以下,hashcode的值可不同。
没有说这句话不对,只是这样会造成问题而已Test test1 = new Test(1); Test test2 = new Test(1);HashMap map = new HashMap(); map.put(test1, "Value"); System.out.println(map.get(test2)); 这样是会非常可能返回null的,除非运气很好。
Note that it is generally necessary to override the hashCode method whenever this method is overridden, so as to maintain the general contract for the hashCode method, which states that equal objects must have equal hash codes.
看这个帖子,把我快搞晕了
当然,你在自己的类中可以不符合上述规范,但是这样做的后果就是无法放入HashMap这些类中
因为 map.put(A, value) 之后,应该来说是可以通过 map.get(B) 返回 value的但是由于hashCode不相同,那么map也就找不到value的位置了
=========================
楼主的问题答案应该是不对的;
这要求我们覆写equals同时必须overridden hashCode方法;hashCode的默认约定中有一条:
如果两个对象根据equals(o)是相等的,则调用这个两个对象中人一个对象的hashCode方法必产生同样的整数结果同时建议看看EFFECTIVE JAVA上面说的很清楚
object.hashcode()方法返回的值叫做散列码,是根据对象在堆内存中的首地址转换过来的.
既然是对象,在堆内存中的首地址必然不同,所以返回的散列码也必然不同.
所以这句话可以说是对的.
object.hashcode()方法返回的值叫做散列码,是根据对象在堆内存中的首地址转换过来的.
既然是对象,在堆内存中的首地址必然不同,所以返回的散列码也必然不同.
所以这句话可以说是对的.
---------------------
这位老兄讲得很有问题吧
hashcode并非一定是首地址,每个类都可以定义自己的hashcode,
public int hashCode(){return 17;}
z这样该类的所有对象都返回相同的hashcode,但他们不可能都是对同一个地址的引用,只不过hashcode要尽量的避免重复,所以这样的写法显然是不可接受的,但逻辑上没错从语法角度来讲,equals跟hashcode没有必然的关系,但是override的时候建议也override hashcode,使得equqls返回true的时候,hashcode也相等
其实我一直想告诉你一件事,我是复写过TOSTRING()函数的,不过我复写它的时候都要调用HASHCDE()函数,就想我复写“一阔”函数一样!!喜喜;-)
hashCode肯定也一样,不信可以验证
只是说怎么样好怎么样不好而已,不知道搂主有没有听懂。实在不想在此过多讨论这个无聊的问题。
hashCode肯定也一样,不信可以验证
-------------------
class A{
int a;
public A(int a){this.a = a;}
public boolean equals(Object o){return true;}
public int hashCode(){return a;}
}老兄,这个类有问题吗,equals返回true,hashCode也肯定一样?
class A{ public int hashCode(){this.toString();return 55;}
public static void main(String[] args)
{
A ss=new A();
ss.hashCode();
}
}
class A{ public int hashCode(){this.toString();return 55;}
public static void main(String[] args)
{
A ss=new A();
ss.hashCode();
}
}
---------------------------------
老兄,这个要解释什么?你的代码想说明什么
我认为sswater(光杆兵)讲的并没错,这些方法之间的并不存在强制的约束关系,只不过按照jdk规范,或者出于散列等方面的因素,通常在改写equals方法同时也需要改写hashCode,也就是sswater(光杆兵)说的“只是说怎么样好怎么样不好而已”
老大姐我要他解释运行结果啊
给我点分吧!嘻嘻,你是一个帅哥!!
一般在自己写的类中,我如果需要复写就hashCode, toString equals都一起复写的
刚上完课回来,唉,美女总是配丑男!都会调用它了,你还说没有直接关系!如果它们都已经独立了,那还存在什么调用关系!你们几个人认识的吧!还有啊,我是针对上面说不可以随意写,而不是说不能复写hashCode!你们几个人认识的吧!当然我没说他们有直接关系,因为你所说的直接关系指的是什么,你举个例子吧!最后,我还是觉得,你们是认识的吧!
“我挺荣幸的!反对这句话的都是书呆子!”
--------
似乎你好像觉得自己就是对的似的,似乎说别人书呆子是你的特权,别人说一点过火的话似乎就违背你说的“1,反对粗俗语言”,
我怎么觉得似乎是你在说“粗俗语言”,是你在用“你行别人不行的态度去看别人”
还有什么认识不认识的,别瞎猜了,认识又怎么样,不认识又怎么样,到这里讨论问题的人不会因为认识而说一些违心的话,至少我这里的人一个都不认识,至多他们的ID很熟悉而已
{
int value;
public Test(int value)
{
this.value = value;
} /**
* 覆写equals 根据value判断
* @param o
* @return
*/
public boolean equals(Object o)
{
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
} final Test test = (Test) o; if (value != test.value) {
return false;
} return true;
} public static void main(String[] args)
{
Test test1 = new Test(1);
Test test2 = new Test(1); System.out.println("test1 hashcode is:" + test1.hashCode());
System.out.println("test2 hashcode is:" +test2.hashCode()); System.out.println("test1 equals test2 is:" + test1.equals(test2));
}
}此代码在我机器上执行的结果为:
test1 hashcode is:24287316
test2 hashcode is:7254922
test1 equals test2 is:true请说不对的同志执行以下,hashcode的值可不同。
Test test2 = new Test(1);HashMap map = new HashMap();
map.put(test1, "Value");
System.out.println(map.get(test2)); 这样是会非常可能返回null的,除非运气很好。
******************************************************************
回复人: ChDw(米) ( ) 信誉:155 2005-12-21 09:43:00 得分: 0
没有说这句话不对,只是这样会造成问题而已Test test1 = new Test(1);
Test test2 = new Test(1);HashMap map = new HashMap();
map.put(test1, "Value");
System.out.println(map.get(test2)); 这样是会非常可能返回null的,除非运气很好。 *************************************************************************
说得很对 gethashcode是用来做hash的key 而不是用来判断是否相等的 在这里看到了这片帖子 有学到了很多东西 感谢 ChDw(米)
而在Effective Java里是推荐尽量保持一致的其中一个主要原因:
如果该对象作为哈希表中的key存在,那么如果equals和hashcode不相等,则容易导致冲突(哈希表内查找),散列表冲突虽然有很多种数学解决办法,但必然会影响哈希表查找的速度
除非你重载equals方法.否则判断对象相等的条件是,首先类型匹配,还有就是hashcode相等.
错误,类型相同根本不代表hashCode相同,请你实验后再说,不要误导别人。
instanceof 更不是依据hashCode判断
System.out.println(new Integer(1).hashCode());//打印1
System.out.println(new Integer(2).hashCode());//打印2判断两个对象是否相等的条件就是equals返回true,hashCode主要是使用在HashMap这些地方
可以提高比较速度