J'ai des objets personnalisés dont les propriétés incluent des entiers (par exemple Integer num1 et Integer num2) qui peuvent être null.

Pour la fonction égale, je détermine si 2 de mes objets personnalisés sont égaux en faisant return num1 == customObj.num1 && num2 == customObj.num2. Cela fonctionne b / c null == null est true en Java.

Donc je me demandais si dans la fonction de hashcode de mon objet il serait correct de faire return Objects.hash(num1, num2)?

Je ne sais pas si je peux passer des objets null à Objects.hash(...) et si cela gâcherait le hashcode d'une manière ou d'une autre ou si j'obtiendrais un NullPointerException.

-3
14wml 28 nov. 2017 à 07:38

3 réponses

Meilleure réponse

Vous pouvez utiliser Objects#hashcode

Comme mentionné dans la documentation Objects # hashcode uniquement générer hash code pour un argument non nul et 0 si l'argument est null. Finalement, vous n'obtiendrez jamais NullPointerException.

Renvoie le code de hachage d'un argument non nul et 0 pour un argument nul.


Si vous avez plusieurs champs, vous pouvez utiliser sa version surchargée Objects#hash(Object... values) Selon docs

Génère un code de hachage pour une séquence de valeurs d'entrée. Le code de hachage est généré comme si toutes les valeurs d'entrée étaient placées dans un tableau, et ce tableau a été haché en appelant Arrays.hashCode (Object []).

2
Mehraj Malik 28 nov. 2017 à 15:51

Votre méthode de test d'égalité est rompue.

Bien que cela fonctionne lorsque les deux objets Integer sont null, cela ne fonctionnera généralement pas lorsqu'ils ne sont pas nuls. Vous comparez les références des objets au lieu de leurs valeurs numériques.

Utilisez Objects.equals() pour effectuer un test de sécurité null à l'aide de la méthode equals() des objets. Pendant que vous y êtes, lisez le manuel de Objects.hashCode().

0
erickson 28 nov. 2017 à 05:12

Vous devez fouiller un peu dans la documentation pour trouver quel sera le comportement si l'une de ces références est nulle.

Objects.hash(Object...) dit:

Le code de hachage est généré comme si toutes les valeurs d'entrée étaient placées dans un tableau, et ce tableau a été haché en appelant Arrays.hashCode(Object[]).

{ {X0}} dit:

La valeur retournée par cette méthode est égale à la valeur qui serait retournée par Arrays.asList(a).hashCode()

Arrays.asList(Object[]) renvoie un List et List.hashCode() dit:

Le code de hachage d'une liste est défini comme étant le résultat du calcul suivant:

int hashCode = 1;
for (E e : list)
  hashCode = 31*hashCode + (e==null ? 0 : e.hashCode());

Ainsi, les éléments nuls seront traités de la même manière que les objets avec le code de hachage zéro.

Bien qu'il ait fallu un peu de fouille pour arriver à cette réponse, une stratégie beaucoup plus simple aurait été de simplement l'essayer - vous auriez pu obtenir votre réponse plus rapidement comme ça.

4
Andy Turner 28 nov. 2017 à 06:17
47524121