重写Object类的equals方法与Objects类的equals方法Object类&Objects类总结
重写Object类的equals方法
package Object_demo01; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } /* 直接打印对象的地址没有意义,需要重写Object类的toString方法 打印对象的属性(name age) */ /* 0bject类的equals方法认比较的是两个对象的地址值,没有意义所以我们高要重与equaLs方法,比较两个对象的属性值(name , age) 对象的属性值一样好,返回true;否见版回false 问题: 障含着一个多态 0bject obj-p2_- newe Person(古力娜扎"",18);多玉弊端:无去使用子类特有的内容(属性,方法 解决:可以使用向下转型(强转)把Object类型转换为Person */ // @Override // public boolean equals(Object obj) { // if (obj==this){ // return true; // } // ////增加一个判断,传递的参数obj是nul,直接返回false,提高程序的效率 // if (obj==null){ // return false; // } // if (obj instanceof Person){ // Person p =(Person)obj; // boolean b = this.name.equals(p.name) && this.age==p.age; // return b; // } // return false; // // } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, 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 "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
package Object_demo01; import java.util.Random; /* Person类默认继承了object类,所以可以使用object类的equals方法boolean equals(object obj)指示其他某个对象是否与此对象“相等”。object类equals方法的源码: public boolean equals(Object obj) i return (this -= obj); 参数: object obj:可以传递任意的对象方法体: ==:比较运算符,返回的就是—个布尔值true,false基本数据类型:比较的是值 引用数据类型:比较的是两个对象的地址值 this是谁?那个对象调用的万法,方法中的this就是那个对象; p1调用的equals方法,所以this就是P1obj是谁?传递过来的参数p2 */ public class Demo01equals { public static void main(String[] args) { Person p1 = new Person("射手",35); Person p2 = new Person("射手",35); // p1=p2; System.out.println("p1"+p1); System.out.println("p1"+p2); Random random = new Random(); boolean equals1 = p1.equals(random); boolean equals2 = p1.equals(null); boolean equals3= p1.equals(p2); System.out.println(equals1); System.out.println(equals2); System.out.println(equals3); } //equals比较的是地址值 }
Objects类的equals方法
在刚才IDEA自动重写equals代码中,使用到了java.util.objects类,那么这个类是什么呢?
在JDK7添加了一个Objects工具类,它提供了一些方法来操作对象,它由一些静态的实用方法组成,这些方法是null-save(空指针安全的)或null-tolerant(容忍空指针的),用于计算对象的hashcode、返回对象的字符串表示形式、比较两个对象。
在比较两个对象的时候,Object的equals方法容易抛出空指针异常,而Objects类中的equals方法就优化了这个问题。方法如下:
public static boolean equals(object a,object b):判断两个对象是否相等。我们可以查看一下源码,学习一下:
package Object_demo01; import java.util.Objects; public class Person { private String name; private int age; public Person() { } public Person(String name, int age) { this.name = name; this.age = age; } /* 直接打印对象的地址没有意义,需要重写Object类的toString方法 打印对象的属性(name age) */ /* 0bject类的equals方法认比较的是两个对象的地址值,没有意义所以我们高要重与equaLs方法,比较两个对象的属性值(name , age) 对象的属性值一样好,返回true;否见版回false 问题: 障含着一个多态 0bject obj-p2_- newe Person(古力娜扎"",18);多玉弊端:无去使用子类特有的内容(属性,方法 解决:可以使用向下转型(强转)把Object类型转换为Person */ // @Override // public boolean equals(Object obj) { // if (obj==this){ // return true; // } // ////增加一个判断,传递的参数obj是nul,直接返回false,提高程序的效率 // if (obj==null){ // return false; // } // if (obj instanceof Person){ // Person p =(Person)obj; // boolean b = this.name.equals(p.name) && this.age==p.age; // return b; // } // return false; // // } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, 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 "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
package Object_demo01; import java.util.Objects; public class Demo01_Objects { public static void main(String[] args) { String s3 = null; String s2 = "aaa"; // boolean b = s3.equals(s1); // NuLLPointerException null是不能调用方法的,会抛出空指针异常 // System.out.println(b); //0bjects类的equaLs方法:对两个对象进行比较,防止空指针异常 // public static boolean equals(Object a, Object b) { // return (a == b) || (a != null && a.equals(b)); // } boolean b2 = Objects.equals(s2,s3); System.out.println(b2); } }
总结:
一.Object类1.object类介绍
Object类是所有类的父类。一个类都会直接或者间接的继承自该类该类中提供了一些非常常用的方法!
2.toString()方法
A∶作用:打印对象的信息
B:重写前:打印的是包名类名@地址值C∶重写后∶打印的是对象中的属性值3.equals()方法
A:作用:比较两个对象的
B:重写前:比较的是对象的地址值C︰重写后∶比较的是对象中的属性值
二、objects类
1.equals()方法
比较两个对象是否相同,但是加了一些健壮性的判断!