首先看一段代码
package blog;
import java.util.ArrayList;
public class Equals {
public static void main(String[] args) {
ArrayList<String> nameList = new ArrayList<>();//JDK7.0+
nameList.add("Tom");
String name = "Tom";
System.out.println(nameList.contains(name));
}
}
那么contains是怎么实现的呢?这就需要分析其源代码了。如下
情况一:
package blog;
import java.util.ArrayList;
public class Contains {
public static void main(String[] args) {
ArrayList<String> nameList = new ArrayList<>();//JDK7.0及以后版本,可以前面<>有内容,后面<>里为空
nameList.add("Tom");
String name = "Tom";
System.out.println(nameList.contains(name));//输出true
//contains源码
/*
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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;
}
*/
}
}
contains源码分析
/*public boolean contains(Object o) {
//首先name传入到contains方法中的参数,即o指向name所指向的对象,name对象为上转型对象
return indexOf(o) >= 0;//调用下面indexOf方法
}
public int indexOf(Object o) {
//indexOf方法中o指向contains方法中o指向的对象,即indexOf方法o实质指向name对象
if (o == null) {
//o不为null,所以o == null 为false,跳到else部分
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++)//for循环遍历nameList中每一个元素;其中size为全局变量,省略了this,其实是this.size,nameList调用了contains方法,所以this指代nameList,this.size指nameList中的元素个数;
if (o.equals(elementData[i]))//o指向的对象即name,与nameList中遍历出来的每个元素进行对比,对比规则用到equals方法,o.equals(elementData[i]),因为o指向name变量的地址,所以执行时指