田哥:面試被問== 與equals 的區別,該怎麼回答?

最近有位小夥伴去一家互聯網公司面試,結果被問:「你是如何理解==與equals的?」他支支吾吾半天沒回答到重點。結果可想而知了~~~
面試

這道題在筆試中的出鏡率至關高,其實很簡單。
數組

==c3496b793a38616b035d4684dd6df0dd.png

基本數據類型

若是是基本數據類型的比較,則比較的是值。ide

1int a = 1000;
2int b = 999;
3if(a == b){
4    System.out.println("a == b");
5}

這裏 == 比較的是a的值1000和b的值999是否至關。大數據

基本數據類型:this

 1byte8位,最大存儲數據量是255,存放的數據範圍是-128~127之間。
2
3short16位,最大數據存儲量是65536,數據範圍是-32768~32767之間。
4
5int32位,最大數據存儲容量是232次方減1,數據範圍是負的231次方到正的231次方減1
6
7long64位,最大數據存儲容量是264次方減1,數據範圍爲負的263次方到正的263次方減1
8
9float32位,數據範圍在3.4e-45~1.4e38,直接賦值時必須在數字後加上f或F。
10
11double64位,數據範圍在4.9e-324~1.8e308,賦值時能夠加d或D也能夠不加。
12
13boolean:只有truefalse兩個取值。
14
15char16位,存儲Unicode碼,用單引號賦值。

若是 == 用於以上八種基本數據類型比較的時候,比較的是值。spa

包裝類(引用類)

若是是包裝類或者引用類的比較,則比較的是對象地址。3d

1User user1 = new User("張三",20);
2User user2 = new User("老田",20);
3if(user1 == user2){
4   System.out.println("老田就是張三");
5}

這時候比較的是user1指向的地址和user2指向的地址是否一致。code

equals

沒有重寫equals方法

是Object的方法。對象

61aaef65768bdb7a48858228e10e277d.png

網上都說,equals是比較的是內容,不少都是瞎說。具體問題具體分析。blog

若是比較的類沒有重寫Object中的equals方法,那麼比較的就是兩個對象的地址,就是使用==來比較的。

重寫equals方法

重寫了equals方法後,還得看equals方法是如何寫的。

典型的String/Integer等這些都是重寫了eqauls方法的。

在Integer中

1    public boolean equals(Object obj) {
2        if (obj instanceof Integer) {
3            return value == ((Integer)obj).intValue();
4        }
5        return false;
6    }

比較的就是對應的數字。

在String中

 1    public boolean equals(Object anObject) {
2        //同一個對象地址,直接返回true
3        if (this == anObject) {
4            return true;
5        }
6        if (anObject instanceof String) {
7            String anotherString = (String)anObject;
8            int n = value.length;
9            //字符串長度不一直,就直接返回false
10            if (n == anotherString.value.length) {
11                char v1[] = value;
12                char v2[] = anotherString.value;
13                int i = 0;
14                //長度同樣的字符串,而後比較字符串中的內容
15                while (n-- != 0) {
16                    //挨個比較,只要有不一致的就返回false
17                    if (v1[i] != v2[i])
18                        return false;
19                    i++;
20                }
21                return true;
22            }
23        }
24        return false;
25    }

比較的是字符串內容。

1String aa = "abcd";
2String bb = "abcde";
3aa.equals(bb)

把字符串拆成char數組進行一個一個比較。

自定義類中重寫equals方法

 1public class User {
2    private Long id;
3    private String userName;
4
5    public User() {
6    }
7
8    public User(Long id, String userName) {
9        this.id = id;
10        this.userName = userName;
11    }
12
13    public Long getId() {
14        return id;
15    }
16
17    public void setId(Long id) {
18        this.id = id;
19    }
20
21    public String getUserName() {
22        return userName;
23    }
24
25    public void setUserName(String userName) {
26        this.userName = userName;
27    }
28
29    //equals方法愛怎麼寫就怎麼寫
30    //好比說一個正常的人比較,只要身份證號同樣,那就確定是同一我的了。
31    //因此在equals的時候咱們也能夠只比較身份證號就能夠了。
32    @Override
33    public boolean equals(Object o) {
34        //同一個對象地址,直接返回true
35        if (this == o) {
36            return true;
37        }
38        //爲null或者Class不一致返回false
39        if (o == null || getClass() != o.getClass()) {
40            return false;
41        }
42        User user = (User) o;
43        //當兩個對象的id相同而且userName相同才返回true
44        return Objects.equals(id, user.id) &&
45                Objects.equals(userName, user.userName);
46    }
47    @Override
48    public int hashCode() {
49        return Objects.hash(id, userName);
50    }
51}

上面Objects.equals

1public static boolean equals(Object a, Object b) {
2        return (a == b) || (a != null && a.equals(b));
3}


總結c3496b793a38616b035d4684dd6df0dd.png

== 用於基本數據類型比較的是值

==用於包裝類(引用類)比較的是對象地址。

equals方法沒有重寫仍是比較對象地址。重寫equals方法後還得看是如何重寫的。

下次,你知道該怎麼回答了嗎?

相關文章
相關標籤/搜索