- ==是操作符,会返回一个boolean类型的值,用于计算两个操作数的值的关系。
- equals是Object的实例方法,用于比较两个对象的内容是否相同。
- hashcode()是Object的native方法,他会获取一个对象的hash值,返回一个整型值,用于表示该对象在哈希表中索引位置。
“==”:为关系操作符
对于8个基本类型:整型:byte,short,int,long 浮点数:float,double 布尔类型:boolean 字符类型:char。变量直接存储其需要表示的值,关系操作符可以直接判定两个变量的值是否相等。
对于引用类型的变量,变量中存储的是对象在内存中的地址。因而关系操作符只能判断两个引用型变量是否引用同一个对象。
equals:实例方法
Object类中有equals方法的基本实现:
public boolean equals(Object obj) {
return (this == obj);
}
可见,Object类中equals方法是判定两个引用型变量是否指向同一个对象。但是对于类似于String的非基本类型,equals方法可以判断两个引用型变量所引用对象的内容是否相同。这是因为,java中所有的非基本类型都继承了Object类,因此他们重写了equals方法。所以我们说,equals方法是非基本类型的实例方法,可以判断引用型变量所指向的对象的内容是否相同。一般而言,其判断步骤分为如下三步:
(1) 先判断两个引用型变量是否指向同一对象;
(2) 若不是,再判断两个引用型变量的类型是否一致;
(3) 若是,再判断两个对象的内容的是否一致。
equals需要满足:对称性、自反性、一致性、传递性(类推性)。
hashcode:native方法
hashcode方法是Object类中的native方法,所有继承Object的类型都会有该方法。native方法是指在java外部用其他语言实现的方法。在hashcode的使用中,有一些规范:
(1) 在java程序的执行期间,对同一对象多次调用hashcode方法,返回的整数必须是一致相同的,前提是对该对象进行equals比较时所用的参数没有改变。从同一程序的一次执行,到该程序的另一次执行,该整数无需一致。
(2) 如果根据equals方法,两个对象是相等的,那么这两个对象的hashcode返回的整数必须是相同的。
(3) 如果根据equals方法,两个对象不相等,那么这两个对象的hashcode返回的整数不一定不相同,但是我们应该明白,不同的对象拥有不同的hashcode有利于提升哈希表的性能。
并且,hashcode和equals存在如下关系:
(1) 若两个对象根据equals是相等的,那么他们两个的hashcode一定是相同。
(2) 如果两个对象的hashcode是相同的,那么这两个对象不一定相等。
(3) 如果两个对象的hashcode不同,那么这两个对象一定不相等。
(4) 一般来讲,equals方法是给用户调用的,而hashcode方法用户一般不会调用。
(5) 如果一个对象类型作为集合对象的元素时,那么这个对象一定要有自己的equals和hashcode实现,并且要遵循上述规则。
因此,若我们重写equals方法,而不重写hashcode,那么equals方法可能会失效。