contains源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
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;
}
String类型
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> strs=new ArrayList<>();
strs.add("Tom");
System.out.println(strs.contains("Tom"));
}}
此时indexOf方法中的调用equals为动态多态,编译时调用Object的equals方法,运行时调用String的equals方法
String的equals方法
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
包装类
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> strs=new ArrayList<>();
strs.add(100);
System.out.println(strs.contains(100));
}}
此时indexOf方法中的调用equals为动态多态,编译时调用Object的equals方法,运行时调用Integer的equals方法
Integer的equals方法
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
自定义类类型
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Student> strs=new ArrayList<>();
strs.add(new Student("111"));
System.out.println(strs.contains(new Student("111"))); //false
}}
public class Student {
private String id;
public Student(String id) {
this.id = id;
}
}
此时indexOf方法中的调用equals为Object的equals方法
Object的equals方法
public boolean equals(Object obj) {
return (this == obj);
}
因为Student类未重写equals方法
现重写equals方法
public class Student {
private String id;
public Student(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
Student s=(Student)obj;
return this.id.equals(s.id);
}
}
此时indexOf方法中的调用equals为动态多态,编译时调用Object的equals方法,运行时调用Student的equals方法
Student的equals方法
@Override
public boolean equals(Object obj) {
Student s=(Student)obj;
return this.id.equals(s.id);