==与equals方法

•  等号“==”

/**         等号 "=="
 * 等号可以比较基本类型和引用类型,等号比较的是值,特别是比较引用类型,比较的是引用的内存地址
 */
public class equalsTest02 {
    public static void main(String[] args) {
        int a=100;
        int b=100;
        //采用等号比较基本类型--比较的就是具体的值
        System.out.println((a==b)?"a==b":"a!=b");//a==b

        Person01 p1=new Person01();
        p1.id=1001;p1.name="张三";

        Person01 p2=new Person01();
        p2.id=1001;p2.name="张三";
        //采用等号比较引用类型比较的是引用类型的地址(地址也是值)
        //这个是不符合我们的比较需求的
        //我们比较的应该是对象的具体属性,如:id相等,或id和name相等
        System.out.println((p1==p2)?"p1==p2":"p1!=p2"); //p1!=p2

        Person01 p3=p1;
        //因为p1和p3指向的是一个对象,所以地址一样
        System.out.println((p1==p3)?"p1==p3":"p1!=p3"); //p1==p3

        String s1="abc";
        String s2="abc";
        System.out.println((s1==s2)?"s1==s2":"s1!=s2"); //s1==s2
    }
}
class Person01{
    int id;
    String name;
}

• 采用 equals 比较两个对象是否相等

//采用equals比较两个对象是否相等
public class equalsTest03 {
    public static void main(String[] args) {
        String s1="abc";
        String s2="abc";
        System.out.println((s1==s2)?"s1==s2":"s1!=s2");//s1==s2

        String s3=new String("abc");
        String s4=new String("abc");
        System.out.println((s3==s4)?"s3==s4":"s3!=s4");//s3!=s4
        //输出s3等于s4,所以确定String的equals比较的是具体的内容。
        //因为String类已经重写了equals方法
        System.out.println(s3.equals(s4)?"s3等于s4":"s3不等于s4");//s3等于s4

        Person02 p1=new Person02();
        p1.id=1001;p1.name="张三";

        Person02 p2=new Person02();
        p2.id=1001;p2.name="张三";
        System.out.println(p1.equals(p2)?"p1等于p2":"p1不等于p2");//p1不等于p2
        /**     输出:p1不等于p2
         * 因为它默认调用的是Object的equals方法
         * 而Object的equals方法默认比较的就是地址,Object的equals方法代码如下:
         *  public boolean equals(Object obj){
         *      return(this==obj);
         *  }
         *  如果不准备调用父类的equals方法,那么必须覆盖父类的equals方法行为
         */
    }
}
class Person02{
    int id;
    String name;
}

 

在Object类中的equals方法当中,默认采用的是“==”判断两个java对象是否相等。而“==”判断的是两个java对象的内存地址,我们应该判断两个java对象的内容是否相等。所以老祖宗的equals方法不够用,需要子类重写equals。

public class equalsTest04 {
    public static void main(String[] args) {
        Person04 p1=new Person04();
        p1.id=1001;p1.name="张三";

        Person04 p2=new Person04();
        p2.id=1001;p2.name="张三";
        /**
         * 没有重写equals()之前,结果为p1等于p2;重写之后结果为p1等于p2
         * 因为重写之前equals方法默认比较的就是对象的内存地址
         * 重写之后比较的就是具体的内容
         */
        System.out.println(p1.equals(p2)?"p1等于p2":"p1不等于p2");
    }
}
class Person04{
    int id;
    String name;

    //覆盖父类的方法,加入自己的比较规则
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person04 person04 = (Person04) o;
        return id == person04.id &&
                Objects.equals(name, person04.name);
    }
}

 

posted on 2021-01-20 20:08  大王叫我来烧山  阅读(108)  评论(0)    收藏  举报

导航