layout: post
title: equals 方法里面的“坑”
tags:
- Java
- 基礎(chǔ)知識(shí)
categories: Java
今天遇到一個(gè)比較細(xì)節(jié)的bug,稍微有點(diǎn)基礎(chǔ)的都知道 == 和 equals 的用法,前者用于比較基本數(shù)據(jù)類型值是否相等,當(dāng)用于引用類型的時(shí)候,一般比較的都是引用地址,因此我們?cè)诒容^兩個(gè)對(duì)象是否相等時(shí)就用后者。然而。。。
先來看一段代碼:
Integer n1 = new Integer(21);
Integer n2 = new Integer(21);
System.out.println(n1 == n2);
System.out.println(n1.equals(n2));
不難知道。前者比較的引用,返回false,后者比較的內(nèi)容,返回true;
下面,我們自定義一個(gè)Student類:
class Student {
private String name;
private int age;
public Student(String name,int age) {
this.name = name;
this.age = age;
}
}
省略掉了setter和getter,然后我們?cè)賮韓ew兩個(gè)對(duì)象比較一下:
Student s1 = new Student("Big",21);
Student s2 = new Student("Big",21);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
你能猜到打印的結(jié)果嗎??jī)蓚€(gè)都是false!這就很費(fèi)解了,為什么equals不好使了呢?這是因?yàn)椋?/p>
因?yàn)閑quals()方法默認(rèn)行為是比較引用,因此在新類中要自己重寫equals()方法,否則不可能表現(xiàn)出我們希望的行為。 ——《Thinking in Java》3.7.1
OK,到這里我們就發(fā)現(xiàn)了原因了,我們?cè)赟tudent類中添加一個(gè)equals方法:
public boolean equals(Student s) {
if (s != null && this.name.equals(s.name) && this.age == s.age)
return true;
return false;
}
至此,問題解決,s1.equals(s2) 會(huì)返回我們期望的結(jié)果。雖然,問題很小,但是不了解equals方法的默認(rèn)行為的話,這個(gè)bug還是很難發(fā)現(xiàn)的。