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
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章