java——Object类的各个方法(特别是equals())

1,hashCode():返回对象的哈希值,常用作判断,两个对象是否相等
2,getClass():返回当前对象所属类的名称的字符串表示形式
3,toString():返回的是类名+哈希值(返回该对象的字符串表示)
【当调用某一对象的toString()成员方法时,有一个执行顺序,对首先在奔类中找toString(),如果没有重写toString(),则继续会找父类的toString(),直到找到Object的toString()为止。】
【以后自己的类都要重写toString(),不用再输出哈希值,而是输出对象的内容】
4,equals(Object obj):判断两个对象是否“相等”(也就是判断引用类型的对象是否相等)
常常在工作中,我们会拿对象的成员变量作为两个对象是否相等的判断依据,当然了也可以比较哈希值,具体工作情况,具体对待。java中,常常拿Object#equals()方法来判断两个对象是否相等,但是默认情况下,equals()源代码中,还是使用的“==”来判断是否相等,这就要求我们根据我们自己的实际需要,在自己的子类中添加equals()的重写方法。来实现自己的判断两个对象是否相等的依据。建议,以后自己的类尽量都重写该方法,以方便判断对象是否相等
例如
public class Student implements Cloneable{
private String name;
private String gender;
private int age;
private String school;

public Student() {
}

public Student(String name, String gender, int age, String school) {
    this.name = name;
    this.gender = gender;
    this.age = age;
    this.school = school;
}

@Override
public String toString() {
    return "Student{" +
            "name='" + name + '\'' +
            ", gender='" + gender + '\'' +
            ", age=" + age +
            ", school='" + school + '\'' +
            '}';
}

@Override
protected Object clone() throws CloneNotSupportedException {
    return super.clone();
}

/**
 * 这个方法是自己手动重写的equals(),其实可以按快捷键同事重写
 * equals()hashCode(),这两个方法有必要同时重写,已维护hashCOde
 * 方法的常规协定,该协定声明相等对象必须有相等的哈希值
 * @param obj
 * @return
 */

// @Override
// public boolean equals(Object obj) {
// /*
// * 需要在equals()方法中提供自己的判断标准
// * 常常拿成员变量是否相等来处理
// * */
//
//// return super.equals(obj);
//
// if(this==obj){
// return true;
// }
// //成员变量对比
// //向下类型转换
//
//// Student stu=(Student) obj;
// //又因为,ClassException,当向下类型转换时,有可能类型不一样,
// // 所以可以使用instanceof(一个运算符)判断当前对象是否是某一个类型的实例
// if(obj instanceof Student){
// Student stu=(Student) obj;
// if(this.age!=stu.age){
// return false;
// }
// if(!this.name.equals(name)){
// //这里的equals是String类型的equals
// return false;
// }
// if(!this.gender.equals(stu.gender)){
// return false;
// }
// if(!this.school.equals(stu.school)){
// return false;
// }
// return true;
// }
//
//
// return false;
// }

@Override
public boolean equals(Object o) {
    if (this == o) return true;
    if (!(o instanceof Student)) return false;

    Student student = (Student) o;

    if (age != student.age) return false;
    if (!name.equals(student.name)) return false;
    if (!gender.equals(student.gender)) return false;
    return school.equals(student.school);
}

@Override
public int hashCode() {
    int result = name.hashCode();
    result = 31 * result + gender.hashCode();
    result = 31 * result + age;
    result = 31 * result + school.hashCode();
    return result;
}

}
5,这里延伸一下,如何判断两个字符串是否相等(一下是步骤)
(1),判断两个字符串的引用地址是否相等
(2),判断参数的类型是否为String类型
(3),判断两个字符串的长度是否相等
(4),判断两个字符串中每一个字符对应的ASCII码值是否相等
6,==和equals()的区别
(1): == 是一个关系运算符,是比较两个数是否相等;如果两个数相等就返回true,不相等就返回false;
(2):equals()是一个方法,是Object类型中的一个方法,默认也是使用 == 关系运算符来比较 当前对象与传入的局部变量对象的内存地址值是否相等的。
(3):默认情况下,这两种方式判读一个类是异曲同工的,只不过,我们也知道jdk中,大部分的类,例如:String,Integer等都重写了equals,所以,这两种方式判断两个对象是否相等,应该具体问题具体分析。

猜你喜欢

转载自blog.csdn.net/weixin_42981168/article/details/88074438
今日推荐