关注“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。1011double:64位,数据范畴在4.9e-324~1.8e308,赋值时能够加d或D也能够不加。1213boolean:只有true和false两个取值。1415char: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 //字符串长度不始终,就间接返回false10 if (n == anotherString.value.length) {11 char v1[] = value;12 char v2[] = anotherString.value;13 int i = 0;14 //长度一样的字符串,而后比拟字符串中的内容15 while (n-- != 0) {16 //挨个比拟,只有有不统一的就返回false17 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 }1213 public Long getId() {14 return id;15 }1617 public void setId(Long id) {18 this.id = id;19 }2021 public String getUserName() {22 return userName;23 }2425 public void setUserName(String userName) {26 this.userName = userName;27 }2829 //equals办法爱怎么写就怎么写30 //比如说一个失常的人比拟,只有身份证号一样,那就必定是同一个人了。31 //所以在equals的时候咱们也能够只比拟身份证号就能够了。32 @Override33 public boolean equals(Object o) {34 //同一个对象地址,间接返回true35 if (this == o) {36 return true;37 }38 //为null或者Class不统一返回false39 if (o == null || getClass() != o.getClass()) {40 return false;41 }42 User user = (User) o;43 //当两个对象的id雷同并且userName雷同才返回true44 return Objects.equals(id, user.id) &&45 Objects.equals(userName, user.userName);46 }47 @Override48 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