【问题标题】:Is Collections.unmodifiableMap performance critical?Collections.unmodifiableMap 性能是否重要?
【发布时间】:2015-03-20 08:55:50
【问题描述】:

我有一个hashmap<String, String>,其中包含大约一千个条目。 现在我必须以不能在课堂外修改的方式公开它。所以我写了像

public static Map<String, String> getResponseCodeSource()
{
    return Collections.unmodifiableMap(codeMsgMap); 
}

这个方法被非常频繁地调用。我的问题是
1。这会导致性能问题吗?
2.方法 (unmodifiableMap) 是否在 Map 上进行迭代,或者这将以 O(constant) 复杂性执行其活动?

【问题讨论】:

    标签: java collections hashmap


    【解决方案1】:

    这是一个非常精简的实现:

    public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m) {
        return new UnmodifiableMap<>(m);
    }
    

    和构造函数代码:

    UnmodifiableMap(Map<? extends K, ? extends V> m) {
        if (m==null)
            throw new NullPointerException();
        this.m = m;
    }
    

    如您所见,复杂度为 O(1)。

    【讨论】:

      【解决方案2】:

      从Collections.unmodifiableMap(Map) 返回的Map 将是真正底层地图的精简代理,其中一些方法被禁用(put 等)。没有理由期望它获取底层地图的副本。

      返回:指定地图的不可修改的视图。

      但请记住,不可修改的地图只是基础地图的视图,因此基础地图的更改将反映在不可修改的地图中。因此,这样做是安全的:

      static final Map<String,String> codeMsgMap = new HashMap<>();
      // Changes in the above map will be reflected here.
      static final Map<String,String> unmodifiableCodeMsgMap = Collections.unmodifiableMap(codeMsgMap);
      
      public static Map<String, String> getResponseCodeSource() {
          return unmodifiableCodeMsgMap;
      }
      

      关于复杂性问题Sergey Pauk 很好地涵盖了这一点。

      【讨论】:

      • @OldCurmundgeon,谢谢回复。所以我可以根据需要多次使用相同的功能而不会影响任何性能?我正在寻找 ard 1 小时的“unmodifiableMap”内部实现,如果您能给我任何相同的参考,那将有很大帮助。这也将帮助其他读者
      • @user811602 - 如果您必须多次调用它,请这样做。请记住,您可以调用一次并多次分发同一张地图。不可修改的版本会随着地图的变化而变化。这就是视图。
      • thx OldCurmudgeon,我已经根据你的建议改变了我的实现
      • 我会说这个答案太宽泛了,因为它涵盖了一些问题之外的方面。关于什么是Collections.unmodifiableMap() 复杂性的问题非常具体
      • @SergeyPauk - 问题最初只询问性能 - 在我发布答案后,它被编辑为包含复杂性问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-18
      • 1970-01-01
      • 1970-01-01
      • 2015-05-15
      • 1970-01-01
      • 2020-12-27
      • 1970-01-01
      相关资源
      最近更新 更多