ConcurrentSkipListMap不能拥有不可比较的键,对吧?

时间:2018-05-11 17:28:48

标签: java collections

API文档中的这一部分对于TreeMap和ConcurrentSkipListMap都是相同的。

  

地图根据其键的自然顺序排序,或者按照   比较器在地图创建时提供,具体取决于哪个   使用构造函数。

在意识形态上,ConcurrentSkipListMap(是一个NavigableMap)应该像TreeMap一样进行排序(从而在内部维护顺序)。没有Comparable(如果我们在构造函数中没有指定特殊的Comparator),ConcurrentSkipListMap不能保持任何顺序。

但是与TreeMap不同,如果给出一个不可比较的键,ConcurrentSkipListMap不会抛出任何异常!这让我很困惑,为什么:

        TreeMap<ArrayList, Integer> m = new TreeMap<>();
        m.put(new ArrayList(), 6); // throws ClassCastException - ArrayList not Comparable

        ConcurrentSkipListMap<ArrayList, Integer> lst = new ConcurrentSkipListMap<>();
        lst.put(new ArrayList(), 6); // fine!

1 个答案:

答案 0 :(得分:0)

它不会在第一个键上抛出异常。如果添加第二个密钥,它会抛出异常。这只是因为ConcurrentSkipListMap没有特殊逻辑来验证第一个密钥是否具有可比性,但是为TreeMap添加了该密钥。我怀疑这只是JDK的疏忽。