您现在的位置是:java学习笔记 >
java学习笔记
java中==和equals的区别和hashcode
本 文 目 录
# Java中==和equals的区别以及hashCode的详解
在Java编程语言中,"=="和"equals()"方法用于对象的比较,而"hashCode()"则主要用于哈希表(如HashMap、HashSet)中对象的存储与查找。它们各自具有不同的作用及使用场景。
1. "=="运算符:基本类型与引用类型的比较
“==”步骤与实现:
- 基本类型比较:对于Java中的基本数据类型(如int, double, char等),"=="用来判断两个变量是否存储相同的值。
int a = 5; int b = 5; System.out.println(a == b); // 输出:true
- 引用类型比较:而对于对象引用,"=="则是检查两个引用是否指向内存中的同一个对象实例。
String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1 == s2); // 输出:false,因为s1和s2指向的是堆中不同的对象实例
2. "equals()"方法:对象内容的比较
equals()方法步骤与实现:
- 默认行为:"equals()"在Object类中的默认实现是基于引用比较,即比较两个对象是否为同一对象实例。
- 自定义实现:但在诸如String、Integer等包装类以及用户自定义类中,通常会重写equals()方法以实现对象内容的比较。
String s1 = new String("Hello"); String s2 = new String("Hello"); System.out.println(s1.equals(s2)); // 输出:true,因为equals()方法在此情况下比较的是字符串的内容
3. hashCode()方法:哈希码的计算与应用
hashCode()方法步骤与实现:
- 返回哈希码:"hashCode()"方法返回一个整型数字,它是对象的哈希码,每个对象的哈希码通常是唯一的,但并非必须唯一。
String s1 = new String("Hello"); System.out.println(s1.hashCode()); // 输出:710818816,这是字符串"Hello"对应的哈希码
- 在集合中的应用:在Java集合框架中,如HashMap或HashSet,hashCode()方法与equals()方法共同决定了对象在哈希表中的存储位置以及查找过程。如果两个对象equals()相等,则它们的hashCode()也应相等,这有助于提高哈希表的操作性能。
总结与注意事项:
- 使用"=="时要区分基本类型和引用类型,前者比较值,后者比较引用地址。
- 对于自定义类,若需基于对象内容进行比较,务必重写equals()方法,并遵循自反性、对称性、传递性和一致性原则。
- 当重写equals()方法时,应同时重写hashCode()方法,以确保当equals()相等时,hashCode()也相等,反之亦然,防止在哈希表操作中出现意外行为。
class CustomClass {
private String value;
public CustomClass(String value) {
this.value = value;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null || getClass() != obj.getClass())
return false;
CustomClass that = (CustomClass) obj;
return Objects.equals(value, that.value);
}
@Override
public int hashCode() {
return Objects.hash(value);
}
}
以上代码示例展示了如何在一个自定义类CustomClass
中正确地重写equals()和hashCode()方法,以满足哈希表操作的要求。