El Noguer

Joaquim Perez i Noguer

hashCode()

Filed under: Ciència i tecnologia — Joaquim Perez Noguer at 12:53 pm on Dimecres, Juliol 31, 2019

En Java si es vol utilitzar una classe i Collections (Map, Set, …) cal definir els mètodes equals() i hashCode().

class Node<K, V> {

        private K key;
        private V value;
        private Node<K, V> next;

@Override
public int hashCode() {
      int result = key != null ? key.hashCode() : 0;
      result = 31 * result + (value != null ? value.hashCode() : 0);
      result = 31 * result + (next != null ? next.hashCode() : 0);
      return result;
}
@Override
public boolean equals(Object x) {
    if (x==null) return false;
    if (x.getClass() != this.getClass()) return false;
    Node<K,V> other= (Node<K,V>)x;
    if (other.key!=null && this.key==null) return false;
    if (other.value!=null && this.value==null) return false;
    return this.key.equals(other.key) && this.value.equals(other.value);
}
}

Sempre s’ha de complir que

  • si A.equals(B) => B.equals(A)
  • si A.equals(B) => A.hashCode() == B.hashCode()

Però en canvi no cal que

  • A.hashCode() == B.hashCode() => A.equals(B)

Per tant public int hashCode() { return 1; } també seria correcte tot i que molt ineficient !

Una altra solució és utilitzar les eines que proporcionen els IDE.

I encara una altra solució és utilitzar les biblioteques d’Apache o Lombock:

http://commons.apache.org/proper/commons-lang/javadocs/api-3.9/org/apache/commons/lang3/builder/HashCodeBuilder.html

https://projectlombok.org/features/Data

import lombok.AccessLevel;
import lombok.Setter;
import lombok.Data;
import lombok.ToString;

@Data 
public class DataExample {
  private final String name;
  @Setter(AccessLevel.PACKAGE) private int age;
  private double score;
  private String[] tags;
  
}



No Comments »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>