TreeMap:NavigableMap <k,v> subMap(),它是否创建了新的地图对象?

时间:2016-07-20 16:31:07

标签: java treemap

public NavigableMap<K,V> subMap(K fromKey,
                       boolean fromInclusive,
                       K toKey,
                       boolean toInclusive)
  

从界面复制的描述:NavigableMap返回此地图部分的视图   其键的范围从fromKey到toKey。如果fromKey和toKey是   等于,除非fromInclusive和toInclusive,否则返回的地图为空   都是真的。返回的地图由此地图支持,因此更改   返回的地图会反映在此地图中,反之亦然。   返回的地图支持此地图的所有可选地图操作   支持。

这个函数是否创建了新的地图对象?什么存储在返回对象中?

2 个答案:

答案 0 :(得分:4)

  

此函数是否会创建新的地图对象?

是的,但是这个Map对象没有地图中包含键和值的节点的新副本。如果更改基础地图,则可以更改此地图。

答案 1 :(得分:1)

是的,它会创建一个新的地图实例,但新地图中的对象会引用旧地图中的对象。 因此,两个地图中呈现的对象的所有修改在两个地图上都是可见的,因为对象是相同的。

请注意,即使它是一个新的实例Map。它不是一个经典的全功能Map实例。您无法添加新元素,只需替换或删除subMap范围内的元素。

修改

  

返回的映射将在尝试在其范围之外插入键时抛出IllegalArgumentException,或者构造其端点位于其范围之外的子映射。

例如,在JDK 1.6的包静态类NavigableSubMap中:

public final V put(K key, V value) {
            if (!inRange(key))
                throw new IllegalArgumentException("key out of range");
            return m.put(key, value);
}


public final V remove(Object key) {
        return !inRange(key) ? null : m.remove(key);
}

考虑并将subMap用作一般的subCollection(例如subList)作为原始地图的视图范围限制,这是一个很好的做法。