Arraylist中contains方法底层实现解读

Arraylist中contains方法底层实现解读(String类型)

public static void main(String[] args) {
	List<Object> list = new ArrayList<Object>();
	String a = "aa";
	String str = new String("aa");
	list.add(a);
	System.out.println(list.contains(str));
}

在本方法中

contains方法是用来查看集合中是否含有传入的参数str;

首先我们创建两个内存地址不同的String类型的变量

添加其中一个String变量a到Array数组中,然后使用contains方法查看是否含有str中的“aa”。

此时我们进入contains方法阅读底层实现原理:

进入contains方法,这里因为ArrayList重写了List的contains方法,所以运行时走的是ArrayList中的contains方法

进入ArrayList中的contains方法并传入参数为str:

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

此时发现contains调用了indexOf方法,并且传入开始的str进去,进入indexOf方法:

public int indexOf(Object o) {						//进入并调用indexOfRange方法,传入三个参数第一个为"aa",第二个为0,第三个为size为全局变量,初始值为0
    return indexOfRange(o, 0, size);
}

int indexOfRange(Object o, int start, int end) {	//传入三个参数三个参数第一个为"aa",第二个start为0,第三个为当前调用contains集合元素的个数
    Object[] es = elementData;						//将ArraysList数组元素一个一个加到elementData里,之后再把内存地址赋给es
    if (o == null) {								//o不为null不进入
        for (int i = start; i < end; i++) {
            if (es[i] == null) {
                return i;
            }
        }
    } else {										//进入这个方法体
        for (int i = start; i < end; i++) {			//循环最大次数为数组集合个数
            if (o.equals(es[i])) {					//判断语句:如果"aa"和es第i位元素相同,则返回i,此时调用String的equals方法去比较,直接比较长得像不像,直接比较值。此时比较成功,equals比较原理另起一篇来介绍
                return i;							//有相同就进来返回i就是es的下标不成功就返回-1,此时返回i给indexOf
            }
        }
    }
    return -1;
}
public int indexOf(Object o) {
    return indexOfRange(o, 0, size);				//indexOfRange返回给i,然后接着返回给containsi
}
public boolean contains(Object o) {
	return indexOf(o) >= 0;							//i肯定大于等于0返回true
}

此时代码执行完成,比较完成返回ture,表示存在。自定义方法,默认调用equals为Object的方法,所以不会达到预期效果,所以此时需要自己自定义自定义类的equals来进行自定义判断,下一篇会讲到。

posted @ 2021-05-12 21:31    阅读(278)  评论(0编辑  收藏  举报