== 是语言中的基本运算符。运算符 == 测试两个对象引用变量是否引用了完全相同的对象实例。
equals () 是一个实例方法,它基本上由 java.lang.Object 类定义。方法 .equals() 测试要比较的两个对象是否相等,但它们不必是同一对象的完全相同的实例。
== 运算符始终为您提供相同的结果,但 equals () 方法根据您的实现(实现的逻辑)为您提供输出。正确覆盖 equals:覆盖 equals () 方法时的注意事项。
1.自反:对于任何非空引用 x,x.equals(x) 应该返回 true。
2。对称:对于任何非空引用 x 和 y,如果 x.equals(y) 为 true,则 y.equals(x) 必须返回 true。
3.传递:对于任何非空引用 x 、 y 和 z,如果 x.equals(y) 为真,y.equals(z) 为真,则 x.equals(z) 必须返回真。
4.一致:对于任何非空引用 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,而不会更改为 equals 比较提供的信息。
5.对于任何非空引用 x,x.equals (null) 必须返回 false。
注意:如果 o1.equals (o2) 为真,则 o1.hashcode () ==o2.hashcode (),但反过来可能是也可能不是。
示例:
整数 i = 新整数 (10);
整数 j = i;
在上面的代码中。 i == j 为真,因为 i 和 j 都指向同一个对象。
整数 i = 新整数 (10);
整数 j = 新整数(10);
在上面的代码中,i == j 是 FALSE,因为尽管它们的值都是 10,但它们是两个不同的对象。但 i.equals (j) 将返回 true。
使用自动装箱
整数 i = 10;
整数 j = 10;
布尔 b = (i == j);
System.out.println(b);
这将返回 TRUE,因为介于 -127 到 128 之间的整数会被池化,因此在这种情况下,它们都是相同的对象(JVM 不会创建新对象,而是会从池中检索它)。
String 类覆盖了 equals 方法,所以这里有一个 equals 与 == 的例子
字符串 s1 = 新字符串 ("abc");
String s2 = new String("abc");
注意:字符串是在字符串常量池中创建的,所以当我们创建类似 String s=”abc” 时,它将通过调用本地方法 intern () 检查池,如果它确实存在于现有池中没有找到任何字符串,那么它会创建一个新的,但是如果我们调用 new 操作符,那么它会创建一个新的字符串,而不管检查池是否存在。
public class StringEqualityTest {
public static void main(String []a){
String s1=new String("abc");
String s2=new String("abc");
System.out.print("s1.equals(s2) :"+s1.equals(s2)+" s1==s2 :");
System.out.println(s1==s2);
String s3="abc";
String s4="abc";
System.out.print("s3.equals(s4) :"+s1.equals(s2)+" s3==s4 :");
System.out.println(s3==s4);
}
}
输出:
s1.equals(s2):真 s1==s2:假
s3.equals(s4) :true s3==s4 :true