深入理解 Java 中 == 运算符和 equals() 方法的区别,包括基本类型与引用类型的比较机制,以及 String、Integer 类中 equals 方法的重写实现。

equals方法和==的区别
2 mins
383 words
Loading views

== 运算符h2

  • 如果判断基本类型,判断的是是否相等
  • 如果判断引用类型,判断的是地址是否相等,即判断是不是同一个对象

equals 方法h2

equals 是 Object 类中的方法,特点如下:

  • 只能判断引用类型
  • 默认判断的是地址是否相等,子类中往往重写该方法,用于判断内容是否相等
  • Integer 类中重写的 equals 方法,判断的是值是否相等
  • String 类中的 equals 方法判断的是字符串是否匹配(相等)

对比总结h2

比较方式基本类型引用类型
==比较值比较地址
equals不适用默认比较地址,可重写为比较内容

代码示例h2

public class EqualsDemo {
public static void main(String[] args) {
// 基本类型比较
int a = 10;
int b = 10;
System.out.println(a == b); // true,值相等
// 引用类型比较
String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false,地址不同
System.out.println(s1.equals(s2)); // true,内容相同
// Integer 比较
Integer i1 = new Integer(100);
Integer i2 = new Integer(100);
System.out.println(i1 == i2); // false,地址不同
System.out.println(i1.equals(i2)); // true,值相同
}
}

源码分析h2

String 类中重写的 equals 方法h3

public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}

Integer 类中重写的 equals 方法h3

public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}

评论