gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:05:28 25 4
gpt4 key购买 nike

/**
* 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com