ArrayList的contains方法,有以下三种类型:
形式一:
查找的字符不为null时,看如下代码:
import java.util.ArrayList;
public class Work {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Tom");
String str = "Tom";
System.out.println(list.contains(str));
}
}
输出:
true
分析ArrayList的contains源代码:
public boolean contains(Object o) { //o指向str的对象,str为String类的对象,因此str为上转型对象。
return indexOf(o) >= 0; //indexOf(o)执行结束后,返回了0,所以此处返回true。
}
public int indexOf(Object o) {
if (o == null) { //str不等于null,所以为false,进入else。
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++) //size为this.size,即list.size,该for语句将list遍历进行一一比较。
if (o.equals(elementData[i])) //因为o为上转型对象,所以equals方法运用了多态,此次实际运用的是String类的equals方法,即比较字符串的内容是否相同。
return i; //如果满足if,则返回一个大于等于0的值,则由上面代码可知,此处返回0。
}
return -1;
}
形式二:
查找的字符为null时,看如下代码:
import java.util.ArrayList;
public class Work {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Tom");
String str = null;
System.out.println(list.contains(str));
}
}
输出:
false
分析ArrayList的contains源代码:
public boolean contains(Object o) { //o指向str的对象,str为String类的对象,因此str为上转型对象。
return indexOf(o) >= 0; //indexOf(o)执行结束后,返回了-1,所以此处返回false。
}
public int indexOf(Object o) {
if (o == null) { //str等于null,进入if内容。
for (int i = 0; i < size; i++) //对list进行遍历。
if (elementData[i]==null) //如果由元素等于null,则返回一个大于等于0的数,此处没有null,所以继续往下走。
return i;
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1; //for语句没有进行return,所以在这里返回了-1。
}
形式三:
查找的不是字符类型时,看如下代码:
import java.util.ArrayList;
public class Work {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("Tom");
Test test = new Test();
System.out.println(list.contains(test));
}
}
输出:
false
分析ArrayList的contains源代码:
public boolean contains(Object o) { //o指向test的对象,test为Test类的对象,因此test为上转型对象。
return indexOf(o) >= 0; //indexOf(o)执行结束后,返回了-1,所以此处返回false。
}
public int indexOf(Object o) {
if (o == null) { //
for (int i = 0; i < size; i++) //test不等于null,所以为false,进入else。
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++) //size为this.size,即list.size,该for语句将list遍历进行一一比较。
if (o.equals(elementData[i])) //因为o为上转型对象,所以equals方法运用了多态,此次实际运用的是Test类的equals方法,即Object类中的equals方法,即比较地址是否相同。此处不可能相同。
return i; //没有数据使if的条件为true,所以该句不执行。
}
return -1; //上面代码没有执行过return,所以在这里返回了-1。
}