java - 为什么我们有不可变的空映射?

标签 java collections map immutability

/**
 * Returns the empty map (immutable).  This map is serializable.
 *
 * <p>This example illustrates the type-safe way to obtain an empty set:
 * <pre>
 *     Map&lt;String, Date&gt; s = Collections.emptyMap();
 * </pre>
 * Implementation note:  Implementations of this method need not
 * create a separate <tt>Map</tt> object for each call.   Using this
 * method is likely to have comparable cost to using the like-named
 * field.  (Unlike this method, the field does not provide type safety.)
 *
 * @see #EMPTY_MAP
 * @since 1.5
 */
@SuppressWarnings("unchecked")
public static final <K,V> Map<K,V> emptyMap() {
    return (Map<K,V>) EMPTY_MAP;
}

上述函数返回一个不可变的空映射。

public static final Map EMPTY_MAP = new EmptyMap<>();

EmptyMap类如下

/**
 * @serial include
 */
private static class EmptyMap<K,V>
    extends AbstractMap<K,V>
    implements Serializable
{
    private static final long serialVersionUID = 6428348081105594320L;

    public int size()                          {return 0;}
    public boolean isEmpty()                   {return true;}
    public boolean containsKey(Object key)     {return false;}
    public boolean containsValue(Object value) {return false;}
    public V get(Object key)                   {return null;}
    public Set<K> keySet()                     {return emptySet();}
    public Collection<V> values()              {return emptySet();}
    public Set<Map.Entry<K,V>> entrySet()      {return emptySet();}

    public boolean equals(Object o) {
        return (o instanceof Map) && ((Map<?,?>)o).isEmpty();
    }

    public int hashCode()                      {return 0;}

    // Preserves singleton property
    private Object readResolve() {
        return EMPTY_MAP;
    }
}

这样的类和实用方法有什么用?我试过了

Map myMap = Collections.emptyMap();
myMap.put("Name","John");

我得到 Exception in thread "main"java.lang.UnsupportedOperationException 因为集合是不可变的不支持修改。那么这样的数据结构有什么用呢?

最佳答案

What is the use of such Class and utility method?

如果您要返回一个 Map 结果,它通常是不可变的...例如,您可以创建一个不可变的映射来包装您自己的“真实”数据,而不是让要么创建一个完整的副本,要么相信调用者不会改变它。

此外,如果您要返回一个空的 Map 结果,则不必每次都创建一个新对象会很方便 - 每个空 map 都等同于其他所有空 map ,因此使用单个实例很好。

关于java - 为什么我们有不可变的空映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18012465/

相关文章:

C++映射问题

c# - 使用 Linq 同时查询两个集合

c# - 如何使用 fluent nhibernate 创建引用表

c++ - 如何在迭代时从 map 中删除?

java - 在列中布置字符串集合

C# 访问器和集合

android - 如何在用户端下载 osmdroid tiles?

java - Lambda 表达式和嵌套数组

java - web.xml 在启动时将类加载到上下文中

java - postgresql存储过程中的结果集就像java一样