Java Map
Java Collection Interfaces Overview
Interface - Map / Set
API
MapV put(K key, V value)V get(Object key)V remove(K key)boolean containsKey(Object key)- get view
Set<Map.Entry<K, V>> entrySet()Set<K> keySet()Collection<V> values()
boolean containsValue(V value)-void clear()int size()boolean isEmpty()
Setboolean add(E e)boolean remvoe(Object o)boolean contains(Object o)void clear()int size()boolean isEmpty()
Implementation Classes
- HashSet
- stores its elements in a hashtable
- doesn't not gurantee the order of iteration
- TreeSet
- stores its elements in a red-black tree(balanced binary search tree)
- gurantee the order of iteration (inorder traversal)
- LinkedHashSet
- It is a HashSet and also a LinkedList.
Class - HashMap / HashSet
HashMapandHashtableare likeArrayListandVector.HashMapallows one null key.VectorandHashtableoperations are synchronized.
HashSetis backed up by aHashMapinstance.- Data Storage -
array+linkedlist- maintain array of entries
Node<K, V>[] arrayArrayList<Node<K, V>> arrayJava supports better.- each entry is actually a single linked list(handle collision) and contains the (key, value) pairs
- maintain array of entries
- Distribution - hashcode()
- Java1.8的hashmap的hashcode:(h = k.hashCode()) ^ (h >>> 16)
- Capacity Expansion
- check load factor if exceeds 0.75 and double the size
- rehash
- Access key (get / put) process
- hash -
int hash = hashCode(key) - index -
int index = hash % table.length() - iterate the bucket
- check if the key has already existed
- NO -> add a ney Entry node
- YES -> update the value of the Entry
- hash -
Time Complexity
Operation | Average | **Worst**
----|----|----
search: containsKey/get | O(1)O(1)O(1) | **O(n)O(n)O(n)**
insert/update: put | O(1)O(1)O(1) | **O(n)O(n)O(n)**
delete: remove| O(1)O(1)O(1) | **O(n)O(n)O(n)**
Check key
==- determine if two primitive type has the same type
- determine if two reference are pointed to the same object
.hashCode().equals()
Contract between equals() and hashCode()
- true
equals=> samehashCode - reduce collesion as much as you can.
Override equals(), hashCode()
public class Element {
int x;
int y;
int sum;
...
@Override
public boolean equals(Object obj) {
if (this == obj){
return ture;
}
if (!(obj instanceof Element)) {
return false;
}
Element other = (Element) obj;
return this.x == other.x && this.y == other.y && this.sum == other.sum;
}
@Override
public int hashCode(){
return this.x * 31 * 31 + this.y * 31 + this.sum;
}
}
hashCode Design
return x * 31 + y;
return hashNumber & 0x7fffffff;
- 需要取绝对值,位运算计算效率最快。
- 10 % 3 = -1,会影响后续取index
- pair设计hashcode,当交换Pair(A, B)得到Pair(B, A),应该得到同样的hashcode
Efficient way of accessing the HashMap
Laioffer Practice Class 13
- count the occurence
containsKey -> get // two timesInteger sc = hm.get("snap") // one timegetOrDefault // one time
- remove when traverse
for (Map.Entry<String, Integer> entry : map.entrySet())NOT RECOMMENDEDIterator<Map.Entry<String, Integer>> iter = map.entrySet().iterator();andwhile (iter.hasNext())
Class - TreeMap / TreeSet
- Red-Black tree Implementations
- Guaranteed O(log(n)) time cost for
containsKey,get,put,remove - in Java: TreeMap/TreeSet
- implements
NavigableMap- Methods
lowerEntry,floorEntry,ceilingEntry, andhigherEntryreturnMap.Entryobjects associated with keys respectively less than, less than or equal, greater than or equal, and greater than a given key, returningnullif there is no such key
- Methods