Data Structure TreeMap & Java Iterator Concurrency

今天讲两个有意思的东西。
第一个就是我比较不熟悉的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 premiumPhone = new ConcurrentHashMap();
        premiumPhone.put("Apple", "iPhone");
        premiumPhone.put("HTC", "HTC one");
        premiumPhone.put("Samsung","S5");
        
        Iterator 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

你可能感兴趣的:(Data Structure TreeMap & Java Iterator Concurrency)