taylorialcom/ Fundamentals

Equals() versus ==

It is important to understand the difference between == and .equals() and when to use each.

Make sure you understand the concepts discussed in Primitives versus References before reading this page.

Comparing Primitives

int i = 3;
int j = 3;
if(i==j) {
  System.out.println("Both variables contain the same value.");
}

When testing the equality of two primitives we always use the equality operator (==).

Reference Types

Recall that a reference variable stores a memory address. The address is the memory location where the object to which the reference refers is located in memory.

Checking for null

String word;
if(word==null) {
  System.out.println("Reference is null.");
}

When we wish to determine if we have a null reference, we must use the equality operator because we need to see of the memory address stored in the reference is null. Calling a method on a null reference will cause a NullPointerException to be thrown at runtime, so it doesn't make sense to call .equals(null) since it will never return true. We will either get a NullPointerException or the method will return false.

Checking for Identity

Complex c1 = new Complex("2.0 + 3.2i");
Complex c2 = c1;
if(c1==c2) {
  System.out.println("The references refer to exactly the same object.");
}

When we wish to determine if two references both refer to the same object (said more causually: "The objects are identical"), we are interested in comparing the memory addresses stored in the references. As a result, we use the equality operator.

Checking for Equality

Complex c1 = new Complex("2.0 + 3.2i");
Complex c2 = new Complex("2.0 + 3.2i");
if(c1.equals(c2)) {
  System.out.println("The references refer to two equivalent objects.");
}

We call the .equals() when we wish to determine if two references refer to objects that are equivalent. Because we are calling a method, the class is responsible for defining what must be true in order for two objects to be considered equivalent. In the class of the Complex, we would expect the .equals() method to return true if and only if both objects had the same values for both the real and imaginary components.