Java常用API——equals方法 & equals方法的重写

equals方法 & equals方法的重写

一、API文档中的equals方法

  • public boolean equals(Object obj):比较此对象与指定对象
    在这里插入图片描述

二、比较运算符:==

  • 若"=="两边是基本数据类型,比较的是两个数的值
  • 若"=="两边是引用数据类型,比较的是两个对象的内存地址
//Student.java
public class Student extends Object {
    
    
	private String name;
	private int age;
	
	public Student() {
    
    
		super();
		// TODO Auto-generated constructor stub
	}
	
	public Student(String name, int age) {
    
    
		super();
		this.name = name;
		this.age = age;
	}

	public String getName() {
    
    
		return name;
	}

	public void setName(String name) {
    
    
		this.name = name;
	}

	public int getAge() {
    
    
		return age;
	}

	public void setAge(int age) {
    
    
		this.age = age;
	}

	@Override
	public String toString() {
    
    
		return "Student [name=" + name + ", age=" + age + "]";
	}
}
//StudentTest.java
public class StudentTest {
    
    
	public static void main(String[] args) {
    
    
		Student s1 = new Student("张三", 18);
		Student s2 = new Student("李四", 19);
		
		//"=="比较的是两个对象的内存地址
		boolean boo = s1==s2;
		System.out.println(boo);

		//基本数据类型
		int i = 1;
		int j = 1;
		boolean boo2 = i==j;
		System.out.println(boo2);
	}
}
***执行结果:***
false
true

三、equals方法

  • 未重写的equals方法
public class StudentTest {
    
    
	public static void main(String[] args) {
    
    
		Student s1 = new Student("张三", 18);
		Student s2 = new Student("李四", 19);
		
		System.out.println(s1.equals(s2));  // false
	}
}
  • 查看equals方法的源码
  • 可以发现未重写的equals方法内部是用“==”来比较两个对象
    public boolean equals(Object obj) {
    
    
        return (this == obj);
    }

四、String类中的equals方法

  • 查看String类中equals方法的源码
  • 可以发现String类中的equals方法是被重写了的
  • String类中的equals方法比较的是字符串的内容
	public boolean equals(Object anObject) {
    
    
        if (this == anObject) {
    
    
            return true;
        }
        if (anObject instanceof String) {
    
    
            String aString = (String)anObject;
            if (coder() == aString.coder()) {
    
    
                return isLatin1() ? StringLatin1.equals(value, aString.value)
                                  : StringUTF16.equals(value, aString.value);
            }
        }
        return false;
    }
  • 代码演示String类中的equals方法
public class StudentTest {
    
    
	public static void main(String[] args) {
    
    
		String str1 = "helloworld";
		String str2 = "helloworld";	
		System.out.println(str1.equals(str2));
		
		//通过new运算符创建出的str3和str4被存放在堆内存中
		//故是两个不同的对象
		String str3 = new String("helloworld");
		String str4 = new String("helloworld");	
		System.out.println(str3.equals(str4));
	}
}
***执行结果:***
true
true

五、equals方法的重写

  • 重写需求:让equals方法比较Student类对象的内容
  • 根据需求手动重写equals方法
//Student.java
	@Override
	public boolean equals(Object obj) {
    
    
		//Object向下转型
		Student s = (Student)obj;
		//比较本对象和obj对象的成员变量的值是否一致
		if(this.name.equals(s.getName()) && this.age==s.getAge()) {
    
    
			return true;
		}else {
    
    
			return false;
		}
	}
//StudentTest2.java
public class StudentTest2 {
    
    
	public static void main(String[] args) {
    
    
		Student s1 = new Student("张三", 18);
		Student s2 = new Student("李四", 19);
		Student s3 = new Student("李四", 19);
		
		System.out.println(s1.equals(s2));
		System.out.println(s2.equals(s3));
	}
}
***执行结果:***
false
true

六、eclipse自带的equals重写方法

  • 一般情况下equals方法不需要手动重写
  • 快捷键Shift+Alt+S → Generate hashCode() and equals()
  • 在这里不需要重写hashCode()方法,故直接删除hashCode()即可
	@Override
	public boolean equals(Object obj) {
    
    
		//比较的是两个对象的内存地址
		if (this == obj)  
			return true;
		if (obj == null)
			return false;
		//同一类的对象的字节码文件对象是同一个
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
    
    
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

猜你喜欢

转载自blog.csdn.net/weixin_43796325/article/details/104505899