==
==是一个比较运算符;
若比较的是基本数据类型,则比较的是值;
若比较的是引用数据类型,则比较的是它们在内存中的内存地址。
说明:对象是存放在堆中,栈中存放的是对象的引用,因此==是对栈中的值进行比较,若返回true,代表变量的内存地址相等。
equals
equals是Object类的一个方法,底层是通过“==”实现的;
//Object类equals()方法源码
public boolean equals(Object obj) {
return (this == obj);
}
比较的是引用类型的数据内存地址是否相等(即,是不是同一个对象)。
说明:若类中重写了equals方法,就要根据具体代码实现来确定,一般在开发中重写了equals方法比较的就是对象的内容。
hashCode
hashCode也是Object类的一个方法,且是一个native方法,主要用于计算对象的哈希码值;
public native int hashCode();
之所以有hashCode方法,是因为对象在进行批量比较时,hashCode要比equals快。
比如:当我们向HashMap中添加新元素时,必须保证key是唯一的,这时就会涉及到key的比较,首先调用元素的hashCode()方法, 然后在进行&运算,定位到它在数组中的位置,若该位置没有元素则可以直接存储;若该位置有元素,再调用它的equals方法与新元素进行比较,若相同说明key重复,不能存储。若不相同,则将其存到该位置的链表头部。