简述contains的底层实现
举例String的contains底层:
main⽅法:
List<String> names= new ArrayList<>();
names.add("Jimmy");
System.out.ains("Jimmy"));
contains源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
immy传⼊到contains⽅法中的参数,即o指向Jimmy所指向的对象,o为上转型对象
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;
}
indexof⽅法流程:判断o是否为null。如果是null,则循环if(jimmy ==null),如果到,将index赋值为到的地址,则返回index。
因为Jimmy不是null,则for循环遍历names中每⼀个元素;其中size为全局变量,实质为this.size,意思是names的元素个数。让Jimmy和数组中的每⼀个元素进⾏⽐较。如果到,返回i下标,则返回index。不到就返回-1。
由题知,names为⼀个上转型对象,运⾏时会调⽤ArrayList⾥的已有的equals⽅法。
string的equal源码
public boolean equals(Object anObject) {
if (this == anObject) {// 如果是同⼀个对象,返回true
return true;
}
if (anObject instanceof String) { // 判断是否是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++;
}
equals()方法return true;
}
}
return false;
}
ArrayList⾥的equals⽅法流程:1.判断与Jimmy⽐较的name中的元素的类型是否为String或者⼦类,如果不同,则返回false,如果相同,执⾏String的equals。
因为String的equals只判断字符是否相同,所以输出结果为true。
举例⾃定义的contains底层:
定义student:
public class Student {
String id;
@Override
public Student(String id) {
super();
this.id = id;
}
main⽅法:
List<Student> list = new ArrayList<>();
list.add(new Student("110"));
System.out.ains(new Student("110")));
contains源码:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
new Student("110")传⼊到contains⽅法中的参数,即指向new Student("110")所指向的对象,new Student("110")为上转型对象
indexof源码:
public int indexOf(Object o) {
return indexOfRange(o, 0, size);
}
int indexOfRange(Object o, int start, int end) {
Object[] es = elementData;
if (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])) {
return i;
}
}
}
return -1;
}
object的equals的源码:
public boolean equals(Object obj) {
return (this == obj);
}
因为如果运⾏上图,因为Student没有equals⽅法,则会调⽤object的equals⽅法,object⽐较地址是否相同,不能很好的实现我们想要的结果,使⽤需要重写Student的equals⽅法。
重写equals⽅法:
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student student = (Student) obj;
return this.id.equals(student.id);
}
return false;
}
这⾥obj是⼀个上转型对象,将new Student("110")判断是否为Student,如果没有这步,这可能出现类型转化错误,然后将obj下转型,这样才能调⽤Student的⽅法。最后将names的值的id和110进⾏⽐较,返回⼀个true或者flase。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论