今天讲两个有意思的东西。
第一个就是我比较不熟悉的TreeMap
第二个是iterator 的两种类型。
TreeMap
特点:
1 . 返回的keySet()是有序的,这也要求,插入的Key, 要实现Comparable 接口
2 . put, get, containsKey, remove, floor, ceiling 的复杂度都是
O(log n)
所以和 HashMap 比较起来,这方面明显是劣势。HashMap可以尽量保证lookup time complexity: O(1), but treemap cannot
但是TreeMap 可以提供有序的keySet()
3 . TreeMap 是一个具体的类,实现了 SortedMap 这个接口
4 . TreeMap 生成的时候不需要指定一个initial size.
因为他是动态的。
HashMap reallocates its internals as the new one gets inserted while TreeMap does not reallocate nodes on adding new ones. Thus , the size of the TreeMap dynamically increases if needed , without shuffling the internals. So it is meaningless to set the initial size of the TreeMap .
reference:
http://javahungry.blogspot.com/2014/06/how-treemap-works-ten-treemap-java-interview-questions.html
Iterator:
用Iterator遍历的时候,如果同时修改这个set or list or...,经常会报错: CurrentModified Exception ....
这是因为这个类采用了 Fail fast policy
而对于 ConcurrentHashMap, 你可以这么做而不会报错,因为它采用了 Fail Safe policy. 所做的就是,将原数组拷贝一份。然后外界的所有插入删除操作,都在这个copied 数据上进行。而原数据结构,则用来遍历。最后,再将指针指向这个新的copy 出来的数据结构。
My code:
public static void main(String[] args) {
ConcurrentHashMap<String,String> premiumPhone = new ConcurrentHashMap<String,String>();
premiumPhone.put("Apple", "iPhone");
premiumPhone.put("HTC", "HTC one");
premiumPhone.put("Samsung","S5");
Iterator<String> iterator = premiumPhone.keySet().iterator();
while (iterator.hasNext())
{
System.out.println(premiumPhone.get(iterator.next()));
premiumPhone.put("Sony", "Xperia Z");
}
System.out.println("-----------------");
iterator = premiumPhone.keySet().iterator();
while (iterator.hasNext())
{
System.out.println(premiumPhone.get(iterator.next()));
}
}
Output:
iPhone
HTC one
S5
-----------------
Xperia Z
iPhone
HTC one
S5
这样子做的好处就是安全了。但是开销变大了,因为你需要拷贝一份数组。
reference:
http://javahungry.blogspot.com/2014/04/fail-fast-iterator-vs-fail-safe-iterator-difference-with-example-in-java.html
Anyway, Good luck, Richardo! -- 09/12/2016