What is the time complexity of java.util.HashMap class' keySet() method?
Getting the keyset is O(1)
and cheap. This is because HashMap.keyset()
returns the actual KeySet
object associated with the HashMap
.
The returned Set
is not a copy of the keys, but a wrapper for the actual HashMap
's state. Indeed, if you update the set you can actually change the HashMap
's state; e.g. calling clear()
on the set will clear the HashMap
!
... iterating through the returned
Set
will take obviouslyO(n)
time.
Actually that is not always true:
It is true for a
HashMap
is created usingnew HashMap<>()
. The worst case is to have allN
keys land in the same hash chain. However if the map has grown naturally, there will still beN
entries andO(N)
slots in the hash array. Thus iterating the entry set will involveO(N)
operations.It is false if the
HashMap
is created withnew HashMap<>(capacity)
and a singularly bad (too large)capacity
estimate. Then it will takeO(Cap) + O(N)
operations to iterate the entry set. If we treatCap
as a variable, that isO(max(Cap, N))
, which could be worse thanO(N)
.
There is an escape clause though. Since capacity
is an int
in the current HashMap
API, the upper bound for Cap
is 231. So for really large values of Cap
and N
, the complexity is O(N)
.
On the other hand, N
is limited by the amount of memory available and in practice you need a heap in the order of 238 bytes (256GBytes) for N
to exceed the largest possible Cap
value. And for a map that size, you would be better off using a hashtable implementation tuned for huge maps. Or not using an excessively large capacity estimate!
Surely it would be O(1). All that it is doing is returning a wrapper object on the HashMap.
If you are talking about walking over the keyset, then this is O(n), since each next() call is O(1), and this needs to be performed n times.
This should be doable in O(n) time... A hash map is usually implemented as a large bucket array, the bucket's size is (usually) directly proportional to the size of the hash map. In order to retrieve the key set, the bucket must be iterated through, and for each set item, the key must be retrieved (either through an intermediate collection or an iterator with direct access to the bucket)...
**EDIT: As others have pointed out, the actual keyset() method will run in O(1) time, however, iterating over the keyset or transferring it to a dedicated collection will be an O(n) operation. Not quite sure which one you are looking for **