69 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
| ---
 | |
| title: Checking for Equality
 | |
| ---
 | |
| 
 | |
| # Checking for Equality
 | |
| 
 | |
| In Java, there are two ways to check if two variables are the "same": `==` and `.equals()`. These two methods do not work the same, however.
 | |
| 
 | |
| ## The `==` Operator
 | |
| 
 | |
| The basic equality operation in Java, `==` as in `var1 == var2`, checks whether `var1` and `var2` point to the same *object reference*.
 | |
| That is, if `var1` is the same *instance* of a class in memory as `var2`, then `var1 == var2` is true.
 | |
| 
 | |
| However, if `var1` and `var2` were created as two separate instances of a class (i.e. with the `new` keyword), then `var1 == var2` will be false. Even if both objects happen to contain the exact same properties and values, the `==` comparison would not pass because they are not pointing to the same object in memory.
 | |
| 
 | |
| For primitive variable types, such as `int` and `double`, the `==` operator can always be used to check for equality, as their values are stored directly with the variable (rather than as a reference to another slot in memory).
 | |
| 
 | |
| ```java
 | |
| int var1 = 1;
 | |
| int var2 = 1;
 | |
| System.out.println(var1 == var2) // true
 | |
| 
 | |
| MyObject obj1 = new MyObject();
 | |
| MyObject obj2 = obj1;
 | |
| MyObject obj3 = new MyObject();
 | |
| 
 | |
| System.out.println(obj1 == obj2) // true
 | |
| System.out.println(obj1 == obj3) // false
 | |
| System.out.println(obj2 == obj3) // false
 | |
| ```
 | |
| 
 | |
| ## The `.equals()` Method
 | |
| 
 | |
| The built-in `Object` class in Java, which all other classes automatically extend, contains a number of helpful built-in methods. One such method is `equals()`, which takes another object as its argument and returns whether the two objects should be considered "equal" according to the relevant logic for that class.
 | |
| 
 | |
| The 'String' class is one of the most common examples of a class that overrides the 'equals()' method. When comparing two 'String's for equality, you need to use the 'equals()' method, as '==' won't work as you expect.
 | |
| 
 | |
| ```java
 | |
| String s1 = "Bob";
 | |
| String s2 = "ob";
 | |
| s2 = "B" + s2; //s2 now is also "Bob"
 | |
| System.out.println(s1 == s2); //false
 | |
| System.out.println(s1.equals(s2)); //true
 | |
| ```
 | |
| 
 | |
| When you create a new class in Java, you will often want to override the `equals()` method in order to provide a more meaningful way to compare two objects of the same class. How this method is implemented is completely up to the developer's judgement. 
 | |
| 
 | |
| For example, you may decide that two `Person`s should be considered "equal" if their `name` and `dateOfBirth` are the same. This logic would be implemented in your `Person` class's `equals()` method:
 | |
| 
 | |
| ```java
 | |
| public class Person {
 | |
|     public String name;
 | |
|     public Date dateOfBirth;
 | |
|     
 | |
|     public boolean equals(Person person) {
 | |
|         return this.name.equals(person.name) && this.dateOfBirth.equals(person.dateOfBirth);
 | |
|     }
 | |
| }
 | |
| ```
 | |
| 
 | |
| Most of the built-in classes in Java, as well as classes provided by popular libraries, will implement the `equals()` method in a meaningful way.
 | |
| 
 | |
| For example, the `java.util.Set` interface specifies that a `Set`'s `equals()` method will return true if "the specified object is also a set, the two sets have the same size, and every member of the specified set is contained in this set".
 | |
| 
 | |
| However, if a class does not override the default `equals()` implementation, the default implementation will apply, which simply uses the `==` operator to compare the two objects.
 | |
| 
 | |
| #### More Information:
 | |
| - [Oracle Java Docs : Equality Operators](https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.21)
 |