面向对象(高级篇)中关于判断两个对象是否相等的两个问题:
1、如何进行对象的比较?
2、在哪里进行对象的比较?
回顾学习String类,要想进行对象的比较,必须比较其内容,但不能直接使用equals()方法,所以对每一个属性进行比较,全部相等,证明两个对象相等。
对象比较的第一种方式:
class Person { private String name; private int age; public Person(String name, int age){ this.setName(name); this.setAge(age); } public void setName(String name){ this.name = name; } public String getName(){ return this.name; } public void setAge(int age){ this.age = age; } public int getAge(){ return this.age; } } public class ThisDemo07 { // 直接在主方法中比较全部属性 public static void main(String []args) { // 声明两个对象,内容完全相等 Person per1 = new Person("张泽", 25); Person per2 = new Person("张泽", 25); if ((per1.getName().equals(per2.getName())) // 再比较所有的属性是否相等 && per1.getAge() == per2.getAge()){ System.out.println("两个对象一样"); } else { System.out.println("两个对象不一样"); } } }程序运行结果:
两个对象一样
class Person { private String name; private int age; public Person(String name, int age){ // 要通过构造方法为属性赋值 this.setName(name); // 容易写错!this.name = name; this.setAge(age); } public boolean compare(Person per){ Person per1 = this; // 表示当前对象 Person per2 = per; // 传递到方法中的对象 if (per1 == per2){ // 首先比较两个地址是否相等 return true; } if ((per1.name.equals(per2.name)) // 再比较所有的属性是否相等 && per1.age == per2.age){ return true; } else {return false;} } public String setName(String name){ this.name = name; } public void getName(){ return this.name; } public int setAge(int age){ this.age = age; } public void getAge(){ return this.age; } } public class ThisDemo08 { public static void main(String []args) { // 声明两个对象 Person per1 = new Person("张泽", 25); Person per2 = new Person("张泽", 25); if (per1.compare(per2)){ // 进行对象的比较 System.out.println("两个对象一样"); } else { System.out.println("两个对象不一样"); } } }
程序运行结果:
两个对象一样
package zz.setdemo; import java.util.Set; import java.util.HashSet; // 去掉重复元素(终极版) class Person{ private String name; private int age; public Person(String name, int age){ this.name = name; this.age = age; } public boolean equals(Object obj){ // 覆写 equals()方法,对象重复判断 if (this == obj){ // 地址相等 肯定是同一个对象 return true; } if (!(obj instanceof Person)){ // 传递进来的不是本类的对象 return false; } Person p = (Person)obj; // 进行向下转型 // 属性依次比较,全部相等则是同一个对象 if (this.name.equals(p.name) && this.age == p.age){ return true; }else { return false; } } public int hashCode(){ // 覆写 hashCode() 方法 return this.name.hashCode()*this.age; // 指定编码公式 } public String toString(){ return "姓名:" + this.name + "年龄:" + this.age; } } public class RepeatDemo{ public static void main(String []args){ Set<Person> allSet = new HashSet<Person>(); //实例化Set接口对象 allSet.add(new Person("张三", 30)); allSet.add(new Person("李四", 31)); allSet.add(new Person("王五", 32)); allSet.add(new Person("王五", 32)); // 重复元素,不能加入 allSet.add(new Person("王五", 32)); // 重复元素,不能加入 allSet.add(new Person("赵六", 33)); allSet.add(new Person("孙七", 33)); System.out.println(allSet); } }
程序运行结果:
[姓名:李四年龄:31, 姓名:张三年龄:30, 姓名:孙七年龄:33, 姓名:王五年龄:32,姓名:赵六年龄:33]
关于toString()
之前碰到toString()方法,总感觉很奇怪,为什么要用他,查JDK又有很多toString()方法,不知道是用的哪个。现在知道这里乃至的其实是Object类的方法。