Java 中Object类中equals方法、和hashCode方法重写的使用

Object类

Object类是类层次结构的根。每个类都有 Object作为超类。所有对象,包括数组,实现这个类的方法,任何类都是该类的直接或间接子类。

boolean equals(Object obj) --用于判断调用对象是否与参数对象相等

该方法默认比较俩个对象的地址 ,与==运算符结果相同。

package com.day01.ObjectTest;

package com.day01.ObjectTest;
/*
 *     //student类的封装
 *   
 * */
public class Student {
	//第一步,私有化成员变量
	private String name;
	private int id;
	
	//有参数的构造方法
	public Student(String name, int id) {
		super();
		setName(name);
		setId(id);
	}
	
	//无参的构造方法
	public Student() {
		super();
	}
	
	//2.提供公有的get,set方法
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		if(id>0) {
			this.id = id;
		}else {
			System.out.println("学号不合理!!!!");
		}	
	}
	//自定义成员方法实现打印特征
	public void show() {
		System.out.println("我的名字叫:"+getName()+",学号为:"+getId());
	}
	
	//为了使得equals比较对象的内容,而不再是比较对象的地址,则需要进行重写
	@Override
	public boolean equals(Object obj) {
		/*
		 * //1.当调用对象与参数对象地址相同时,则内容一定相同 if(this==obj) { return true; }
		 * //2.当调用对象不为空,而参数对象为空时,则内容一定不相同 if(null==obj) { return false; }
		 * //3.当参数类型对象和调用对象类型相同时,才需要获取里面的内容进行比较 if(obj instanceof Student) {
		 * if(this.getId()==((Student) obj).getId()) { return true; }else { return
		 * false; } } //4.类型不相同,直接返回false啊 return false;
		 */
		if(this==obj) return true;
		if(null==obj) return false;
		if(obj instanceof Student) {
			return this.getId()==((Student) obj).getId();
		}
		return false;
	}
	//如果你重写了equals方法,则为了保持常规协定,需要对hashcode也要进行重写
    public int hashCode() {
		return getId();
	}
}
public class StudentTest /* extends Object */{ 
	public static void main(String[] args) {
		Student s1=new Student("张无忌",22);
		s1.show();
		System.out.println("-----------------------");
		
		Student s2=new Student("张无忌",22);
		s2.show();
	
		
		
		//调用从Object类中继承下来的equals方法,默认比较的是俩个对象的地址
		boolean b=s1.equals(s2);
		
		//this 代表当前正在调用的对象,也就是谁在调用equals,即是s1,obj就是s2
		/*
		 * public boolean equals(Object obj) { return (this == obj); }
		 */
		
		System.out.println("b= "+b);
		System.out.println(s1==s2);
		System.out.println("------------------------------");
		
		//调用从Object继承下来的hashcode方法,得到对象地址的内存编号
		int m=s1.hashCode();
		int n=s2.hashCode();
		System.out.println("m= "+m);
		System.out.println("n= "+n);
		
		/*
		 * Student s1=new Student("张无忌",22); s1.show();
		 * System.out.println("-----------------------");
		 * 
		 * Student s2=new Student("张无忌",22); s2.show();
		 * 
		 * boolean b=s1.equals(s2); System.out.println("b= "+b);   //b=false,改的是成员变量的值,但你equals比较的是地址啊
		 * System.out.println(s1==s2);  //false
		 */	
	}
}

若equals方法重写后,则应该重写hashCode来维护hashCode方法的常规协定;

int hashCode() 用于获取调用对象的哈希码值(内存地址的编号)
  1. 若调用equals方法的结果相等,则各自调用hashCode方法的结果相同。因为内存地址编号相同;
  2. 若调用equals方法的结果不相等,则各自调用hashCode方法的结果不相同。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值