两个对象相等(==)的条件是this.equals(other)为true,hashcode相同,但是我的这两个都相同,可是this==other为false,求解package com.tiger.bean;public class Count { Count() {
} Count(int []a,int []b) {
this.randomArray=a;
this.last=b;
}
private int[] randomArray;
private int[] last; public int[] getRandomArray() {
return randomArray;
} public void setRandomArray(int[] randomArray) {
this.randomArray = randomArray;
} public int[] getLast() {
return last;
} public void setLast(int[] last) {
this.last = last;
} @Override
/*
 * public int hashCode() { final int prime = 31; int result = 1; for (int i
 * = 0; i < array.length; i++) { result = prime * result + array[i]; }
 * for(int i=0;i<single.length;i++){ result=prime*result+single[i]; }
 * 
 * return result; }
 */
public int hashCode() {
final int prime = 31;
int result = 1;
for (int i = 0; i < randomArray.length; i++) {
result = result * prime + randomArray[i];
} for (int i = 0; i < last.length; i++) {
result = result * prime + last[i];
}
return result;
} @Override
public boolean equals(Object obj) {
boolean b = false;
if (obj instanceof Count) {
Count c = (Count) obj;
/*
 * if(IntArray.isEqual(this.randomArray,
 * c.randomArray)&&IntArray.isEqual(this.last, c.randomArray)){
 */
if (this.toString().equals(c.toString())) {
b = true;
} } return b;
} @Override
public String toString() {
StringBuffer sb = new StringBuffer();
for (int i = 0; i < randomArray.length; i++) {
sb.append(randomArray[i]).append(" ");
}
sb.append("+ ");
for (int i = 0; i < last.length; i++) {
sb.append(last[i]).append(" ");
}
return sb.toString();
}}
//测试程序package com.tiger.bean;public class Test1 {
public static void main(String[] args) {

int a[] = { 1, 2, 3, 4, 5, 6 };
int b[] = { 7 };
Count c1 = new Count(a,b);
Count c2 = new Count(a,b);
/* c1.setRandomArray(a);
c1.setLast(b);
c2.setRandomArray(a);
c2.setLast(b);*/
System.out.println(c1.hashCode()==(c2.hashCode())); //输出为true
System.out.println(c1.equals(c2));//输出为true System.out.println(c1==c2);//输出为false
}}

解决方案 »

  1.   

    楼主第一句就错了,对象之间的==运算判定的是两者内存地址是否一样,而equals才是你理解的那个。
    你采用new 分别创建c1 c2,实际上程序会在运行时候的堆区创建两个对象,并返回c1 c2作为对象的引用,因此c1和c2的==比较不同,而c1.equals(c2)则是true
      

  2.   

    //测试两个对象是否相等的例子
    public MyClass{
    private String s1 = "23";
    private String s2 = "abc";
    private String s3 = "hello";
    //
    //其他方法(略)
    //
    //测试两个对象是否相等的方法
    public boolean equals(Object otherObject){
    //如果this与otherObject是相同的立即返回true
    if(this == otherObject) return ture;
    //如果测试的参数是null必须返回false
    if(otherObject == null) return false;
    //如果类不匹配,它们是不会相等的
    if(getClass() != otherObject.getClass())
    return false;
    //现在已知otherObject是一个non-null MyClass
    MyClass other = (MyClass)otherObject;

    //测试所有的字段是否都有同样的值
    return s1.equals(other.s1)
    && s2.equals(other.s2)
    && s3.equals(other.s3);
    }
    }
    注意测试的顺序不要错。
      

  3.   

    equals重写之后比较的是内容,==跟默认的hashcode比较的是地址,但是楼主把hashcode重写了,比较的不是地址