求助:java中contains的equals方法重写传参是怎么整的?

Luke_Zheng 2019-08-11 06:45:48
最近学习contains传参整不明白了,请指导一下。
比较困惑的是:
集合c中的元素-对象p具有id和name属性,以id作为判断基本判断c中是否含有p时,集合c怎么调用的id?
即equals重写时,p作为传参到obj,然后进行强转,强转后的p.id不变还是其本身的属性。
但是,c作为调用者this,this.id即c.id,但是集合c中不具备id属性,怎么调用比较的。


import java.util.*;

public class Demo1 {
public static void main(String[] args) {
Collection c=new ArrayList();
Person p=new Person(12,"狗娃")
c.add(p);
System.out.println("集合c中的id为"+c.contains(p));
}
}
class Person{
int id;
String name;
public Person(int id,String name) {
this.id=id;
this.name=name;
}
@Override
public boolean equals(Object obj) {
Person p=(Person)obj;
return this.id==id;//判断id是否相等?
}
@Override
public int hashCode() {
return this.hashCode();
}
}

...全文
214 4 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-08-12
  • 打赏
  • 举报
回复
引用 楼主 瑠可_123 的回复:
最近学习contains传参整不明白了,请指导一下。 比较困惑的是: 集合c中的元素-对象p具有id和name属性,以id作为判断基本判断c中是否含有p时,集合c怎么调用的id? 即equals重写时,p作为传参到obj,然后进行强转,强转后的p.id不变还是其本身的属性。 但是,c作为调用者this,this.id即c.id,但是集合c中不具备id属性,怎么调用比较的。
你先要搞清楚语句的用途,这里的c.contains(p)相当于把c中的没个元素的id都和p的id比较。 注意1楼的源码段 else { // 如果o不是null,则循环集合判断有没有于o equals的对象 for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } 重写的equals是重写了这里的比较,原来contains只是元素比较,改写后变成元素内部id值的比较了! 这里的this.id是p.id 而id是elementData[i].id 所以的结论都需要有依据,不要凭空想象this.id就是c.id
Luke_Zheng 2019-08-12
  • 打赏
  • 举报
回复
引用 3 楼 qq_39936465 的回复:
[quote=引用 楼主 瑠可_123 的回复:] 最近学习contains传参整不明白了,请指导一下。 比较困惑的是: 集合c中的元素-对象p具有id和name属性,以id作为判断基本判断c中是否含有p时,集合c怎么调用的id? 即equals重写时,p作为传参到obj,然后进行强转,强转后的p.id不变还是其本身的属性。 但是,c作为调用者this,this.id即c.id,但是集合c中不具备id属性,怎么调用比较的。
你先要搞清楚语句的用途,这里的c.contains(p)相当于把c中的没个元素的id都和p的id比较。 注意1楼的源码段 else { // 如果o不是null,则循环集合判断有没有于o equals的对象 for (int i = 0; i < size; i++) if (o.equals(elementData[i])) return i; } 重写的equals是重写了这里的比较,原来contains只是元素比较,改写后变成元素内部id值的比较了! 这里的this.id是p.id 而id是elementData[i].id 所以的结论都需要有依据,不要凭空想象this.id就是c.id[/quote]我去,完全推反了。 谢谢指导。
Luke_Zheng 2019-08-12
  • 打赏
  • 举报
回复
源码是比较集合中是否有该对象。 但是equals 重写后,比较的是id。 对象属性中有id,但是调用者c哪来的id?
faith.huan 2019-08-11
  • 打赏
  • 举报
回复
首先c这个对象的类型是ArrayList, ArrayList类中contains方法的作用是判断一个对象在不在ArrayList中, 你代码中c.contains(p)的含义是判断c中是否包含p对象, contains方法源码实现如下

 // 判断是否包含o对象
 public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
   
    public int indexOf(Object o) {
        // 如果o为null,则循环当前集合判断有没有null
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
          // 如果o不是null,则循环集合判断有没有于o equals的对象
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }


62,634

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧