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来进行自定义判断,下一篇会讲到。