Understanding the Difference Between `==` and `equals()` in Java
Nikhil Soman Sahu
Posted on May 12, 2024
In Java, the ==
operator and the equals()
method are both used for comparing objects, but they have different behaviors and use cases. Understanding the difference between these two is crucial for writing correct and efficient code, especially when dealing with object comparisons.
The ==
Operator
The ==
operator is used to compare two values or object references for equality. When used with primitive data types like int
, double
, boolean
, etc., it compares the actual values stored in those variables. However, when used with object references, the ==
operator compares the memory addresses of the objects, not their actual content or state.
Here's an example:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1 == str2); // Output: true
System.out.println(str1 == str3); // Output: false
In the above example, str1
and str2
reference the same String object in the String pool, so str1 == str2
evaluates to true
. However, str3
is a new String object created in the heap memory, so str1 == str3
evaluates to false
even though the content of the strings is the same.
The equals()
Method
The equals()
method is defined in the Object
class and can be overridden by subclasses to provide their own implementation of equality comparison. By default, the equals()
method in the Object
class performs the same reference comparison as the ==
operator. However, classes like String
, Integer
, and other wrapper classes override the equals()
method to compare the actual content or state of the objects.
Here's an example using the String
class:
String str1 = "Hello";
String str2 = "Hello";
String str3 = new String("Hello");
System.out.println(str1.equals(str2)); // Output: true
System.out.println(str1.equals(str3)); // Output: true
In this case, both str1.equals(str2)
and str1.equals(str3)
evaluate to true
because the equals()
method in the String
class compares the character sequences of the strings, not their references.
When to Use ==
and equals()
As a general rule, you should use the ==
operator for comparing primitive data types and the equals()
method for comparing objects, unless you specifically want to compare object references instead of their content.
It's important to note that when you create your own classes, the equals()
method from the Object
class will perform a reference comparison, just like the ==
operator. If you want to implement a custom equality comparison for your class, you should override the equals()
method and provide your own implementation.
Here's an example of overriding the equals()
method in a custom class:
class Person {
private String name;
private int age;
// Constructor, getters, and setters
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null || getClass() != obj.getClass()) {
return false;
}
Person other = (Person) obj;
return name.equals(other.name) && age == other.age;
}
}
In this example, the equals()
method is overridden to compare the name
and age
fields of Person
objects. Two Person
objects are considered equal if their name
strings are equal (using the String
class's equals()
method) and their age
values are the same.
Conclusion
The ==
operator and the equals()
method serve different purposes in Java. The ==
operator compares the memory addresses (references) of objects, while the equals()
method compares the actual content or state of objects (when overridden appropriately). When working with objects, it's generally recommended to use the equals()
method unless you specifically want to compare object references. Understanding this distinction is crucial for writing correct and efficient code, especially when dealing with object comparisons in Java.
Posted on May 12, 2024
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.