contains方法源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;//返回值结果满足则为true,否则为false
}
indexof()的源代码:
public int indexOf(Object o) {
if (o == null) {
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {//输入进来的字符(即 o)不为空执行下面内容
for (int i = 0; i < size; i++)//size,即集合内的元素个数
if (o.equals(elementData[i]))//多态
return i;//如果 o 与其中元素有相同,返回i
}
return -1;//没有相同返回-1
}
一、String类型:
ArrayList<String> names = new ArrayList<String>();
names.add("Jim");
System.out.println(names.contains("Jim"));
contains方法实质上调用的是String对象中的equals
String对象中的equals方法源代码:
public boolean equals(Object anObject) {
if (this == anObject) {// 若当前对象和比较的对象是同一个对象,返回true
return true;
}
if (anObject instanceof String) {//判断当前传入的对象是否是String类型,若不是直接返回false
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])//直至发现与输入的元素不同的元素停止结束比较,返回false
return false;
i++;
}
return true;//如果每一个元素均与相同,返回true
}
}
return false;
}
二、基本数据类型包装类:
ArrayList<Integer> ages = new ArrayList<Integer>();
ages.add(12);
System.out.println(ages.contains(new Integer(12)));
contains方法实质上调用的是包装类中的equals
Integer包装类中的equals方法源代码:
public boolean equals(Object obj) {
if (obj instanceof Integer) {//首先,判断传进来的Object类型是不是Integer类的一个实例,如果不是直接返回false;
return value == ((Integer)obj).intValue();//如果是则判断两者的成员变量value值是不是相等的
}
return false;
}
intValue() 的源代码:
public int intValue() {
return value;
}
三、 类类型:
ArrayList<Student> students = new ArrayList<Student>();
students.add(new Student("111"));
System.out.println(students.contains(new Student("111")));
object类中的 “==” 相当于比较地址,两个new之间地址肯定不同
因此我们需要对object类中的equals方法进行重写
此时contains方法实质上调用的是类类型中的equals
重现前equals源代码:
public boolean equals(Object obj) {
return (this == obj);//比较地址
}
重现后equals源代码:
public class Student {
private String id;
public Student(String id) {//定义一个构造方法给id赋值
this.id = id;
}
@Override
public boolean equals(Object obj) {
Student s =(Student)obj;//上转型对象下转型,下面才可以调用子类Student新增的属性和方法,即id
String argId = s.id;
String elementId = s.id;
return argId.equals(elementId);
}
}
四、instanceof:
ArrayList<Object> list = new ArrayList<Object>();
list.add(new String("111"));
System.out.println(list.contains(new Student("111")));
此时Student类中重写的equals方法中指的是new String(“111”)字符串,是不可能强制类型转换为学生类的,因此会报错,我们可以在其中加个instanceof
改写Student类代码:
public class Student {
private String id;
public Student(String id) {
this.id = id;
}
@Override
public boolean equals(Object obj) {
if (obj instanceof Student) {//判断只有obj是学生类的时候才强制类型转换,如果不是则直接返回false
Student s = (Student) obj;//上转型对象下转型,之后才可以调用子类Student新增的属性和方法,即id
String argId = this.id;
String elementId = s.id;
return argId.equals(elementId);
}
return false;
}
}