详述ArrayList类contains方法

contains方法源码:

public boolean contains(Object o) {
	return indexOf(o) >= 0;//返回值结果满足则为true,否则为false
}

indexof()的源代码:

public int indexOf(Object o) {
	if (o == null) {
		for (int i = 0; i < size; i++)
			if (elementData[i]==null)
				return i;
	} else {//输入进来的字符(即  o)不为空执行下面内容
		for (int i = 0; i < size; i++)//size,即集合内的元素个数
			if (o.equals(elementData[i]))//多态
				return i;//如果 o 与其中元素有相同,返回i
	}
	return -1;//没有相同返回-1
}

一、String类型:

ArrayList<String> names = new ArrayList<String>();
names.add("Jim");
System.out.println(names.contains("Jim"));

contains方法实质上调用的是String对象中的equals

String对象中的equals方法源代码:
public boolean equals(Object anObject) {
	if (this == anObject) {// 若当前对象和比较的对象是同一个对象,返回true
		return true;
	}
	if (anObject instanceof String) {//判断当前传入的对象是否是String类型,若不是直接返回false
		String anotherString = (String)anObject;
		int n = value.length;
		if (n == anotherString.value.length) {//比较两个字符串的长度
			char v1[] = value;
			char v2[] = anotherString.value;
			int i = 0;
			while (n-- != 0) {//比较数组中的元素
				if (v1[i] != v2[i])//直至发现与输入的元素不同的元素停止结束比较,返回false
					return false;
				i++;
			}
			return true;//如果每一个元素均与相同,返回true
		}
	}
	return false;
}

二、基本数据类型包装类:

ArrayList<Integer> ages = new ArrayList<Integer>();
ages.add(12);
System.out.println(ages.contains(new Integer(12)));

contains方法实质上调用的是包装类中的equals

Integer包装类中的equals方法源代码:
public boolean equals(Object obj) {
	if (obj instanceof Integer) {//首先,判断传进来的Object类型是不是Integer类的一个实例,如果不是直接返回false;
		return value == ((Integer)obj).intValue();//如果是则判断两者的成员变量value值是不是相等的
	}
	return false;
} 
intValue() 的源代码:
public int intValue() {
	return value;  
}

三、 类类型:

ArrayList<Student> students = new ArrayList<Student>();
students.add(new Student("111"));
System.out.println(students.contains(new Student("111")));

object类中的 “==” 相当于比较地址,两个new之间地址肯定不同
因此我们需要对object类中的equals方法进行重写
此时contains方法实质上调用的是类类型中的equals

重现前equals源代码:
public boolean equals(Object obj) {
	return (this == obj);//比较地址
}
重现后equals源代码:
public class Student {

	private String id;
	
	public Student(String id) {//定义一个构造方法给id赋值
		this.id = id;
	}

	@Override
	public boolean equals(Object obj) {
		Student s =(Student)obj;//上转型对象下转型,下面才可以调用子类Student新增的属性和方法,即id
		String argId = s.id;
		String elementId = s.id;
		return argId.equals(elementId);
	}
}

四、instanceof:

ArrayList<Object> list = new ArrayList<Object>();
list.add(new String("111"));
System.out.println(list.contains(new Student("111")));

此时Student类中重写的equals方法中指的是new String(“111”)字符串,是不可能强制类型转换为学生类的,因此会报错,我们可以在其中加个instanceof

改写Student类代码:
public class Student {

	private String id;
	
	public Student(String id) {
		this.id = id;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Student) {//判断只有obj是学生类的时候才强制类型转换,如果不是则直接返回false
			Student s = (Student) obj;//上转型对象下转型,之后才可以调用子类Student新增的属性和方法,即id
			String argId = this.id;
			String elementId = s.id;
			return argId.equals(elementId);
		}
		return false;
	}
	
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值