讲讲重写三兄弟 hashcode equals 和 tostring

package EqualsandSystem;

  • 三者之间是有关系的
  • 1.tostring 默认输出的是hashcode的值
  • 2.重写的时候 为什么equals要和hashcode绑在一起
    因为有可能要一起使用才能满足用hash实现的集合的添加
    (hashset等等)

equals

	// 0x00先是修饰符 公有的方法 然后返回值得是一个布尔类型的吧,最后传参是所有类的父类适配于所有对象
	public boolean equals(Object object) {
		// 0x01 先判断是不是自身对象
		if (this==object) {
			return true;
 	}
 		// 0x02 再判断对象是不是为空 为空还说毛线
	if (object==null) {
			return false;
		}
//		// 0x03 第三部分是看看是不是一个类型的对象
		if (getClass()!=object.getClass()) {
			return false;
		}
		//是的话先向下转型为该类型的对象(因为我们在传参接口中,已经向上转型为父类了)
		Person person=(Person)object;
		// 0x04 再比较实例对象里面具体的属性值
//(如果有string类型的话,或者说引用类型的话)(这块分为两种,基本数据类型和引用数据类型)
		if (age!=person.age) {
			return false;
		}
		if (name==null) {
			if (person.name!=null) {
				return false;
			}
			//再看内容
			}else if (!name.equals(person.name)) {
			return false;
	}
	return true;
//		/*
//		 * 总结整体思路
//		 * 1.除了看看是不是本身,是返回true以外
//		 * 2.其余全是过滤掉flase 最后返回true
//		 * 3.总结构架:
//		 * 1.自身 
//		 * 2.是否空 
//		 * 3.转型开始比较内容 
//		 * 3.1基本类型直接比较值 
//		 * 3.2.1引用数据类型先看是不是空
//		 * 3.2.2最后再比较引用类型是否内容相同
//		 * 4.(如果第一点不满足)过滤完前3点,发现满足,直接返回true
//		 */
//		return true;
//
//	}
//	

toString

@Override
//默认的 toString 是输出 包名+类 @ 加hashcode值
//这块又分两种情况 是否重写hashcode
//EqualsandSystem.Student@7852e922--这是没重写的的hashcode输出
//EqualsandSystem.Student@3c1-------这是重写过hashcode的默认输出
重写的tostring方便我们直接看出实例对象里面所有属性的值
	public String toString() {
		return "Person [age=" + age + ", name=" + name + "]";
	}

hashcode

@Override
//这块首先涉及到hash算法(自行补课)
//通过上面的算法我们能算出一个对象实例在内存中的位置
//重写hashcode是为了 我们在使用hash相关的集合中,
//尽力保证两个不是相同对象的hashcode不相同(注意是尽力保证,因为存在一种情况两个对象不同但是hashcode相同)
//如果出现上述括号里面的情况,此时我们还需要调用重写的equlas方法,所以增加了程序开销
//所以我们要尽力优化hashcode算法 保证不同对象的值尽量不是同一个hashcode
public int hashCode() {
	final int prime = 31;
	int result = 1;
	result = prime * result + age;
	result = prime * result + ((name == null) ? 0 : name.hashCode());
	return result;
}

}

展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 深蓝海洋 设计师: CSDN官方博客
应支付0元
点击重新获取
扫码支付

支付成功即可阅读