JavaMap中的TreeMap与HashMap

时间:2017-04-03 16:46:50

标签: java java-8 hashmap collision treemap

根据 Java 8 中的this链接,为了避免地图中的冲突(HashMap, LinkedHashMap, and ConcurrentHashMap),使用平衡树而不是{{ 1}}。

然后有什么区别:

  1. 两个(LinkedList和其他地图(TreeMap)都是使用自我平衡树实现的,因为最差情况下的可访问性相同。
  2. HashMap, LinkedHashMap, and ConcurrentHashMap的排序我可以实现如下:

    entry
  3. 除了排序和可访问性之外,public <K extends Comparable,V extends Comparable> LinkedHashMap<K,V> sortByKeys(LinkedHashMap<K,V> map){ List<K> keys = new LinkedList<K>(map.keySet()); Collections.sort(keys, (Comparator<? super K>) new Comparator<String>() { @Override public int compare(String first, String second) { return first.compareTo(second); } }); } 的其他属性是什么?

1 个答案:

答案 0 :(得分:0)

  1. 两者(TreeMap和其他地图(HashMap,LinkedHashMap和ConcurrentHashMap)都是使用自平衡树实现的,因为最坏情况下的可访问性是相同的。

    recalculate bucket index时jdk7和旧jdk size >= threshold中,每个存储桶作为linked list发送,但在jdk8中调整balancing-trees并将每个存储桶作为Red-Black Tree

    将这样的东西放到jdk7中的HasMap中只有一个桶。然后查找节点为O(N)

    class Foo{
       int hashCode(){
           return 0;
       }
    }
    Foo first=new Foo();
    Foo last=new Foo();
    map.put(first,"anything");
    map.put(last,"anything");
    map.get(last | first);// O(N)
    

    将这样的东西放到jdk8中的HasMap中只有一个桶,但密钥实现了Comparable。然后查找节点为O(log(N)),但如果i相同,查找节点将回退到O(N)。

    class Foo implements Comparable<Foo> {
        private int i;
    
        public Foo(int i) {
    
            this.i = i;
        }
    
        public int hashCode() {
            return 0;
        }
    
        @Override
        public int compareTo(Foo that) {
            return i - that.i;
        }
    }
    
    Foo first=new Foo(1);
    Foo last=new Foo(2);
    map.put(first,"anything");
    for(int i=2;i<threshold;i++)
      map.put(new Foo(i + 1), "anything");
    map.put(last,"anything");
    map.get(last | first);// O(log(N))
    
  2. 对LinkedHashMap进行排序,您可以创建一个TreeMap实例,因为Map.keySet()返回无序集而不是列表,因此您无法通过对其键进行排序来对地图进行排序。

    public <K extends Comparable<? super K>, V> Map<K, V> sortByKeys(Map<K, V> map) {
     return new TreeMap<K, V>(map);
    }