【发布时间】:2017-08-28 15:22:45
【问题描述】:
根据 Java 8 中的this 链接,为了避免地图中的冲突 (HashMap, LinkedHashMap, and ConcurrentHashMap) 使用 平衡树 而不是 LinkedList 来实现。
那么有什么区别:
- (
TreeMap和其他地图 (HashMap, LinkedHashMap, and ConcurrentHashMap) 都是使用 self-balancing-trees 实现的,因为最坏情况下的可访问性是相同的。 -
entry的排序我可以实现如下: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); } }); }
除了排序和可访问性之外,TreeMap 的其他属性是什么?
【问题讨论】:
-
你的观点是什么?在 #1 中,您暗示没有区别,因为 worst case 是相同的。假设你总是有最坏的情况,那你就太悲观了。在 #2 中,您说您总是可以在需要时对键进行排序,但是排序很昂贵。
TreeMap总是被排序的,所以如果Map不断地被修改,并且你不断地需要按顺序排列的结果,就会有巨大的 性能差异。HashMap性能更好(假设有少量哈希函数)并且不需要键是可比较的。TreeMap如果要求键是有序的更好。 -
... 此外,
TreeMap可以为您提供给定键值的相邻键,无论键值是否在映射中。HashMap不能这样做。排序列表无法做到这一点,除非您在在浪费时间首先对列表进行排序之后执行二进制搜索。 -
问题是什么?
-
Java 8 将 HashMaps 更改为使用平衡树进行冲突这一事实纯粹是 性能提升,将性能从 O(n) 更改为O( log n) collissions。它没有任何功能意义/影响。您的整个问题似乎是基于对具有功能意义的更改的假设,并且被误导以至于问题毫无意义,因此所有的反对票。如果您对
HashMap与TreeMap有疑问,请提出问题,但这仍然与 Java 8 中实现的性能改进无关。 -
@RameshPapaganti 为什么你如此关注最坏情况?如果您确实有一个包含 100 多个键的映射(请记住,键是唯一的,不能相同)并且映射中的 每个 键具有完全相同的哈希码,那么您的哈希算法有缺陷,你应该修复它,而不是考虑
HashMapvsTreeMap。
标签: java java-8 hashmap collision treemap