概述
contains方法
我们以以下这个例子分析ArrayList类contains方法;三段代码中的后面两小段代码分别是 contains 方法的源码和 contains 方法中 indexOf 方法的源码;
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("Tom");
System.out.println(list.contains(null)); //1
System.out.println(list.contains("Tom")); //2
}
}
public boolean contains(Object o) {
return indexOf(o) >= 0; //3
}
public int indexOf(Object o) {
if (o == null) { //4
for (int i = 0; i < size; i++)
if (elementData[i]==null)
return i;
} else {
for (int i = 0; i < size; i++) //5
if (o.equals(elementData[i]))
return i;
}
return -1; //6
}
false
true
首先创建一个ArrayList对象 list,使用 add 方法添加 “Tom”,然后使用 contains 方法分别判断 list 中是否含有 null 和“Tom”;
我们一个一个的分析,先看第5行代码判定的执行过程:执行过程是(1->3->4->6)
- 第5行 contains 方法会将参数赋值给 o 并调用第2段代码的 indexOf 方法;
- 紧接着 indexOf 方法又会将参数赋值给第三段代码的 o;此时 o 的值为 null;
- 然后程序执行到第15行进行 if 判断,发现符合判断条件,于是进行第16行的循环中,第17行 if 判断中的 elementData() 数组就是我们的 list,在其中寻找 null,很明显,因为我们仅赋值一个 “Tom”,所以这里的 size 为1,其实循环只执行了一次,发现第一个成员即 list[0] 是“Tom”,不是 null,程序往下走到23行,遇到 return 返回 -1;
- -1返回到 contains 方法时,发现 -1<0;所以返回 false;
然后我们再看第6行代码的执行过程;执行过程是(1->3->4->5)注意:这里的 equals 方法是 String 中的 equals 方法,indexOf 方法所调用的 equals 方法根据调用该方法的对象所属的数据类型的不同而变化。
- 同样 contains 调用 indexOf 方法并进行赋值操作;
- indexOf 方法将值赋给 o;此时 o 的值为:Tom;
- 进行第15行的 if 判断,此时 o 不为 null,故执行 else 操作即执行跳到第20行代码开始执行,同样是遍历 list ,寻找与 o 的值即“Tom”内容相同的 list 成员,我们发现第一个就是“Tom”,此时,if 判断语句成立,执行 return 操作返回 i 的值,此时 i=0;因此 返回的值是0;
- 0返回到 contains ,0===0;返回true;结束程序。
remove方法
remove方法的执行过程与 contains 方法的执行过程很接近,这也是为什么很多人喜欢把总结写在一起的原因;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("Tom");
System.out.println(list.contains("Tom"));
list.remove("Tom");
System.out.println(list.contains("Tom"));
list.add(null);
System.out.println(list.contains(null));
list.remove(null);
System.out.println(list.contains(null));
}
}
true
false
true
false
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
return false;
}
其实 remove 方法的实质是寻找需要删除那个值得下标,再通过 fastRemove 方法直接删除;因为 remove 具体过程和 contains 很接近,所以这里不再详细说过程了,只说一下大致思路和重点:根据 remove 方法我们可以轻易看出,若需要删除的是 null 则是 if 的第一个语句块执行操作,找到 null 值在 list 中的下标,然后删除,若不是,则执行 else 部分代码块进行删除;
当我们的泛型不同时,remove 删除方法也略有不同;主要是 equals 调用的改变;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(11);
list.add(12);
list.remove((Integer)12);
System.out.println(list.contains(12));
}
}
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
这里是泛型为 Integer 的添加哈删除,因为不是 null ,则采用 else 部分代码块执行删除操作,其中删除用到的 equals 方法也是 Integer 中的 equals 方法(上代码中已给出);直接比较值是否相同,相同则返回下标;
还有一种是泛型为自定义类的的添加删除操作,这类必须为其自定义 equals 方法,否则直接继承父类 Object 的 equals 方法是比较地址的方法,需要根据需要自行重写 equals 方法,在这里不再进行讲解,给出代码,供大家参考上述例子自行理解;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) {
ArrayList<Student> list = new ArrayList<Student>();
list.add(new Student("110"));
list.remove(new Student("110"));
System.out.println(list.size());
}
}
0
public class Student {
private String id;
public Student(String id) {
this.id = id;
}
public boolean equals(Object obj) {
if (obj instanceof Student) {
Student stu = (Student) obj;
return this.id.equals(stu.id);
}
return false;
}
}
注意:重写 equals 方法,将对象的 id 作为比较的标准, id 是 String 类,采用 String 中的 equals 方法即比较两者内容相同,则会将 id 相同的对象删除。
其中 contains 方法中的 equals 方法的调用规则和 remove 方法中的 equals 方法的调用规则基本相同,因此没有对 contains 方法中不同泛型的 equals 方法进行讨论,可自行探索。
最后
以上就是醉熏楼房为你收集整理的详述ArrayList类contains方法和remove方法contains方法remove方法的全部内容,希望文章能够帮你解决详述ArrayList类contains方法和remove方法contains方法remove方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复