Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
495 views
in Technique[技术] by (71.8m points)

java - hashCode() for an array of objects for use in HashMap

I Have the following two classes and want to use Foo1 as keys in a HashMap. Two Foo1 objects are equal if their Foo2 objects are equal, and Foo2 objects are equal if their byte arrays satisfy Arrays.equals().

I am not quite sure what to do for the hashCode() method for Foo1. Do I just need to sum up the hashcodes from each of its Foo2 objects or is this inefficient?

public class Foo1 {

  Foo2[] foo2_array;

  @Override
  public boolean equals(Object Other) {

     for (int i = 0; i < foo2_array.length; i++) {

        if (!foo2_array[i].equals(other.foo2_array[i])
          return false;
     }

     return true;
   }

   @Override
   public int hashCode() {

      // what to here?
   }
}

public class Foo2 {

  byte[] values;

  @Override
  public boolean equals(Object other) {

      return Arrays.equals(values, other.values);
  }

  @Override
  public int hashCode() {

     return Arrays.hashCode(values);
  }
}
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

Your hashcode should use the same set of properties as equals for it not to break the contract.

Just use the Arrays.hashcode as done in Foo2

Also you dont have to loop through each element in your equals you can just use Arrays.equals

Foo2 equals can look like this similar to Foo1.equals

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Foo1 other = (Foo1) obj;
        if (!Arrays.equals(foo2_array, other.foo2_array))
            return false;
        return true;
    }

and hashcode similar to Foo1 hashcode

    @Override
    public int hashCode() {
        return Arrays.hashCode(foo2_array);
    }

Also while implementing equals do check for same reference and object validity for null.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.9k users

...