2021-04-04

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

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值