0
  • 最佳答案

    这样的问题很简单的,就算我从来没有学过java,我也可以找到答案。


    第一种方法,看注释:


    /**
     * Returns <tt>true</tt> if this list contains the specified element.
     * More formally, returns <tt>true</tt> if and only if this list contains
     * at least one element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this list is to be tested
     * @return <tt>true</tt> if this list contains the specified element
     * @throws ClassCastException if the type of the specified element
     *         is incompatible with this list
     * (<a href="Collection.html#optional-restrictions">optional</a>)
     * @throws NullPointerException if the specified element is null and this
     *         list does not permit null elements
     * (<a href="Collection.html#optional-restrictions">optional</a>)
     */
    


    上面不是有说吗?


    如果为null,则判空,如果非空就是o.equals(e)的比较。


    第二个方法,如果没有注释呢?


    假设别人的代码没有给出注释怎么办呢?


    读源码呀,源码里没有秘密。


    boolean contains(Object o);
    


    这是list里的接口方法


    我就写一个例子


    List<String> arrayList = new ArrayList<>();
    arrayList.contains("test");
    


    实现类是ArrayList吧,进去看ArrayList的源码


    这就是它的比较代码


    /**
     * Returns <tt>true</tt> if this list contains the specified element.
     * More formally, returns <tt>true</tt> if and only if this list contains
     * at least one element <tt>e</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;e==null&nbsp;:&nbsp;o.equals(e))</tt>.
     *
     * @param o element whose presence in this list is to be tested
     * @return <tt>true</tt> if this list contains the specified element
     */
    public boolean contains(Object o) {
        return indexOf(o) >= 0;
    }
    



    再看


    indexOf(o)
    


    结果就出来了


    /**
     * Returns the index of the first occurrence of the specified element
     * in this list, or -1 if this list does not contain the element.
     * More formally, returns the lowest index <tt>i</tt> such that
     * <tt>(o==null&nbsp;?&nbsp;get(i)==null&nbsp;:&nbsp;o.equals(get(i)))</tt>,
     * or -1 if there is no such index.
     */
    public int indexOf(Object o) {
        if (o == null) {
            for (int i = 0; i < size; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = 0; i < size; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }
    


    再反问自己,调用equals方法的时候,调用的是谁的呀?你的对象都没有这个方法,又没有父类,那肯定是object里的呀。


    这就是结了吗?


    这么简单。



    1153952789488054272  评论     打赏       拉大锯
    • 他的equals如果是这样,那么通过list.container()判断出来也是true

      @Override
      
      	public boolean equals(Object obj) {
      
      		// TODO Auto-generated method stub
      
      		Person person = (Person)obj;
      
      		if (person.age == this.age&&person.name.equals(this.name)) {
      
      			return true;
      
      		}
      
      		return false;
      
      	}
      
      1231473582161268736  评论     打赏       感同身受
      • Archer  回复 @感同身受
        这个应该还需要先判断Object是不是Person类
        Archer 2020-08-07 23:31   回复 1177571912214142976
      • 感同身受  回复 @Archer
        按严格来说,在向下转型之前,确实应该先用instanceof判断一下是否是Person或Person的子类,但这里我主要是想表达一种可行的方法,就没写那么严谨了
        感同身受 2020-08-09 13:22   回复 1231473582161268736
      • 感同身受  回复 @Archer
        按严格来说,在向下转型之前,确实应该先用instanceof判断一下是否是Person或Person的子类,但这里我主要是想表达一种可行的方法,就没写那么严谨了
        感同身受 2020-08-09 13:22   回复 1231473582161268736
      • Archer  回复 @感同身受
        好的👌,收到,嘻嘻
        Archer 2020-08-10 02:53   回复 1177571912214142976
    • 你上面的代码中,你的new Person(11,"Jack")是在建立一个新匿名的对象,而你的list.container()是在查询list里面是否有当前这个对象了,所以你新建立的对象肯定不在你的list里面啊,所以返回false。


      你下面的代码中,你应该没展示完,你的p3这个对象,应该是在之前调用list.add(p3)把p3这个对象添加到了list里面了,所以后面调用list.container()的时候,就能查到他在你的list里面啦,所以返回true


      最后,按照你上面的代码,只能返回false,因为你两次创建的都是匿名对象,使用一次之后,就找不到这个匿名对象了,就算你提前list.add(new Person(11,"Jack")),后面通过list.container(new Person(11,"Jack"))也是找不到的,因为第二次使用new Person(11,"Jack")又会是一个新的对象

      1231473582161268736  评论     打赏       感同身受
      • Archer  回复 @感同身受
        我刚才发了课文的原图~ 这个。。。。
        Archer 2020-08-03 22:41   回复 1177571912214142976
      • 感同身受  回复 @Archer
        如果按照书上的情况,我猜测他的Person类应该重写了equals这个方法吧,导致不再以他们的内存地址为判断条件了
        感同身受 2020-08-03 23:41   回复 1231473582161268736
      • 感同身受  回复 @Archer
        如果按照书上的情况,我猜测他的Person类应该重写了equals这个方法吧,导致不再以他们的内存地址为判断条件了
        感同身受 2020-08-03 23:41   回复 1231473582161268736
      • Archer  回复 @感同身受
        equals方法没有重写,只重写了CompareTo方法和toString方法
        Archer 2020-08-04 01:09   回复 1177571912214142976
      • Archer  回复 @感同身受
        还有compare方法
        Archer 2020-08-04 01:12   回复 1177571912214142976
      • 感同身受  回复 @Archer
        compare和CompareTo是影响排序的,contains的源码最后也是调用对象的equals方法去判断list中的每个元素是否和你查的元素相等。如果没有重写equals方法都能返回true,要么是书上有问题,要么是我才疏学浅,没想到
        感同身受 2020-08-04 12:35   回复 1231473582161268736
    • 这个是按照书本一模一样打的

      1177571912214142976  评论     打赏       Archer
      • 拉大锯  回复 @Archer
        没有覆写equals方法呀。
        拉大锯 2020-08-07 23:50   回复 1153952789488054272

    • 课文原图

      1177571912214142976  评论     打赏       Archer
      • 拉大锯  回复 @Archer
        你书上的Person对象内容呢?
        拉大锯 2020-08-07 11:30   回复 1153952789488054272
      • Archer  回复 @拉大锯
        在另外一页,我把补充放在评论那里吧~
        Archer 2020-08-07 23:26   回复 1177571912214142976
    相关问题
    康师傅的小跟班 · JAVA
    2019-09-10 05:09 1294 2
    2020-03-08 05:30 843 2
    吕氏春秋 · java / 多线程并发
    2020-03-19 03:46 857 4
    不易 · java
    2020-06-06 19:41 461 2
    夙夜星辰叹 · javaweb
    2020-06-24 03:07 457 2
    2020-07-21 06:26 937 2
    CodeWwang · JAVA
    2020-07-22 06:11 438 2
    路不离开 · JAVA / IDEA
    2020-09-02 20:59 394 2