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());