class Student {
public String name;
public int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
对于一个学生"张三",我们用他生成了两个对象:
Student s1=new Student("张三",20); Student s2=new Student("张三",20);
我们怎么判断他们是否是一个对象呢?如果直接使用"=="或equals()方法进行比较的话
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
那么结果都是 false 。因为如果Student不复写equals()方法,那么s1.equals(s2)实际上调用的是Object类的equals()方法,
查看他的源代码可以发现该方法实际上返回的就是s1==s2,所以我们要重写equals()方法。
public boolean equals(Object obj) {
if(!(obj instanceof Student))
return false;
Student s=(Student)obj;
return this.name==s.name && this.age==s.age;
}
至于复写hashCode(),是因为默认的话哈希值是根据地址计算来的,如果不复写的话,那么我们认为s1跟s2是同一个对象,
但是他们在内存中存放的位置不同却导致了不同的哈希值,这在进行哈希类集合操作时将产生严重问题。
实现Comparable接口是为了能将对象放到二叉树类的集合中(典型的treeSet),这类集合有自动排序的功能,
他就是靠调用对象的compareTo() 方法。
|