Java中contains()方法使用的详细解释(源代码解释)
String类型List<String> names= new ArrayList<>();names.add("Jimmy");names.add("小明");System.out.println(names.contains("Jimmy"));输出:true本段代码 可以看出集合中存在“Jimmy”,运行后代码输出“true”。contains的方法的实现原理//调用
文章共1,157字 · 阅读需要大约4分钟
一键AI生成摘要,助你高效阅读
问答
·
String类型
List<String> names= new ArrayList<>();
names.add("Jimmy");
names.add("小明");
System.out.println(names.contains("Jimmy"));
输出:true
本段代码 可以看出集合中存在“Jimmy”,运行后代码输出“true”。
contains的方法的实现原理
//调用了ArrayList的contains方法
public boolean contains(Object o) {//"o"为查找的“Jimmy”
return indexOf(o) >= 0;//indexOf为查找这个值的下标
}
============================================================================
//查看indexOf返回值的方法
public int indexOf(Object o) {//o为要输入的元素,准备与集合中的元素进行比较
return indexOfRange(o, 0, size);//size为集合的长度
}
int indexOfRange(Object o, int start, int end) {
Object[] es = elementData;//es没有什么具体意义,只是将集合暂时存储
//判断输入的元素是否为空
if (o == null) {//为空时
for (int i = start; i < end; i++) {
if (es[i] == null) {
return i;
}
}
} else {//不为空时
for (int i = start; i < end; i++) {
//equals此时出现了多态;编译时为Object的方法,运行时则调用String的比较方法。
if (o.equals(es[i])) {//将传入的元素与集合中的元素进行对比
return i;
}
}
}
return -1;
}
Integer类型
Integer a = new Integer(9);
Integer b = new Integer(9);
Long c = new Long(9);
System.out.println(a == b);//false
System.out.println(a.equals(b));//true
System.out.println(a.equals(9));//true
System.out.println(a.equals(c));//false
contains的方法的实现原理
public boolean equals(Object obj) {//存储的是刚传进来的元素
if (obj instanceof Integer) {//此时判断是否为Integer类型
return value == ((Integer)obj).intValue();//obj向下转型,调用intValue方法,传入数值,通过“==”来比较。
}
return false;//类型不匹配返回false
}
============================================================================
public int intValue() {
return value;//返回输入的数值
}
==========================================================================
以上为两种引用类型举例,引用类型不用我们自己equals重写的方法,自己的类型中都有重写equals方法,所以我们可以直接调用;不过现实中我们自己定义类时,是需要我们手动重写equals方法的,下面举一个学生管理的例子说明一下。
==========================================================================
自定义类型
//学生类---重点关注equals方法的重写
public class Student {
private String sname;
public Student(String sname) {
this.sname = sname;
}
@Override//此时学生类要重写equals方法
public boolean equals(Object obj) {//obj存储的是刚刚传过来的元素地址
if(obj instanceof Student) {//判断是否为学生类
Student stu = (Student)obj;//向下转型,调用学生类的新方法
return this.sname.equals(stu.sname);//this指向刚刚传过来的元素,equals括号中的是集合中的元素
}
return false;
}
}
============================================================================
//测试类
public class Test {
public static void main(String[] args) {
List<Student> list = new ArrayList<>();//定义一个集合来存储数据
Student student1 = new Student("小强");//定义三个学生的名字
Student student2 = new Student("小白");
Student student3 = new Student("小花");
list.add(student1);//将三个学生的信息添加到集合中
list.add(student2);
list.add(student3);
System.out.println(list.contains(new Student("小白")));//查看集合中是否有“小白”的信息
for (Student stu : list) {//增强fou循环,此为遍历数据的一种方法
System.out.print(stu + "\t");
}
}
}
输出:
true//返回true代表集合中含有这个元素
Student [sname=小强] Student [sname=小白] Student [sname=小花]
更多推荐
已为社区贡献1条内容
所有评论(0)