==
和 equals
在 Java 中有着不同的作用和使用场景:
-
==
是一个操作符,用于比较两个对象的引用是否相同。如果两个对象引用同一个内存地址,则==
返回 true;否则返回 false。在比较基本数据类型时,==
比较的是它们的值是否相等。 -
equals
是一个方法,用于比较两个对象的内容是否相等。通常情况下,如果类没有重写equals
方法,则equals
和==
的作用是相同的,即比较对象的引用是否相同。但是,可以通过重写equals
方法来改变比较的方式,使其比较对象的内容而不是引用。在Object
类中,equals
的默认实现就是比较对象的引用。
举个例子:
String str1 = "hello";
String str2 = "hello";System.out.println(str1 == str2); // true,因为字符串常量池会确保相同的字符串只有一个实例
System.out.println(str1.equals(str2)); // true,因为它们的内容相同String str3 = new String("hello");
String str4 = new String("hello");System.out.println(str3 == str4); // false,因为它们是不同的对象实例
System.out.println(str3.equals(str4)); // true,因为它们的内容相同StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = new StringBuilder("hello");System.out.println(sb1 == sb2); // false,因为它们是不同的对象实例
System.out.println(sb1.equals(sb2)); // false,StringBuilder 类没有重写 equals 方法Integer num1 = 100;
Integer num2 = 100;System.out.println(num1 == num2); // true,因为对于 Integer 类型,-128 到 127 之间的值会被缓存
System.out.println(num1.equals(num2)); // true,因为它们的值相同Integer num3 = 200;
Integer num4 = 200;System.out.println(num3 == num4); // false,因为超出了缓存范围,会创建新的对象实例
System.out.println(num3.equals(num4)); // true,因为它们的值相同