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;
}
}