HashMap为未find的键返回默认值?

有没有可能有一个HashMap返回一个默认值的所有密钥是不是在该集合中find?

没有Map的实现可以做到这一点,但是通过扩展HashMap实现你自己的实现将是微不足道的:

 public class DefaultHashMap<K,V> extends HashMap<K,V> { protected V defaultValue; public DefaultHashMap(V defaultValue) { this.defaultValue = defaultValue; } @Override public V get(Object k) { return containsKey(k) ? super.get(k) : defaultValue; } } 

在Java 8中,使用Map.getOrDefault 。 如果找不到匹配关键字,则返回键值和返回值。

如果你不喜欢重新发明轮子,使用Commons的DefaultedMap ,

 Map<String, String> map = new DefaultedMap<>("[NO ENTRY FOUND]"); String surname = map.get("Surname"); // surname == "[NO ENTRY FOUND]" 

如果您不负责创build地图,也可以传入现有的地图。

Java 8为Map接口引入了一个不错的computeIfAbsent默认方法,它存储了懒计算值,所以不会中断地图合同:

 Map<Key, Graph> map = new HashMap<>(); map.computeIfAbsent(aKey, key -> createExpensiveGraph(key)); 

原产地: http : //blog.javabien.net/2014/02/20/loadingcache-in-java-8-without-guava/

免责声明:这个答案与OP所要求的完全不一致,但是在某些情况下,如果密码数量有限,不同值的caching将会有利可图,在某些情况下可能会很方便。 它不应该使用相反的情况下,大量的键和相同的默认值,这将不必要地浪费内存。

您可以简单地创build一个inheritanceHashMap并添加getDefault方法的新类。 这是一个示例代码:

 public class DefaultHashMap<K,V> extends HashMap<K,V> { public V getDefault(K key, V defaultValue) { if (containsKey(key)) { return get(key); } return defaultValue; } } 

我认为你不应该在你的实现中重写get(K key)方法,因为Ed Staub在他的评论中指定的原因,因为你将打破Map接口的合约 (这可能会导致一些难以发现错误)。

难道你不能只是创build一个静态方法,完全是这样吗?

 private static <K, V> V getOrDefault(Map<K,V> map, K key, V defaultValue) { return map.containsKey(key) ? map.get(key) : defaultValue; } 

它默认是这样做的。 它返回null

不是直接的,但是你可以扩展这个类来修改它的get方法。 下面是一个可以使用的示例: http : //www.java2s.com/Code/Java/Collections-Data-Structure/ExtendedVersionofjavautilHashMapthatprovidesanextendedgetmethodaccpetingadefaultvalue.htm

 /** * Extension of TreeMap to provide default value getter/creator. * * NOTE: This class performs no null key or value checking. * * @author N David Brown * * @param <K> Key type * @param <V> Value type */ public abstract class Hash<K, V> extends TreeMap<K, V> { private static final long serialVersionUID = 1905150272531272505L; /** * Same as {@link #get(Object)} but first stores result of * {@link #create(Object)} under given key if key doesn't exist. * * @param k * @return */ public V getOrCreate(final K k) { V v = get(k); if (v == null) { v = create(k); put(k, v); } return v; } /** * Same as {@link #get(Object)} but returns specified default value * if key doesn't exist. Note that default value isn't automatically * stored under the given key. * * @param k * @param _default * @return */ public V getDefault(final K k, final V _default) { V v = get(k); return v == null ? _default : v; } /** * Creates a default value for the specified key. * * @param k * @return */ abstract protected V create(final K k); } 

用法示例:

 protected class HashList extends Hash<String, ArrayList<String>> { private static final long serialVersionUID = 6658900478219817746L; @Override public ArrayList<Short> create(Short key) { return new ArrayList<Short>(); } } final HashList haystack = new HashList(); final String needle = "hide and"; haystack.getOrCreate(needle).add("seek") System.out.println(haystack.get(needle).get(0)); 

我需要阅读从JSON服务器返回的结果,我不能保证字段将存在。 我使用从HashMap派生的类org.json.simple.JSONObject。 以下是我所采用的一些帮手function:

 public static String getString( final JSONObject response, final String key ) { return getString( response, key, "" ); } public static String getString( final JSONObject response, final String key, final String defVal ) { return response.containsKey( key ) ? (String)response.get( key ) : defVal; } public static long getLong( final JSONObject response, final String key ) { return getLong( response, key, 0 ); } public static long getLong( final JSONObject response, final String key, final long defVal ) { return response.containsKey( key ) ? (long)response.get( key ) : defVal; } public static float getFloat( final JSONObject response, final String key ) { return getFloat( response, key, 0.0f ); } public static float getFloat( final JSONObject response, final String key, final float defVal ) { return response.containsKey( key ) ? (float)response.get( key ) : defVal; } public static List<JSONObject> getList( final JSONObject response, final String key ) { return getList( response, key, new ArrayList<JSONObject>() ); } public static List<JSONObject> getList( final JSONObject response, final String key, final List<JSONObject> defVal ) { try { return response.containsKey( key ) ? (List<JSONObject>) response.get( key ) : defVal; } catch( ClassCastException e ) { return defVal; } }