我是靠谱客的博主 醉熏楼房,最近开发中收集的这篇文章主要介绍详述ArrayList类contains方法和remove方法contains方法remove方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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)

  1. 第5行 contains 方法会将参数赋值给 o 并调用第2段代码的 indexOf 方法;
  2. 紧接着 indexOf 方法又会将参数赋值给第三段代码的 o;此时 o 的值为 null;
  3. 然后程序执行到第15行进行 if 判断,发现符合判断条件,于是进行第16行的循环中,第17行 if 判断中的 elementData() 数组就是我们的 list,在其中寻找 null,很明显,因为我们仅赋值一个 “Tom”,所以这里的 size 为1,其实循环只执行了一次,发现第一个成员即 list[0] 是“Tom”,不是 null,程序往下走到23行,遇到 return 返回 -1;
  4. -1返回到 contains 方法时,发现 -1<0;所以返回 false;

然后我们再看第6行代码的执行过程;执行过程是(1->3->4->5)注意:这里的 equals 方法是 String 中的 equals 方法,indexOf 方法所调用的 equals 方法根据调用该方法的对象所属的数据类型的不同而变化。

  1. 同样 contains 调用 indexOf 方法并进行赋值操作;
  2. indexOf 方法将值赋给 o;此时 o 的值为:Tom;
  3. 进行第15行的 if 判断,此时 o 不为 null,故执行 else 操作即执行跳到第20行代码开始执行,同样是遍历 list ,寻找与 o 的值即“Tom”内容相同的 list 成员,我们发现第一个就是“Tom”,此时,if 判断语句成立,执行 return 操作返回 i 的值,此时 i=0;因此 返回的值是0;
  4. 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方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部