equals方法和hashCode方法

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());
	}
}``

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值