First of all, I want to make it clear that I would never use a HashMap to do things that require some kind of order in the data structure and that this question is motivated by my curiosity about the inner details of Java HashMap implementation.
You can read in the java documentation on Object
about the Object
method hashCode
.
I understand from there that hashCode
implementation for classes such as String
and basic types wrappers (Integer
, Long
,...) is predictable once the value contained by the object is given. An example of that would be that calls to hashCode
for any String
object containing the value hello
should return always: 99162322
Having an algorithm that always insert into an empty Java HashMap where String
s are used as keys the same values in the same order. Then, the order of its elements at the end should be always the same, am I wrong?
Since the hash code for a concrete value is always the same, if there are not collisions the order should be the same. On the other hand, if there are collisions, I think (I don't know the facts) that the collisions resolutions should result in the same order for exactly the same input elements.
So, isn't it right that two HashMap objects with the same elements, inserted in the same order should be traversed (by an iterator) giving the same elements sequence?
As far as I know the order (assuming we call "order" the order of elements as returned by values()
iterator) of the elements in HashMap
are kept until map rehash is performed. We can influence on probability of that event by providing capacity
and/or loadFactor
to the constructor.
Nevertheless, we should never rely on this statement because the internal implementation of HashMap
is not a part of its public contract and is a subject to change in future.
I think you are asking "Is HashMap non-deterministic?". The answer is "probably not" (look at the source code of your favourite implementation to find out).
However, bear in mind that because the Java standard does not guarantee a particular order, the implementation is free to alter at any time (e.g. in newer JRE versions), giving a different (yet deterministic) result.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With