若是问你Java中==和equals()有何区别,相信你的第一反应会回答:==比较的是它们所指向的对象地址,而equals()方法比较的是它们的内容值。实际上,这样的回答是不全面的。java
摘自《Java编程思想》一书中的原话:编程
关系操做符“==”生成的是一个boolean结果,它们计算的是操做数的值之间的关系。this
那么关于==的比较,无外乎如下两种状况。spa
咱们知道,Java中全部的类都是由Object类派生出来的,在Object类中定义定义了equals()方法,其源码以下:.net
public boolean equals(Object obj) { return (this == obj); }
也就是说,在没有被重写的状况下,比较的是引用类型的变量所指向的对象的地址。code
那么,有哪些经常使用的类equals()方法被重写了?好比String类、包装类、Date类都是。对象
String类equals()方法源码:blog
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
包装类,好比Integer中equals()方法源码:get
public boolean equals(Object obj) { if (obj instanceof Integer) { return value == ((Integer)obj).intValue(); } return false; }
这些被重写的equals()方法的类,比较的是引用类型的变量所指向的对象存储的内容是否相等,即比较它们的值。源码
推荐阅读 Java中包装类型的大小比较