java.lang包是java虚拟机自动导入的。
不能指向空内容,这样会导致空指针异常。
当调用对象不为空,而参数对象为空的时候,内容一定不相同。
package task11;
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student(1001,“zhangfei”);
Student s2 = new Student(1001,“guanyu”);
boolean b1 = s1.equals(s2);
System.out.println(“b1=”+b1);
System.out.println(s1 == s2);
}
}
package task11;
public class Student {
private int id;
private String name;
Student(){}
Student(int id,String name){
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0){
this.id = id;
}else{
System.out.println("学号不合理");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//为了比较两个对象的内容,也就是学号信息需要重写该方法
//Student this = s1;
//Object obj = s2;就是多态,父类类型引用指向子类对象 要强转才能引用子类的方法
@Override
public boolean equals(Object obj) {
//强转之前先判断一下obj是不是指向Student
if (obj instanceof Student) {
//用一个Student的ts接着
Student ts = (Student) obj;
return this.getId() == ts.getId();
}
//否则类型不一致,没有可比性,内容一定不相同
return false;
}
}
改进:
如果obj是空,那么就一定返回false
如果obj和s1指向同一个地方,那么一定返回true
package task11;
public class Student {
private int id;
private String name;
Student(){}
Student(int id,String name){
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0){
this.id = id;
}else{
System.out.println("学号不合理");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//为了比较两个对象的内容,也就是学号信息需要重写该方法
//Student this = s1;
//Object obj = s2;就是多态,父类类型引用指向子类对象 要强转才能引用子类的方法
@Override
public boolean equals(Object obj) {
//当调用对象不为空而参数对象为空的时候,则内容一定不相同,就不用判断了
if(obj == null){
return false;
}
//当调用对象和参数对象指向同一个对象时,一定相同
if (obj == this){
return true;
}
//强转之前先判断一下obj是不是指向Student
if (obj instanceof Student) {
//用一个Student的ts接着
Student ts = (Student) obj;
return this.getId() == ts.getId();
}
//否则类型不一致,没有可比性,内容一定不相同
return false;
}
}
hrshcode的规定:当true,harh的返回值要相等,当false,返回值不同
(harh返回的是int )但是上面的代码并不满足,因此可以按照下面修改:
package task11;
public class StudentTest {
public static void main(String[] args) {
Student s1 = new Student(1001,“zhangfei”);
Student s2 = new Student(1002,“guanyu”);
boolean b1 = s1.equals(s2);
System.out.println(“b1=”+b1);
System.out.println(s1 == s2);
System.out.println("---------------------");
//调用从Object继承下来的hashCode
int ia= s1.hashCode();
int ib= s2.hashCode();
System.out.println(“ia=”+ia+" "+“ib=”+ib);
}
}
package task11;
public class Student {
private int id;
private String name;
Student(){}
Student(int id,String name){
setId(id);
setName(name);
}
public int getId() {
return id;
}
public void setId(int id) {
if(id>0){
this.id = id;
}else{
System.out.println("学号不合理");
}
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
//为了比较两个对象的内容,也就是学号信息需要重写该方法
//Student this = s1;
//Object obj = s2;就是多态,父类类型引用指向子类对象 要强转才能引用子类的方法
@Override
public boolean equals(Object obj) {
//当调用对象不为空而参数对象为空的时候,则内容一定不相同,就不用判断了
if(obj == null){
return false;
}
//当调用对象和参数对象指向同一个对象时,一定相同
if (obj == this){
return true;
}
//强转之前先判断一下obj是不是指向Student
if (obj instanceof Student) {
//用一个Student的ts接着
Student ts = (Student) obj;
return this.getId() == ts.getId();
}
//否则类型不一致,没有可比性,内容一定不相同
return false;
}
//为了使得该方法的结果与equals方法的结果保持一致,从而满足java官方的常规协定,需要重写该方法。
@Override
public int hashCode() {
//return getId();
int type = 12;
return type*31 +getId();
}
}