概念
- ==:该操作符生成的是一个boolean结果,计算的是操作数的值之间的关系
- equals:该方法是Object的实例方法,比较两个对象的content是否相同
- hashCode:Object的native方法,获取对象的哈希值。用于确定该对象在哈希表中的索引位置,实际上是一个int型整数。
关系操作符 ==
比较基本数据类型变量
Java中有八种基本数据类型:
- 整型:byte(1 byte),short(2 byte),int(4 byte),long(8 byte)
- 字符型:char(2 byte)
- 浮点型:float(4 byte),double(8 byte)
- 布尔型:boolean(JVM规范没有明确规定其所占的空间大小,仅规定其只能够取字面值”true”和”false”)
对于这八种基本数据类型的比较,因为变量直接存储的是"值",因此,在使用关系操作符 == 来进行比较时,比较的就是“值”本身。
比较引用类型变量
在Java中,引用类型的变量存储的并不是“值”本身,而是与其关联的对象在内存中的地址。所有此时==运算符比较的是对象的地址。
小结
- 如果变量的类型是基本数据类型,则 “==” 判断的是左右两边操作数的值是否相等。
- 如果变量的类型是引用数据类型,则 “==” 判断的是左右两边操作数的内存地址是否相同。也就是判断两边的变量是不是同一个对象。
equals
equals()方法是Object的一个实例方法,定义如下:
public boolean equals(Object obj){
return (this == obj);
}
也就是说,如果没有重写equals方法时,调用的是Object 的equals方法,也就是比较两个对象的地址,判断两个对象是不是同一个对象。
如果重写了equals方法,如String类中:
public int hashCode() {
int h = hash;
if (h == 0) {
char val[] = value;
int len = count;
for (int i = 0; i < len; i++) {
h = 31*h + val[off++];
}
hash = h;
}
return h;
}
所以此时是进行内容的比较。
hashCode
hashCode是Object中的一个本地方法,返回对象的地址值,定义为:
public native int hashCode();
equals与hashCode的关系
- 如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;
- 如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)。
原因:为了提高程序的效率才实现了hashCode方法,因为hashCode是一个int型整数,所以比较速度较快,所以先进行hashCode的比较,如果不同,那就没必要在进行equals的比较了,这样就大大减少了equals比较的次数,能够很大的提升比较的效率,由于Object中的hashCode返回的散列值与对象的地址有关,所以不同对象的散列值一定不同,这样先比较hashcode就没有意义了,所以这就是为什么重写equals方法时也要重写hashCode方法的原因。