public class Account {
String account;
double balance;
Account(String account, double balance) {
this.account = account;
this.balance = balance;
}
}
public class AccountTest {
public static void main(String[] args) {
Account a1 = new Account("Sandy", 1000);
Account a2 = new Account("Sandy", 1000);
System.out.println(a1.equals(a2));
}
}
当我执行它时显示“false”但对象在变量中包含相同的数据。为什么?解释。
答案 0 :(得分:4)
因为默认情况下对象会根据equals(Object obj)检查相等性。
类Object的equals方法实现了对象上最具辨别力的等价关系;也就是说,对于任何非空引用值x和y,当且仅当x和y引用同一对象时,此方法才返回true(x == y的值为true)。
如果要在类中使用equals()
方法检查相等,则必须覆盖Object
类的equals()方法。
how-to-override-equals-method-in-java,如下:
@Override
public boolean equals(Object obj) {
// your implementation
}
你应该Object
类的always override hashCode() whenever overriding equals方法。
#Effective Java,Joshua Bloch
您必须覆盖覆盖equals()的每个类中的hashCode()。如果不这样做,将导致违反Object.hashCode()的常规合同,这将阻止您的类与所有基于散列的集合(包括HashMap,HashSet和Hashtable)一起正常运行。
答案 1 :(得分:2)
您需要覆盖equals()方法,并在想要比较它们的值时使用它。
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
final Account other = (Account) obj;
if ((this.account== null) ? (other.account!= null) : !this.account.equals(other.account)) {
return false;
}
if (this.balance!= other.balance) {
return false;
}
return true;
}
答案 2 :(得分:2)
您需要覆盖equals
@Override
public boolean equals(Object obj) {
if (!(obj instanceof Account))
return false;
Account that = (Account) obj;
return (account == null ? that.account == null : account
.equals(that.account)) && balance == that.balance;
}
我在覆盖hashCode
equals
@Override
public int hashCode() {
int hash = 17;
hash = 37 * hash + (account == null ? 0 : account.hashCode());
long l = Double.doubleToLongBits(balance);
hash = 37 * hash + (int) (l ^ (l >>> 32));
return hash;
}
答案 3 :(得分:1)
您没有覆盖equals
。当且仅当两个变量指向同一对象时,从equals
继承的默认Object
实现才会返回true
。
覆盖equals
以检查字段相等性(如果您在,则hashCode
)。
答案 4 :(得分:1)
Object.equals()方法正在测试以查看被比较的两件事情是否是同一个对象。虽然a1和a2包含相同的信息,但它们是内存中的不同对象。
如果要测试对象内部信息的相等性,可以让类实现Comparable
接口并覆盖compareTo
方法。
答案 5 :(得分:0)
由于你没有覆盖.equals()
(如果你这样做,必须也覆盖.hashCode()
),你使用Object
的{{1}实施;当且仅当对象引用相等时(即.equals()
)。
答案 6 :(得分:0)
您需要覆盖Object.equals()
方法。
答案 7 :(得分:0)
如果true
,它会显示a1.balance==a2.balance
。请注意,equals()
比较对象而不是实际值。为了能够比较对象,您必须覆盖equals()
方法。
有关详细信息,请参阅此处Comparing two objects using an equals method, Java
答案 8 :(得分:0)
Object类中的实现,即默认实现检查引用。 因此,如果引用相同则返回true,否则返回false。