Web Development

How to override hashCode() in ideal way #Java

Following steps can be followed to override java hashCode() in ideal way

1. Store some constant nonzero value, say 17, in an int variable called result

2. For each significant field f in your object (each field taken into account by the equals method, that is), do the following:

a. Compute an int hash code c for the field:

i) If the field is a boolean, compute (f ? 0 : 1)
ii) If the field is a byte, char, short, or int, compute (int)f.
iii) If the field is long, compute (int)(f^(f>>>32)).
iv) If the field is a float compute Float.floatToIntBits(f).
v) If the field is a double, compute Double.doubleToLongBits(f), and then hash the resulting long as in step 2.a.iii.
vi) If the field is an object reference and this class’s equals method compares the field by recursively invoking equals, recursively invoke hashCode on the field. If a more complex comparison is required, compute a “canonical representation” for this field and invoke hashCode on the canonical representation. If the value of the field is null, return 0.
vii) If the field is an array, treat it as if each element were a separate field. That is, compute a hash code for each significant element by applying these rules recursively, and combine these values as described in step 2.b.

b. Combine the hash code c computed in step a into result as follows: result = 37 * result + c;

3. Return result

4. When you done writing the hashCode method, ask yourself whether equal instances have equal hash codes. If not, figure out why and fix the problem.

An example of hashCode():

    @Override
    public int hashCode(){
        int result = 17 + Float.floatToIntBits(re);
        result = 37 * result + Float.floatToIntBits(im);
        return  result;
    }
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s