Problem:
How to implement equals and hashcode using java.util.Objects? In the following example we show how to use these great, null-insensitive helper methods.
Solution:
Java 7 came with long time awaited utility class java.util.Objects. It contains static helper methods for working with objects. Here we show how to use equals and hash methods that are null-insensitive and ease implementation of equals and hashcode:
package com.farenda.java.util; import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Objects; public class ObjectsEqualsHashcode { public static class Player { public final String login; public Player(String login) { this.login = login; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Player player = (Player) o; // accepts nulls: return Objects.equals(login, player.login); } @Override public int hashCode() { // varargs and accepts nulls: return Objects.hash(login); } @Override public String toString() { return "Player{login='" + login + "'}"; } } public static void main(String[] args) { Collection<Player> players = Arrays.asList( new Player(null), new Player("player1"), new Player("player2")); System.out.println("Players: " + players); Collection<Player> sortedPlayers = new HashSet<>(players); System.out.println("In Set: " + sortedPlayers); // will not throw NullPointerException: sortedPlayers.contains(new Player(null)); } }
The code is straightforward. There are two important things:
- Objects.equals() and Objects.hash() accepts null.
- Objects.hash() accepts many objects.
And here’s the output of running the code:
Players: [Player{login='null'}, Player{login='player1'}, Player{login='player2'}] In Set: [Player{login='player2'}, Player{login='player1'}, Player{login='null'}]