Java中的 ==与 equals

1 概述

== 比较的是 所指向的对象的地址
equals 比较的是 所指向的对象的内容


注:

  • equals方法不能作用于基本数据类型的变量
  • 用 == 比较基本数据类型的变量,比较的是它们的值
  • equals是基类 Object 中的方法,它也是用 == 来实现的,所以使用中的其他类,基本上都对 equals进行了重写,让其比较的是内容

总结:
因为比较引用所指向的对象的地址不常用(一般意义不大),在开发中
如果 比较基本类型变量的值是否相同,用 ==,其他用 equals

1.1 ==

基本上分为三种类型

1) 基本类型 == 基本类型

比较的是数值

2) 引用类型 == 引用类型

比较的是 引用变量所指向的地址

3) 基本类型 == 引用类型

即 基本类型变量和它的封装类型变量比较,封装类型会自动拆箱为基本类型后再进行比较,比较的是它们的数值

实例代码:

public class EqualDemo {

    public static void main(String[] args) {
        int x = 10;
        int y = 10;

        Integer i = new Integer(10);
        Integer j = new Integer(10);

        String s1 = "abc";
        String s2 = "abc";
        s2 = "efg";

        String s3 = new String("abc");
        String s4 = new String("abc");

        // true   基本类型的变量的比较只能用 == , 比较的是值 它们不能 new
        System.out.println(x==y);
        //  false 比较的是 i j 首地址的值,当然不一样
        System.out.println(i==j);
        // true    会对 j 进行拆箱操作,还原为 int, 这就是值的比较了
        System.out.println(x==j);
        // true  s1 s2 都是存储在常量池中,如果 s1的值常量池中没有,就创建一个 "abc",如果有,s1就直接指向它,s2直接指向 s1 的 地址
        System.out.println(s1==s2);
        // false  首地址
        System.out.println(s3==s4); 
        System.out.println(s1==s3);  // false
        System.out.println(s1); // abc
        System.out.println(s2); // efg
    }
}
1.2 equals

equals方法是基类 Object中的方法,其实现

public boolean equals(Object obj){
  return (this == obj);
}

可以看到,源码中的 equals比较方法也是用 == 实现的,比较的是地址,如果指向的是同一个对象,为 true, 否则为 false
Java中大部分类都重写了 equals方法,直接拿来用,比较的就是内容,但是自己自定义的类,如果没有重写 equals方法,比较的是地址,想要比较的是内容,需要自己重写equals方法或者继承的直接父类不是Object

Java String类的 默认 equals方法

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    if (anObject instanceof String) {
        String anotherString = (String)anObject;
        int n = value.length;
        if (n == anotherString.value.length) {
            char v1[] = value;
            char v2[] = anotherString.value;
            int i = 0;
            while (n-- != 0) {
                if (v1[i] != v2[i])
                    return false;
                i++;
            }
            return true;
        }
    }
    return false;
}

自定类 实现 equals比较内容的方法
1 不重写 equals方法

public class Person {

    private String  name;
    private Integer age;

    public Person(String name,Integer age){
        this.age = age;
        this.name = name;
    }

    public static void main(String[] args) {
        Person p1 = new Person("test",24);
        Person p2 = new Person("test",24);
        System.out.println(p1.equals(p2)); // false
    }

}

2 重写 equals方法

public class Person1 {

    private String name;
    private Integer age;

    public Person1(String name,Integer age){
         this.age = age;
         this.name = name;
    }

    public String getName(){
        return name;
    }
    public void setName(String name){
        this.name = name;
    }

    public Integer getAge(){
        return age;
    }
    public void setAge(Integer age){
        this.age = age;
    }

    public boolean equals(Object o){
        if(this == o) return true;
        if(o == null || getClass() != o.getClass() ) return false;
        Person1 person1 = (Person1) o;

        if(name !=null ? !name.equals(person1.name):person1.name != null) return false;

        return age != null ? age.equals(person1.age) : person1.age == null;
    }

    public static void main(String[] args) {
        Person1 p1 = new Person1("li",18);
        Person1 p2 = new Person1("li",18);
        System.out.println(p1.equals(p2)); // true
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章