乐趣区

关于javascript:田哥面试被问-与equals-的区别该怎么回答

关注“Java 后端技术全栈”

回复“000”获取大量电子书

最近有位小伙伴去一家互联网公司面试,后果被问:“你是如何了解 == 与 equals 的?”他支支吾吾半天没答复到重点。后果可想而知了~~~

这道题在口试中的出镜率相当高,其实很简略。

==

根本数据类型

如果是根本数据类型的比拟,则比拟的是值。

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

这里 == 比拟的是 a 的值 1000 和 b 的值 999 是否相当。

根本数据类型:

 1byte:8 位,最大存储数据量是 255,寄存的数据范畴是 -128~127 之间。2
 3short:16 位,最大数据存储量是 65536,数据范畴是 -32768~32767 之间。4
 5int:32 位,最大数据存储容量是 2 的 32 次方减 1,数据范畴是负的 2 的 31 次方到正的 2 的 31 次方减 1。6
 7long:64 位,最大数据存储容量是 2 的 64 次方减 1,数据范畴为负的 2 的 63 次方到正的 2 的 63 次方减 1。8
 9float:32 位,数据范畴在 3.4e-45~1.4e38,间接赋值时必须在数字后加上 f 或 F。10
11double:64 位,数据范畴在 4.9e-324~1.8e308,赋值时能够加 d 或 D 也能够不加。12
13boolean:只有 true 和 false 两个取值。14
15char:16 位,存储 Unicode 码,用单引号赋值。

如果 == 用于以上八种根本数据类型比拟的时候,比拟的是值。

包装类(援用类)

如果是包装类或者援用类的比拟,则比拟的是对象地址。

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

这时候比拟的是 user1 指向的地址和 user2 指向的地址是否统一。

equals

没有重写 equals 办法

是 Object 的办法。

网上都说,equals 是比拟的是内容,很多都是瞎说。具体问题具体分析。

如果比拟的类没有重写 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}

总结

== 用于根本数据类型比拟的是值

== 用于包装类(援用类)比拟的是对象地址。

equals 办法没有重写还是比拟对象地址。重写 equals 办法后还得看是如何重写的。

下次,你晓得该怎么答复了吗?

举荐浏览:

《Spring Cloud 与 Docker 微服务架构实战》.pdf

《Go 语言实战》.pdf

《分布式 Java 利用根底与实际》.pdf

退出移动版