详述ArrayList类contains方法实现原理

java中ArrayList的contains方法,作用是用来判断元素是否在集合中,本质上使用的是equals的方法来去比较

Contains方法源代码:

String类

输出结果为:true      

分析过程:

 1.因为new的是ArrayList对象 ,所以进入ArrayList实现类查找contains方法

 2.当执行names.contains("李四")时,则会调用contains()方法,这时"李四"就会传到contains参数列表,“李四”赋值给o,

 3.源代码return indexOf(o) >=0;  调用indexOf()方法,源代码:indexOfRange(o,0,size);  o代表"李四",0代表循环从0开始,size代表ArrayList元素的个数;

 4.调用源代码方法indexOfRange,传入实参(请看indexOfRange源代码)es数组里面存放的是ArrayList的元素,执行if判断因为o!空,执行else{} 语句体,o去调用相应的equlas()方法equals()方法:因为o为上转型对象,所以在调用equals()方法时,执行的是该上转型对象对应类中的equals()方法(多态)这时就会调用String的equlas方法。源代码o.equals(es[i])中的es[i]是和ArrayList每一个元素。

  5.进入String的equals方法,源代码equals(Object anObject)参数列表中存入的是ArraysList的元素,(请看源代码)先比较地址,相同返回ture,在比较每个字符,由一样相同即返回ture.

 6,回到contains()方法,此时返回相应i值,层级返回到源代码下的contains()方法,这是i>=0,所有返回true

 7.补充(请看源代码indexOfRange方法)如果o为null则会直接放回-1,在回到contains()方法-1>=0,返回false。 

包装类

结果返回:true

  分析:

  1.因为new的是ArrayList对象 ,所以进入ArrayList实现类查找contains方法

  2.当执行names.contains("3")时,则会调用contains()方法,这时"3"就会传到contains参数列表,“3”赋值给o,

  3.源代码return indexOf(o) >=0;  调用indexOf()方法,源代码:indexOfRange(o,0,size);  o代表"3",0代表循环从0开始,size代表ArrayList元素的个数;

  4.调用源代码方法indexOfRange,传入实参(请看indexOfRange源代码)es数组里面存放的是ArrayList的元素,执行if判断因为o!空,执行else{} 语句体,o去调用相应的equlas()方法equals()方法:因为o为上转型对象,所以在调用equals()方法时,执行的是该上转型对象对应类中的equals()方法(多态)这时就会调用String的equlas方法。源代码o.equals(es[i])中的es[i]是和ArrayList每一个元素。

  5.进入Interger中的equals方法,源代码equals(Object obj)参数列表传入的是ArrayList元素,“3”在和原集合中的元素进行比较,相同返回返回ture不同fanhuifalse

  6,回到contains()方法,此时返回相应i值,层级返回到源代码下的contains()方法,这是i>=0,所有返回true

  7.(请看源代码indexOfRange方法)如果o为null则会直接放回-1,在回到contains()方法-1>=0,返回false。

自定义类类型

Object的equals方法

注意:此时equlas方法没有重写,因为Student是自定义类型所以没有equlas方法则会进入Object的equlas方法比较地址,new了两个student地址不同则返回false。

重写equlas方法

 

 返回结果:true

  分析:

  1.因为new的是ArrayList对象 ,所以进入ArrayList实现类查找contains方法

  2.当执行names.contains(new Student("110"))时,则会调用contains()方法,这时new Student("110")就会传到contains参数列表,new Student("110")赋值给o,

  3.源代码return indexOf(o) >=0;  调用indexOf()方法,源代码:indexOfRange(o,0,size);  o代表new Student("110"),0代表循环从0开始,size代表ArrayList元素的个数;

  4.调用源代码方法indexOfRange,传入实参(请看indexOfRange源代码)es数组里面存放的是ArrayList的元素,执行if判断因为o!空,执行else{} 语句体,o去调用相应的equlas()方法equals()方法:因为o为上转型对象,所以在调用equals()方法时,执行的是该上转型对象对应类中的equals()方法(多态)这时就会调用重写后的equlas方法。源代码o.equals(es[i])中的es[i]是和ArrayList每一个元素。

  5..进入重写equals方法,源代码equals(Object obj)参数列表传入的是ArrayList元素,如果obj是Student类型,则会进行下转型,

  6,回到contains()方法,此时返回相应i值,层级返回到源代码下的contains()方法,这是i>=0,所有返回true
  7.(请看源代码indexOfRange方法)如果o为null则会直接放回-1,在回到contains()方法-1>=0,返回false。

posted @ 2021-05-11 21:28  空白准考证  阅读(668)  评论(0)    收藏  举报