【问题标题】:TreeMap: NavigableMap<K,V> subMap (), does it creates new map object?TreeMap: NavigableMap<K,V> subMap(),它会创建新的地图对象吗?
【发布时间】:2016-07-20 16:31:06
【问题描述】:
public NavigableMap<K,V> subMap(K fromKey,
                       boolean fromInclusive,
                       K toKey,
                       boolean toInclusive)

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

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

【问题讨论】:

  • 如果你认为它可能不会返回一个新的对象,你认为返回的对象会来自哪里?

标签: java treemap


【解决方案1】:

这个函数会创建新的地图对象吗?

是的,但是这个Map 对象没有映射中包含键和值的节点的新副本。如果您更改底层地图,它可以更改此地图。

【讨论】:

    【解决方案2】:

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

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

    编辑

    返回的映射将在尝试插入超出其范围的键或构造其端点位于其范围之外的子映射时抛出 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)作为原始地图的视图范围是一个很好的做法。

    【讨论】:

    • 可以添加新元素。
    • @daolincheng 尚未但仅在现有范围内。我更新了我的答案。你可以只替换元素。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-26
    相关资源
    最近更新 更多