下面是contains源码
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变量的地址,所以执行时指向的是String类中的equals,
return i;//因为if(true),所以返回i,跳转到contains方法,方法体中 return indexOf(o) >= 0,因为indexOf(o) 返回i,而i>=0为true,所以返回true
}
return -1;
}*/
然后是第二种情况
/*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 为true,执行if里面的内容
for (int i = 0; i < size; i++)//for循环遍历nameList中每一个元素;其中size为全局变量,实质为this.size,即nameList的元素个数;
if (elementData[i]==null)//o指向的对象与将nameList中遍历出来的每个元素进行对比,对比规则elementData[i]==null,此时elementData[i]中没有null,故==为false,所以不执行此if语句,for语句结束,外面if结束,然后跳到最后的return -1;结束。
return i;//结束此方法,返回i到contains方法,方法体中 return indexOf(o) >= 0,而i>=0为true,所以返回true
} else {
for (int i = 0; i < size; i++)
if (o.equals(elementData[i]))
return i;
}
return -1;//结束此方法,返回-1到contains方法,方法体中 return indexOf(o) >= 0,而i>=0为false,所以返回false
}*/
情况三
contains源码分析
/*public boolean contains(Object o) {//首先test传入到contains方法中的参数,即o指向test所指向的对象,test对象为上转型对象
return indexOf(o) >= 0;//调用下面indexOf方法
}
public int indexOf(Object o) {//indexOf方法中o指向contains方法中o指向的对象,即indexOf方法o实质指向test对象
if (o == null) {//o不为null(test里存有一个地址),所以o == null 为false,不执行if里面的内容,跳到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.size,即nameList的元素个数;
if (o.equals(elementData[i]))//o指向的对象与将nameList中遍历出来的每个元素进行对比,对比规则o.equals(elementData[i]),因为o指向test变量的地址,所以执行时指向的是Test类中的equals,由于①因为Test没有重写Object中euqals方法,所以调用的是继承父类的euqlas;比较的是地址,由于地址不相同,所以为false,不执行此if语句。跳到最后。②如果重写了equals方法,则调用Test类重写后的方法,其中equals参数即为集合中元素(多态)
return i;
}
return -1;//返回-1。回到contains方法,-1>=0,为false,所以最后结果为false
}*/