飞道的博客

田哥:面试被问== 与equals 的区别,该怎么回答?

304人阅读  评论(0)

关注“Java后端技术全栈”

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

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

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

==

基本数据类型

如果是基本数据类型的比较,则比较的是值。


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

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

基本数据类型:


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

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

包装类(引用类)

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


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

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

equals

没有重写equals方法

是Object的方法。

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

如果比较的类没有重写Object中的equals方法,那么比较的就是两个对象的地址,就是使用==来比较的。

重写equals方法

重写了equals方法后,还得看equals方法是如何写的。

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

在Integer中


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

比较的就是对应的数字。

在String中


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

比较的是字符串内容。


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

把字符串拆成char数组进行一个一个比较。

自定义类中重写equals方法


   
  1. 1public class User {
  2. 2    private Long id;
  3. 3    private String userName;
  4. 4
  5. 5    public User() {
  6. 6    }
  7. 7
  8. 8    public User(Long id, String userName) {
  9. 9        this.id = id;
  10. 10        this.userName = userName;
  11. 11    }
  12. 12
  13. 13    public Long getId() {
  14. 14         return id;
  15. 15    }
  16. 16
  17. 17    public void setId(Long id) {
  18. 18        this.id = id;
  19. 19    }
  20. 20
  21. 21    public String getUserName() {
  22. 22         return userName;
  23. 23    }
  24. 24
  25. 25    public void setUserName(String userName) {
  26. 26        this.userName = userName;
  27. 27    }
  28. 28
  29. 29     //equals方法爱怎么写就怎么写
  30. 30     //比如说一个正常的人比较,只要身份证号一样,那就肯定是同一个人了。
  31. 31     //所以在equals的时候我们也可以只比较身份证号就可以了。
  32. 32    @Override
  33. 33    public boolean equals(Object o) {
  34. 34         //同一个对象地址,直接返回true
  35. 35         if (this == o) {
  36. 36             return  true;
  37. 37        }
  38. 38         //为null或者Class不一致返回false
  39. 39         if (o == null || getClass() != o.getClass()) {
  40. 40             return  false;
  41. 41        }
  42. 42        User user = (User) o;
  43. 43         //当两个对象的id相同并且userName相同才返回true
  44. 44         return Objects.equals(id, user.id) &&
  45. 45                Objects.equals(userName, user.userName);
  46. 46    }
  47. 47    @Override
  48. 48    public  int hashCode() {
  49. 49         return Objects.hash(id, userName);
  50. 50    }
  51. 51}

上面Objects.equals


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


总结

== 用于基本数据类型比较的是值

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

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

下次,你知道该怎么回答了吗?

推荐阅读:

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

《Go语言实战》.pdf

《分布式Java应用基础与实践》.pdf


转载:https://blog.csdn.net/o9109003234/article/details/109981523
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场