做了equals为什么没有 object ok! 的显示,为什么p1 和p2不相等?
class testperson
{
public String name;
public int age;

public testperson(String name,int age)
{
this.name=name;
this.age=age;
System.out.println("done!");
}
public static void main(String [] args)
{
testperson p1=new testperson("aaa",20);
testperson p2=new testperson("aaa",20);

if(p1.equals(p2)) 
System.out.println("object ok!");

String a=new String ("eee");
String b=new String ("eee");

if(a.equals(b)) 
System.out.println("string ok!");

}}

解决方案 »

  1.   

    你要override equals 那个方法才行啊, 你可以看看String equal是怎么写的
      

  2.   

    自己的类需要重写equals()方法。否则肯定无法比较的!
    public boolean equals(testperson t){
       if(this.name.equals(t.name) && this.age==t.age){
          return true;
       }else{
          return false;
       }
    }
      

  3.   

    我记得好象在重写equals()方法还同时要重写hashCode()方法,楼主注意一下
      

  4.   

    重写equals()方法还同时要重写hashCode()方法是规范里面规定的,不过你可以不遵守。在使用HashTable,HashSet等集合类时有点问题。
      

  5.   

    p1和p2在内存中是两个不同的对象.
    testperson p2=p1;//p1和p2指向了同一个对象这个时候比较就相等了
      

  6.   

    在HashTable,HashMap,HashXXX...等的类需要重写hashCode()和equals()才能实现key相等的比较,
    其他的一般只要重写equals()方法即可:-)
      

  7.   

    同意 lip009(深蓝忧郁)  
     
      

  8.   

    你创建对象时会分别在内存中开辟新的一块区域,同时p1,p2会指向相应的内存。所以他们的地址是不同的。
    p1.equals(p2)默认调用的是object的equals方法,此方法是比较两个对象的内存地址,因为不相等,所以不会打印"object ok"。
    string的equals方法是个特例,它比较的是两个对象的具体内容.
      

  9.   

    在你的程序中用的equals(Object obj)方法是继承于Object类的方法,而在Object类中定义的equals方法是比较两个对象引用的地址(在Object类中和toString()方法也只对对象引用的地址打印),而不是比较两个对象的具体内容。所以在你调用“p1.equals(p2)”实际上是比较p1和p2的引用值,即p1和p2所引用的在堆中的两个实例化的对象的地址。如果你要比较两个对象的具体内容是否相等,就需要将Object类中的equals方法在testperson 类中进行覆盖(也就是重写或是把Object类中的equals方法隐藏)。具体方法可以借鉴“lip009(深蓝忧郁) ”所写的equals方法。你也可以把其中的if语句改一下,这样可以看得更明白一些:
      if(this.name == t.name && this.age==t.age)
      之所以可以改成这样,是因为你传的实参“aaa”是在String池中创建的,而不是在堆中创建的一个String对象。
      

  10.   

    //object.equals()
    public boolean equals(Object obj) {
    return (this == obj);
        }//String.equals()
    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;
        }