Reputation: 5655
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
.
Upvotes: 3
Views: 7261
Reputation: 363
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)
Upvotes: 0
Reputation: 9049
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 thehashCode
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.
Upvotes: 2
Reputation: 41281
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());
Upvotes: 4