HashMap<K, V> Class – Milestone 2 (80%)
•	Must implement the Map interface.
•	IMPORTANT NOTE: You must *NOT* mention the StringKey or Item classes from within the HashMap class code! Instead, use K or V appropriately.
•	The default CAPACITY is 11
•	The default LOAD_FACTOR is 0.75 (75%)
•	Contains a public property used to contain our entries: Entry<K,V>[]  Table 
•	Maintain an average complexity of 1! 
o	O(1) for Get(), Put(), Remove() 


HashMap()	Constructor, initializes Table to default size and load factor to default size
HashMap(int initialCapacity)	Constructor, initializes Table to size passed and assigns load factor to default value.
HashMap(int initialCapacity, double loadFactor) (5%)	Constructor, initializes Table to size passed and assigns load factor to value passed.
int Size()	Returns current size (note, this DOES NOT include placeholders) May be a smart property in C#.
bool IsEmpty()	Returns true if number of active entries in the array is 0.
void Clear()	Wipes out the array and all placeholders
int GetMatchingOrNext
AvailableBucket
(K key) Looks for the next available bucket based on the key passed, (Uses linear probing for collision handling, will return to the 0 index and continue searching if array length is reached). Note, if the key exists, it returns the bucket of the matching key. 
DO NOT LOOP THROUGH EVERY ENTRY FROM 0 TO ARRAY LENGTH IN THIS METHOD. Start from the starting bucket and use linear probing. It may end up going through many indexes, but in practice it will never do that because you have a threshold and there are many empty array spots.
V Get(K key) Returns the value located at the bucket found by hashing the key. This may return null if no matching key exists at this bucket. Note that this must handle collisions through linear probing. (use GetMatchingOrNextAvailableBucket()). 
DO NOT LOOP THROUGH EVERY ENTRY FROM 0 TO ARRAY LENGTH IN THIS METHOD.
V Put(K key, V value) Adds or Updates the bucket found by hashing the key.  If the bucket is empty insert a new entry with the passed key and value pair and return null.  If the bucket is not empty, override the old value in the bucket and return the old value. Note that this must handle collisions through linear probing. (use GetMatchingOrNextAvailableBucket()). When adding a new entry you must check if you require a rehash first. If the size + placeholders plus the new entry is equal to the threshold, then run rehash (see slides for more details).
DO NOT LOOP THROUGH EVERY ENTRY FROM 0 TO ARRAY LENGTH IN THIS METHOD.
V Remove(K key) Looks up the bucket based on the hashcode of the key. If a value exists at this bucket, set the value to null and increase your placeholder counter by one. If nothing exists at this bucket return null. Note that this must handle collisions through linear probing. (use GetMatchingOrNextAvailableBucket()).
DO NOT LOOP THROUGH EVERY ENTRY FROM 0 TO ARRAY LENGTH IN THIS METHOD.
private int ReSize() During a Rehash, a new array size must be calculated. We start by doubling the original size, adding 1 and finding the next prime number, see theory slides for this algorithm.
void ReHash() Occurs when the threshold (table length * load factor) is reached when adding a new Entry<K,V> to the Table.  Note that placeholders (removed values) count towards this total.  Example:  An array is size 10, the load factor is 0.3 (30%), therefore the threshold is 10*0.3 = 3.  After using Put() twice, the size goes up to 2. When using Remove() once, the size goes down to 1, but the placeholder count is increased to 1.  Now when we use Put() again, the threshold is reached, because 1 size + 1 placeholder is 2 and adding another entry will bring us up to 3, the threshold value. 

Perform a resize to find the new Table array length (see slides for details on resize and prime numbers). Migrate each entry from the old Table into the new table.  IMPORTANT NOTE: When migrating old table buckets, you must recalculate the new table buckets based on the new table length! This is the most common mistake.
IEnumerator<V> Values() Returns an IEnumerator compatible object containing only the values of each Entry in the Table (skip placeholders).
IEnumerator<K> Keys() Returns an IEnumerator compatible object containing only the keys of each Entry in the Table (skip placeholders).