public boolean equals(Object obj){
if(this==obj){
return true ;
}
if(!(obj instanceof Person)){
return false ;
}
Person p = (Person)obj ;
if(this.name.equals(p.name)&&this.age==p.age){
return true ;
}else{
return false ;
}
}
帮我解释一下这段代码,谢了。。在线等啊 

解决方案 »

  1.   

    this==obj,先判断地址是不是一样,如果一样返回true;
    在判断if(!(obj instanceof Person))是不是Person类的一个实例
    如果是
    判断this.name.equals(p.name)&&this.age==p.age
    判断属性值是否相等,如果相等,返回true。则this equals o;
      

  2.   

    如果this和obj指向的是一个东西,== 成立返回true (貌似这种情况叫identity equal)
    如果obj的类型不是Person或者Person的子类,就不具可比性,返回false
    如果obj的name和age和this的name和age的用equals相等,则返回true
    不属于以上情况就返回false
      

  3.   

    还有一个问题,this和obj代表什么含义啊。。this表示当前对象,obj表示传入的类的实例,可是你比如这段代码。是谁在调用equals,又是传入的什么类的实例?????
    import java.util.Map ;
    import java.util.HashMap ;
    class Person{
    private String name ;
    private int age ;
    public Person(String name,int age){
    this.name = name ;
    this.age = age ;
    }
    public String toString(){
    return "姓名:" + this.name + ";年龄:" + this.age ;
    }
    public boolean equals(Object obj){
    if(this==obj){
    return true ;
    }
    if(!(obj instanceof Person)){
    return false ;
    }
    Person p = (Person)obj ;
    if(this.name.equals(p.name)&&this.age==p.age){
    return true ;
    }else{
    return false ;
    }
    }
    public int hashCode(){
    return this.name.hashCode() * this.age ;
    }
    };
    public class HashMapDemo08{
    public static void main(String args[]){
    Map<Person,String> map = null ;
    map = new HashMap<Person,String>() ;
    map.put(new Person("张三",30),"zhangsan"); // 增加内容
    System.out.println(map.get(new Person("张三",30))) ;
    }
    };
      

  4.   

    这个你得看看HashMap的put方法了,记得put方法会检查key(也用equals检查key是否已经存在),如果已经有key了,就在key对应的链表上进行检查,(用equals检查key对应的value是否已经在HashMap中了,没有的话就对链表做表头插入)具体就不记得了,可以这样想:a.equals(b),a就是this,b就是obj
      

  5.   

    可以这样想:a.equals(b),a就是this,b就是obj   这一句还是明白的,不过我再理解理解前面的那些话。。
      

  6.   

    那这段代码来说吧!!求解释是谁在调用equals方法和传入了哪个obj。。thank u very much!!!
    import java.util.Set ;
    import java.util.HashSet ;
    class Person{
    private String name ;
    private int age ;
    public Person(String name,int age){
    this.name = name ;
    this.age = age ;
    }
    public boolean equals(Object obj){ // 覆写equals,完成对象比较
    if(this==obj){
    return true ;
    }
    if(!(obj instanceof Person)){
    return false ;
    }
    Person p = (Person)obj ; // 向下转型
    if(this.name.equals(p.name)&&this.age==p.age){
    return true ;
    }else{
    return false ;
    }
    }
    public int hashCode(){
    return this.name.hashCode() * this.age ; // 定义一个公式
    }
    public String toString(){
    return "姓名:" + this.name + ";年龄:" + this.age ;
    }
    };
    public class RepeatDemo02{
    public static void main(String args[]){
    Set<Person> allSet = new HashSet<Person>() ;
    allSet.add(new Person("张三",30)) ;
    allSet.add(new Person("李四",31)) ;
    allSet.add(new Person("王五",32)) ;
    allSet.add(new Person("王五",32)) ;
    allSet.add(new Person("王五",32)) ;
    allSet.add(new Person("赵六",33)) ;
    allSet.add(new Person("孙七",33)) ;
    System.out.println(allSet) ;
    }
    };
      

  7.   

    现在还没用到,只用到了hashCode();和toString();
    Person a = new Person("张三",30);
    Person b = new Person("张三",30);
    System.out.println(a.equals(b));
    楼主把equals方法注掉就会发现问题了。
    没重写equals调用的是object 的equals方法,所以返回false;
    重写了返回true;
      

  8.   

    看错了,Set有去重复功能。
    应该是Set先调用equals比较是否重复,然后用hashcode进行排序吧。
      

  9.   

    if(this==obj){
    return true ;
    }
    如果这个对象本身(就是你这段代码所在的那个类所实例出的对象)和你传入的那个object类型的对象obj是同一个储存地址,就返回return true,结束此方法。
    注意:如果是同一个储存地址,就代表根本就是同一个对象,这个能理解吗?if(!(obj instanceof Person)){
    return false ;
    }
    obj instanceof Person:测试传入的obj对象是否是Person的实例或者是Person子类的实例,如果是,这条语句的值就是true,那么此时](!(obj instanceof Person)的值就是false,反之则是true。也就是当obj不是Person或Person子类的实例是,方法会执行return false 并退出方法。Person p = (Person)obj ;
    这是将obj强制转型为Person类对象。if(this.name.equals(p.name)&&this.age==p.age){
    return true ;
    }else{
    return false ;
    }
    如果这个对象本身的成员变量name中的内容与p中的name相等(注意这是字符串中内容相等),并且这个对象本身的age与p的age相等(比较值大小),就return true,退出方法。否则,返回false退出方法。
      

  10.   

    如果比较的两个对象,equals和hashCode都相同的话,就为true。。
      

  11.   


    public boolean equals(Object obj){
    if(this==obj){//判断当前对象是否要比较的对象,如果是就反回真
    return true ;
    }
    if(!(obj instanceof Person)){//判断比较对象是否是Person类型,否则反回假
    return false ;
    }
    Person p = (Person)obj ; //将obj向下转型为Person
    if(this.name.equals(p.name)&&this.age==p.age){//判断是否属性相同
    return true ;//相同则是相等
    }else{
    return false ;//不同则不等
    }
    }
      

  12.   


    public V put(K key, V value) {
            if (key == null)
                return putForNullKey(value);
            int hash = hash(key.hashCode());
            int i = indexFor(hash, table.length);
            for (Entry<K,V> e = table[i]; e != null; e = e.next) {
                Object k;
                if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                    V oldValue = e.value;
                    e.value = value;
                    e.recordAccess(this);
                    return oldValue;
                }
            }        modCount++;
            addEntry(hash, key, value, i);
            return null;
        }
    //源码:
    hashSet中建了一个map,这是map的put方法。
    先求出hash值,在取出set里面的每个元素,判断
    hash是否相等,并且,对象引用地址是否相等,或者两者equals。