Java中"=="运算符和equals()方法之间的区别

时间:2020-01-09 10:34:46  来源:igfitidea点击:

在Java初学者访谈中,Java中equals()方法与相等运算符" =="之间的区别经常被问到。由于equals()和==运算符都用于比较,因此有必要知道这两者之间的差异,以确保根据情况正确使用其中的一个。

Java中的等于运算符" =="

Java中的Equal运算符用于比较两个原始值或者对象,以测试比较的原始值或者对象是否相等。对于基本类型(如int,long,float)," =="运算符可以很好地工作并比较变量的值,但对于对象,相等运算符不比较对象引用而不是其值。

例如

int a = 7;
int b = 8;
if(a == b){
  System.out.println("Values are same");
}else {
  System.out.println("Values are not same");
}

这里比较存储在变量中的值,因为这些值不相等,因此if条件失败。

对于对象-if(obj1 == obj2)相等运算符将比较对象引用,即两个对象的存储位置而不是值。对于对象" ==",运算符仅在两个对象具有相同的引用(即指向相同的存储位置)时才返回true。

Java中的equals方法

equals方法在Java的Object类中定义,用于内容比较。 Object类中的默认实现使用相等运算符进行比较。 equals方法的默认实现必须重写才能确定自定义对象的相等性。在类中,我们将必须重写和实现equals方法,以便可以比较该类的两个实例以确定两个实例在逻辑上是否相等。

例如,如果雇员类具有字段id,firstName和lastName,则可以使用这些字段编写equals方法,该方法可以比较两个Employee对象是否相等。

@Override
public boolean equals(Object obj) {
  if (this == obj)
    return true;
  if (obj == null)
    return false;
  if (getClass() != obj.getClass())
    return false;
  Employee other = (Employee) obj;
  if (empId != other.empId)
    return false;
  if (firstName == null) {
    if (other.firstName != null)
      return false;
  } else if (!firstName.equals(other.firstName))
    return false;
  if (lastName == null) {
    if (other.lastName != null)
      return false;
  } else if (!lastName.equals(other.lastName))
    return false;
  return true;
}

好东西是Java中的包装器类(例如Integer,Float等)和String类会覆盖并提供equals方法的实现,因此我们无需为这些类执行此操作。

Java中equals()和" =="运算符之间的区别

由于我们对等价运算符和equals方法有很好的解释,因此让我们列出两者之间的区别

  • 等于运算符和equals方法之间的第一个区别是" =="是Java中的运算符,而equals是方法。

  • 相等运算符可用于比较基元和对象。 Equals方法只能与对象一起使用。

  • 当使用相等运算符比较两个对象时,相等运算符比较对象引用。覆盖时等于方法可以对两个对象进行内容比较。

使用" =="和等于的示例

public class ComparisonDemo {
  public static void main(String[] args) {
    String str1 = new String("Code");
    String str2 = new String("Code");
    
    System.out.println("str1 == str2 " + (str1 == str2));
    System.out.println("str1.equals(str2) " + (str1.equals(str2)));
  }
}

输出:

str1 == str2 false
str1.equals(str2) true

在代码中,有两个String对象str1和str2.
由于两个对象都有不同的引用,因此相等运算符将返回false。
两个String对象的内容相同,这就是为什么使用equals方法进行比较返回true的原因。

如果我们使用String文字而不是创建新的String对象,然后进行比较。请注意,在String文字的情况下,如果已经存在具有相同值的对象,则另一个文字也使用相同的引用。

public class ComparisonDemo {
  public static void main(String[] args) {
    String str1 = "Code";
    String str2 = "Code";
    
    System.out.println("str1 == str2 " + (str1 == str2));
    System.out.println("str1.equals(str2) " + (str1.equals(str2)));
  }
}

输出:

str1 == str2 true
str1.equals(str2) true

由于两个String文字具有相同的值,因此它们共享相同的引用,因此这就是" =="运算符也返回true的原因。