zoukankan      html  css  js  c++  java
  • 关于ArrayList 中子方法 contains 疑惑解决

    写之前先看下 ArrayList 子函数 contains 的Api 怎么介绍:

    boolean contains(Object o)
              如果此列表中包含指定的元素,则返回 true

    先看个字面意思过过眼就好了 哈哈哈

    然之后 我们上实例见 问题:(详看注释)

    import java.util.ArrayList;
    import java.util.List;
    
    public class Main {
    
        public static void main(String[] args) {
            List list = new ArrayList();
            Person person_sl = new Person("张三",10);    //Person类无重新写equals
            list.add(person_sl);
            System.out.println(list.contains(person_sl));   //true
            System.out.println(list.contains( new Person("张三",10))); //false
    
    
            list.add("a");
            String str_a = new String("a");
    
            System.out.println(list.contains("a")); //true
            System.out.println(list.contains(str_a));   //true ??? 不是说好比的是地址嘛?
        }
    }

    哎 前头比的是地址 怎么后头两个地址不一样的字符串都为true了????

    别急:我们跟踪进去看看:

    跟进去发现他是ArrayList 重写父接口的 那么 看下他怎么重写的:

    public boolean contains(Object o) {
    return indexOf(o) >= 0;
    }

    一看! 哎! 好家伙! 原来是用 indexof 来找的,那么我们在跟踪进去看看 他 indexof 是怎么实现是:

    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;
    }

      好家伙 这下明白了吧 :除了null之外  他都是用 equals 来判断的:

      那么就懂了:

      我前面已满侠伏笔 说: 无重写 equals ,所以啊 他默认比的是地址

      因为String类 它重写了equals  无论如何 它比的都是 内容 ,这下真相大白了!

      所 你完全可以在自己类重写任何object 的方法,这个设计到面向对象了!

      谢谢大家看到这里 希望能帮到小白和疑惑人群,谢谢!

     

      -----年年花相似  岁岁人不同-----

    本文来自博客园,作者:咸瑜,转载请注明原文链接:https://www.cnblogs.com/bi-hu/p/14672128.html

  • 相关阅读:
    一个完整的移动端项目的构建步骤——框架搭构1
    简单日历,纯js
    javascript语句语义大全(7)
    微软笔试Highway问题解析
    中国电信翼支付2014编程大赛决赛
    海岛问题
    大数计算
    Dijkstra算法
    Android测试之Keycode
    字符串解析
  • 原文地址:https://www.cnblogs.com/bi-hu/p/14672128.html
Copyright © 2011-2022 走看看