一、“==”运算符

比较基本数据类型的值或两个引用变量是否指向同一对象是否相同,只能用“==”运算符

二、equals()方法

每一个java类都继承自Object,所以每个类都有equals方法。所以在没有覆盖equals方法情况下,equals与"=="运算符比较的是两个对象(引用)。

Object 中equals方法并没有被final修饰,所以子类可以覆盖这个方法,达到比较的是数据具体内容,如下的String

关于根据具体内容判断两对象一致问题​

 //Object类 直接使用"=="运算符比较两个对象
public boolean equals(Object obj) {
return (this == obj);
}
/* String 类
Compares this string to the specified object. The result is {@code
* true} if and only if the argument is not {@code null} and is a {@code
* String} object that represents the same sequence of characters as this
* object.
*/
public boolean equals(Object anObject) {
if (this == anObject) //先判断是否为同一个对象
{
return true;
}
if (anObject instanceof String) //判断是否为String的实例,否则会发生不能向下转换问题
{
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) //比较每个char是否相同
{
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;


三、hashcode()方法

①从Object类中继承过来,它也是鉴定两个对象是否相等。Object类中的hashCode()方法返回对象在内存中地址转换成一个int值,所以没有重写hashCode()方法,任何对象的hashCode()都是不同的

②hashCode重要性的由来:

Java中的集合有两类,一类是List(有序,元素可以重复),再有一类是Set(无序,元素不可以重复)

如何判断元素是否重复?

若采用equals方法,则将新增元素与已有的元素比较,效率太低。

于是,java采用哈希表,hashCode方法实际上返回的是对象存储的物理位置(实际不一定)。这样,当集合元素新增时,就先调用这个元素的hashCode方法,就一下子找到应该放置的物理位置了。若这个位置没有元素,则直接放在这位置;若有,再调用equals方法与新元素比较,相同则不存;不同则散列其他的地址。

所以这里存在一个冲突解决的问题,但是调用equals方法的次数大大降低了,几乎只需一两次

通过上面的描述总结:hashcode为了提高set这类不允许重复的集合的效率而已

结论: (hashcode()方法返回值与equals()方法的关系:)

①若equals()方法返回为true,则hashcode()方法也会产生同样的整数结果 (因为hashcode不一致,才会调用equals)

②若equal()方法返回为false,则hashcode()可能相等,也可能不等。存在两种情况:hashcode返回值相等,需equal再判断元素是否相等;若hashcode()不等,则equals()一定不等。

hashcode()方法返回值与equals()方法的区别:

①equals()方法是给用户调用的;hashcode()方法用户一般不调

②hashcode相当于对象的编码,返回int 相对不直观