目录
Objects中:hashCode(),toString(),equals
Objects中:hashCode(),toString(),equals
hashCode()
本方法用于返回对应对象的哈希码值
小贴士:哈希码值的得出是通过一种算法,意在让不同的对象具有不同的哈希码值,用于区分不同的对象.
但是有时候也存在不同对象哈希码值相同的特殊情况,我们称之为”哈希碰撞”现象
toString()
本方法用于返回对应对象的字符串表示
equals()
本方法用于指示其他某个对象是否与当前对象”相等”
Objects中的equals()的默认实现使用的是==比较
==比较的是左右两边的值,如果是基本类型,比较的是字面值
比如1和1,3.4和3.4
如果是引用类型,比较的是引用类型变量保存的地址值。
package cn.tedu.api;
import java.util.Objects;
/**
* 本类用于顶级父类Object的入门案列
*/
public class TestObject {
public static void main(String[] args) {
Student s1=new Student();
Student s2=new Student("张三",3,80,"3年级");
Student s3=new Student("张三",3,80,"3年级");
/**
* 测试hashCode()
* 本方法的作用是返回对应对象的int类的哈希码值
* 本方法力求不同的对象返回不同的哈希码值
* 这样我们就可以根据哈希马值区分不同的对象
*/
System.out.println(s1.hashCode());
System.out.println(s2.hashCode());
/**
* 负责打印s2对象的是println(),这个方法会层层向下调用,一直到Object中的Object
* Objecrt类中toString()的默认实现打印的是对象的地址值
* 子类Student重写了Object中的toString(),打印的是对象的类型+属性+属性值
*/
System.out.println(s2.toString());
System.out.println(s2);
System.out.println(s2.equals(s3));
}
}
class Student{
String name;
int age;
double score;
String Grade;
public Student(){
System.out.println("无参构造");
}
public Student(String name, int age, double score, String grade) {
System.out.println("全参构造~");
this.name = name;
this.age = age;
this.score = score;
Grade = grade;
}
//生成子类重写的toString()
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", Grade='" + Grade + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
Double.compare(student.score, score) == 0 &&
Objects.equals(name, student.name) &&
Objects.equals(Grade, student.Grade);
}
@Override
public int hashCode() {
return Objects.hash(name, age, score, Grade);
}
}
无参构造
全参构造~
全参构造~
923521
708553057
Student{name='张三', age=3, score=80.0, Grade='3年级'}
Student{name='张三', age=3, score=80.0, Grade='3年级'}
true
总结:
hashCode():默认实现:根据对象的地址值生成一个唯一的哈希码值
重写后:根据传入的属性值生成哈希码
toString():默认实现:打印对象的【类名@十六进制哈希码值】
重写后:Student自定义打印的是类型+所有属性和属性值。
equals():默认实现:比较两个对象的地址值,默认使用==比较
重写后:比较的是两个对象的类型+所有属性的属性值
综上:如果执行的效果与Object的默认效果不同,说明子类重写了该方法。