package com.study.a_object;
public class Person {
// 成员变量 Field
private int id;
private String name;
private int age;
// 构造方法 Constructor
public Person() {}
public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
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 [id=" + id + ", name=" + name + ", age=" + age + "]";
}
/*
* 1.判断比较的两个对象不是同一个对象
* 保留原本的this == obj,满足条件直接判断为true
* 2.数据类型不一致
* 数据类型必须是一致的情况下才可以进行比较!!!如果equals
* 传入的数据类型不是当前调用方法的对应数据类型,没有必要进行比较
* 3.判断【自定义比较】内容
* id name age 完全一致,两个对象相同
*/
@Override
public boolean equals(Object obj) {
//比较两个对象的空间首地址,如果两个对象的空间首地址一致,直接返回true
if (this == obj) {
return true;
}
/*
* 数据类型一致
* 需要判断传入的参数类型是否为Person类型,如果不是直接返回false
*
* 使用一个关键字 isntanceOf
* 类对象 instanceOf 类型
* 判断对象是不是当前指定类型
*/
if (false == obj instanceof Person) { //可优化为!(obj instanceOf Person)
//数据类型不一致,返回false
return false;
}
/*
* 按照自定义方式
* 比较对象中保存的数据内容
*
* 我们认为
* Person类型中我们认为 id name age 一致才认为是两个相同的对象
*/
//完成强制转换操作,Object类型转换成当前使用的Person类型操作
Person p = (Person) obj;
return this.id == p.id
&& this.age == p.age
/*
* this.name.equals这里执行的是String类equals方法
* 这里调用方法是需要明确方法的调用者是谁
*
* 这里equals方法是按照字符串比较方式完成的
*/
&& this.name.equals(p.name);
}
@Override
public int hashCode() {
/*
* id为int类型,并且是当前对象中可以作为唯一索引数据的成员变量
* 可以用于hashCode方法作为返回值
*/
return id;
}
}
package com.study.a_object;
public class Demo2 {
public static void main(String[] args) {
Person person1 = new Person(1,"吴亦凡",18);
Person person2 = new Person(2,"彭于晏",19);
Person person3 = new Person(3,"吴彦祖",20);
Person person4 = new Person(4,"胡歌",21);
Person person5 = new Person(5,"古天乐",22);
Person person6 = new Person(5,"古天乐",22);
System.out.println(person1);
System.out.println(person2);
System.out.println(person3);
System.out.println(person4);
System.out.println(person5);
System.out.println(person6);
/*
* equals默认比较方式是空间首地址比较,这里person5和person6两个对象
* 都是通过new + 构造方法创建而来,空间首地址是完全不一样的!!!
*
* 但是从代码中可以发现,这里两个对象保存的内容是一致的,对于这样的一种情况
* 其实在开发中还是存在一定的需求的。实际开发中存在需要比较两个对象中保存数据
* 是否一致的情况,这里需要重写equals方法。
*
* equals方法在使用过程中一定要明确调用者是谁。
*/
System.out.println(person5.equals(person6));
System.out.println(person1.equals(person2));
System.out.println(person4.hashCode());
System.out.println(person3.hashCode());
System.out.println(person3.hashCode() == person4.hashCode());
}
}``
equals方法和hashCode方法
最新推荐文章于 2021-01-23 23:13:56 发布