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=小花]

 

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐