3

Hi I'm just trying to understand some basics concepts like immutable in java programming. So I came across this coding.

public class IntImmutable {
  public static void main(String[] args) {
      Integer i = 10;
      System.out.println("value = "+i " hashCode = "+i.hashCode())
      i+=9;
      System.out.println("value = "+i " hashCode = "+i.hashCode())
  }
} 

Here I understand the code concept immutable but the value hashCode() returning is weird. Here is the output

value = 10 hashCode = 10
value = 19 hashCode = 19

If you notice the value and hashCode value is same, is it the expected behavior, My understand is hashCode would return some memory reference value.

1
  • 3
    It returns a memory reference for Object. That wouldn't be very useful behaviour for Integer. Commented Mar 21, 2015 at 15:07

3 Answers 3

4

The hashcode is fine, as it is returning a value consistent with the contract for hashCode.

Whenever it is invoked on the same object more than once during an execution of a Java application, the hashCode method must consistently return the same integer, provided no information used in equals comparisons on the object is modified. This integer need not remain consistent from one execution of an application to another execution of the same application.

Yes, that works. The reassignment of i creates a new Integer object so the hashcode can differ.

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

Making the hashcode just the integer value is an easy way to do this. If equals(anotherInteger) returns true, then the two integers have the same value. An easy way for the hashcodes to be the same value is for the hashcodes to be just those integers.

It is not required that if two objects are unequal according to the equals(java.lang.Object) method, then calling the hashCode method on each of the two objects must produce distinct integer results. However, the programmer should be aware that producing distinct integer results for unequal objects may improve the performance of hash tables.

This does happen, because the set of possible Integer values is the same as the set of possible hashcodes. The way the hash code is implemented for java.lang.Integer makes a trivial one-to-one mapping between the two sets.

i+=9 is assigning a new instance of java.lang.Integer to i than was before. First, i is unboxed to a primitive value of 10, 9 is added to that value to reach 19, and then it is re-boxed into a different Integer object. Run the following code:

Integer i = 10;
Integer j = 10;
System.out.println("value = " + i + " hashCode = " + i.hashCode());
System.out.println("value = " + j + " hashCode = " + j.hashCode());
i += 9;
System.out.println("value = " + i + " hashCode = " + i.hashCode());
System.out.println("value = " + j + " hashCode = " + j.hashCode());
Sign up to request clarification or add additional context in comments.

Comments

2

From the Integer.hashCode() documentation:

Returns: a hash code value for this object, equal to the primitive int value represented by this Integer object.

The hashCode() contract states that it must return an integer value such that:

If two objects are equal according to the equals(Object) method, then calling the hashCode method on each of the two objects must produce the same integer result.

As we can see, the implementation of Integer.hashCode() satisfies this condition.

5 Comments

I'm interested to know why this is. A hashmap containing many small integers might have performance issue as many of them might end up in the same bucket.
@hexafraction Not a java.util.HashMap because it takes care to disperse the hashcode bits.
@hexafraction However, the old Hashtable does suffer from this. People usually only stress its being synchronized as the primary issue, but actually many use cases would suffer more from the bad hashing.
@MarkoTopolnik, may I know the meaning behind it takes care to disperse the hashCode bits
HashMap doesn't directly use the hash code as supplied by the hashCode() method. It performs some bitwise transformations on it in order to make all the bits equally variable between different objects. This is to avoid problems with hashcodes of similar magnitude, such as in a set of smallish Integer instances.
0

In your case, the hashcode is calculated from the Integer class itself. For pure hashcode of a particular object use following code.

System.identityHashCode(obj)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.