I understand the basics of how a HashMap works - hm.put(obj) finds the correct bucket to place the object into, based on the obj.hashCode value. Then within that bucket if
A hash table does not need to search every bucket, just like you don't need to search every shelf on the library, because you can look up it's location in the index cards, and you don't need to search every card in the index because they are sorted... (not sure if that helps as I'm not sure if people still go to libraries or if they still have index cards)
Here is my two cent, friend. Think of a HashMap the way you think of an array. In fact, it is an array. If I give you index 11, you don't have to iterate through the array to find the object at index 11. You simply go there directly. That's how a HashMap works: the trick is to make the index the same as the value -- essentially.
So that is where a hashcode comes in. Let's look at the trivial case where your hash function is a unit multiplier (i.e. 1). Then if you have the values 0 to 99 and you want to store them in an array, then they will be stored at indices 0 to 99 respectively. So that a put and a get is clearly O(1) since getting and putting things in an array is O(1). Now let's imagine a less trivial hash function, say, y = x+2. So in this case the values 0 to 99 will be stored at indices 2 to 101. Here given a value, say 11, you must compute the hash to find it or put it (the hash being 11+2 =13). So okay, the hash function is doing some work to calculate the correct index given the value (in our case y = x+2= 11+2=13). But the amount of effort that goes into that work has nothing to do with how many data points you have. If I need to put 999 or 123, the amount of work for a single put or get is still the same: y= x+2: I only have to add two each time I do a put or a get: that's constant work.
Your confusion may be that you want to put n values at once. Well in that case each put is still constant c
. But c
multiplied by n is c*n
=O(n). So the n has nothing to do with the put itself, but rather that you are making n puts all at once. I hope this explanation helps.
Think of it this way: when you call get(key)
, the hashcode of the key is calculated and from this the one bucket among hundreds is pointed to in a single (set of) operation(s), i.e. you don't have to search through all 100 to arrive at the right bucket (in which case that would be a linear operation)