2 Java中 == 和 equals 和 hashCode 的区别

==

==是一个比较运算符;

若比较的是基本数据类型,则比较的是值;

若比较的是引用数据类型,则比较的是它们在内存中的内存地址。

说明:对象是存放在堆中,栈中存放的是对象的引用,因此==是对栈中的值进行比较,若返回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重复,不能存储。若不相同,则将其存到该位置的链表头部。

原文地址:https://www.cnblogs.com/xilichenbokeyuan/p/6385448.html