Arraylist中contains⽅法底层实现解读
Arraylist中contains⽅法底层实现解读(String类型)
public static void main(String[] args) {
equals()方法List<Object> list = new ArrayList<Object>();
String a = "aa";
String str = new String("aa");
list.add(a);
System.out.ains(str));
}
在本⽅法中
contains⽅法是⽤来查看集合中是否含有传⼊的参数str;
⾸先我们创建两个内存地址不同的String类型的变量
添加其中⼀个String变量a到Array数组中,然后使⽤contains⽅法查看是否含有str中的“aa”。
此时我们进⼊contains⽅法阅读底层实现原理:
进⼊contains⽅法,这⾥因为ArrayList重写了List的contains⽅法,所以运⾏时⾛的是ArrayList中的contains⽅法
进⼊ArrayList中的contains⽅法并传⼊参数为str:
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
此时发现contains调⽤了indexOf⽅法,并且传⼊开始的str进去,进⼊indexOf⽅法:
public int indexOf(Object o) { //进⼊并调⽤indexOfRange⽅法,传⼊三个参数第⼀个为"aa",第⼆个为0,第三个为size为全局变量,初始值为0
return indexOfRange(o, 0, size);
}
int indexOfRange(Object o, int start, int end) { //传⼊三个参数三个参数第⼀个为"aa",第⼆个start为0,第三个为当前调⽤contains集合元素的个数
Object[] es = elementData; //将ArraysList数组元素⼀个⼀个加到elementData⾥,之后再把内存地址赋给es
if (o == null) { //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])) { //判断语句:如果"aa"和es第i位元素相同,则返回i,此时调⽤String的equals⽅法去⽐较,直接⽐较长得像不像,直接⽐较值。此时⽐较成功,equals⽐较原理另起⼀篇来介绍 return i; //有相同就进来返回i就是es的下标不成功就返回-1,此时返回i给indexOf
}
}
}
return -1;
}
public int indexOf(Object o) {
return indexOfRange(o, 0, size); //indexOfRange返回给i,然后接着返回给containsi
}
public boolean contains(Object o) {
return indexOf(o) >= 0; //i肯定⼤于等于0返回true
}
此时代码执⾏完成,⽐较完成返回ture,表⽰存在。⾃定义⽅法,默认调⽤equals为Object的⽅法,所以不会达到预期效果,所以此时需要⾃⼰⾃定义⾃定义类的equals来进⾏⾃定义判断,下⼀篇会讲到。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论