ArrayList中contains的方法及原理

contains源代码如下:

 

 

 

 

 

这里的O代表contains方法中的参数对象,如果数值大于等于0,就会返回true。

O调用什么样的equals方法取决于O是什么类型

contains方法中的参数类型如果是String类型,则调用String对象中的equals方法

contains方法中的参数类型如果是基本数据类型的包装类,则调用包装类中的equals方法

contains方法中的参数类型如果是类部类型,则调用类部类型中的equals方法

 

String类型:

 

 这时的结果输出为true。

1:当执行到list.contains("李坦克")时,调用了contains方法,其中张大炮赋值给了O,O即为String类

2:接着在调用indexOf方法,因为O !=null,所以进入else{ }语句中,O去调用String类的equals方法,先比较地址,在比较每一个字符,有一样相同即返回true,与集合中的元素进行比较,一旦找到相同的,则返回此时对应的i。

3:这时跳转回contains方法中,因为此时i>=0,所以返回true。

4:如果O为null,就会执行if语句,接着通过for循环去判断集合中是否有值为null的元素,若有则返回i,即返回true;如果遍历完集合没有找到null这个元素,则会跳出if语句,执行最后一条语句:return -1;,所以最后会返回false。

 

 

自定义类型:

未重写equals方法:

 

 

 

这里首先定义一个学生类,这里返回的是false。

1:执行到list.contains(new Student("20"))时,跳转contains方法,创建一个Student对象20赋值给O,所以O为Student类。

2:接着就是跳转到indexOf方法中,因为O !=null,进入else语句中,O本来是要调用Student中的equals方法的,但是Student类中没有重写equals方法,所以就要去调用Student父类Object类中的equals方法,而Object中的equals方法是比较地址,当我们每创建一个对象,都会new一个新的空间,也就是每一个对象都会有一个新地址,所以O的地址与集合中的每个元素地址都不一样,所有最终会返回false

3:假如O=null跟String类型一样。

 

重写equal方法:

 

 

 

 重写的equals方法中,obj就是集合中每个元素,判断传进来的类型是否为Student类创建出来的对象或者是Student的子类,如果是就执行语句,不是返回false;如果是的话,将obj下转为Student类型,这里this.id是指谁调用equals方法就是谁的id,这里t.id是指传进来的obj下转型t的id。

为什么这里重写equals方法后返回的就是true了。

1:当代码执行到list.contains(new Student("20"))时,跳转contains方法,创建一个新的对象20赋值给O,这时O就是Student类

2:在调用indexOf方法,因为O !=0,所以直接进入else语句中,因为这里我们在Student类中重写了equals方法,所以O去调用Student类中重写后的equals方法,我们定义的equals方法也是先比较地址,在比较字符,所以会返回true,即条件满足进入if语句,执行return i;

3:跳转回contains方法中,此时i>=0;所以最终会返回true。

4:如果这里O还是为null跟String类型一样

posted on 2021-05-12 17:21  Fire·  阅读(1216)  评论(2编辑  收藏  举报

导航