目录
第一题
题目要求
我的代码
创建Person类
main类
结果
重写equals
重写后的结果
老师代码
思路
结果
总结
Interger类
源代码
String类
源代码
第二题
运行结果
第三题
知识点
运行结果
第一题
题目要求
判断两个 Person 对象的内容是否相等, 如果两个 Person 对象的各个属性值都一样, 则返回 true, 反之 false。
我的代码
创建Person类
class Person {
private String name;
private int age;
private char gender;
public Person(String name, int age, char gender) {
this.name = name;
this.age = age;
this.gender = gender;
}
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;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
main类
package com.hspedu.object_;
public class EqualsExercise01 {
public static void main(String[] args) {
Person person = new Person("曹操", 61, '男');
Person person1 = new Person("曹操", 61, '男');
System.out.println(person == person1);
没有重写的时候都是比较地址,重写后才能比较内容
System.out.println(person.equals(person1));
}
}
结果
因为Person类中没有重写equals方法,所以比较的还是地址
重写equals
我用的是IDEA自带的Alt+Insert自动重写equals
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
if (age != person.age) return false;
if (gender != person.gender) return false;
return name != null ? name.equals(person.name) : person.name == null;
}
重写后的结果
老师代码
老师是自己写的
思路
1)先判断是否指向同一地址空间
2)如果不是,则判断传入的person1的运行类型是不是Person类(instanceof)
3)如果结果为true的话,则向下转型,将person1的编译类型从Object类强转成Person类(属性看编译类型),然后一一比较三个属性是否相等,返回比较的结果(短路与:只要有一个不相等就返回false)
4)如果步骤2的判断结果为false的话,则返回false;
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if(obj instanceof Person){
Person p1 = (Person) obj;
return name.equals(p1.name) && age == p1.age && gender == p1.gender;
}
return false;
}
结果
总结
在java程序中如果是对象调用equals方法,程序不会自动重写equals方法,所以比较的还是地址而不是具体的内容,如果是String类或者Interger类等子类调用equals方法方法,java会自动重写equals方法,比较具体内容
Interger类
Integer n1 = 10;
Integer n2 = 15;
System.out.println("=======自动重写========");
System.out.println(n1.equals(n2));
源代码
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
String类
String s1 = "你好";
String s2 = "你好";
System.out.println(s1.equals(s2));
源代码
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
return (anObject instanceof String aString)
&& (!COMPACT_STRINGS || this.coder == aString.coder)
&& StringLatin1.equals(value, aString.value);
}
第二题
考察点:equals方法的作用,以及子类重写equals方法之后的作用
package com.hspedu.object_;
public class EqualsExercise02 {
public static void main(String[] args) {
Person01 p1 = new Person01();
p1.name = "hspedu";
Person01 p2 = new Person01();
p2.name = "hspedu";
System.out.println(p1==p2);//比较地址,结果为false
//字符串调用equals,自动重写equals,比较内容,结果为true
System.out.println(p1.name.equals(p2.name));
//没有手动重写,结果为false
System.out.println(p1.equals(p2));
String s1 = new String("asdf");
String s2 = new String("asdf");
//String,结果为true
System.out.println(s1.equals(s2));
//引用数据类型,比较地址,结果为false
System.out.println(s1==s2);
}
}
class Person01 {//类
public String name;
}
运行结果
第三题
package com.hspedu.object_;
public class EqualsExercise03 {
public static void main(String[] args) {
int it = 65;
float f1 = 65.0f;
System.out.println("65和65.0f是否相等? " + (it == f1));
char ch1 = 'A' ;
char ch2 = 12;
System.out.println("65和'A'是否相等?"+ (it == ch1));
System.out.println("12和ch2是否相等?"+ (12 == ch2));
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println("str1和str2是否相等?"+ (str1 == str2));
System.out.println("str1是否equals str2?" +(str1.equals(str2)));
System.out.println( "hello” == new java.sql.Date()));
}
}
知识点
byte、short、char运算的时候自动转换成int型,'A'对应的十进制数字是65
运行结果