HashMap return by Maps.newHashMap vs new HashMap

2022-09-02 11:49:33

我是第一次尝试番石榴,我发现它真的很棒。

我正在Spring jdbc模板上执行一些参数化的检索查询。DAO () 中的方法如下所示。这里没问题。AbstractDataAccessObject

public Map<String,Object> getResultAsMap(String sql, Map<String,Object> parameters) {
    try {
        return jdbcTemplate.queryForMap(sql, parameters);
    } catch (EmptyResultDataAccessException e) {
        //Ignore if no data found for this query
        logger.error(e.getMessage(), e);

    }
    return null;
}

问题是:

当我调用此方法时使用

getResultAsMap(query, new HashMap<String,Object>(ImmutableMap.of("gciList",gciList)));

它工作得很好。

但是当我这样做时

getResultAsMap(query, Maps.newHashMap(ImmutableMap.of("gciList",gciList)));

编译器不高兴说

The method getResultAsMap(String, Map<String,Object>) in the type AbstractDataAccessObject is not applicable for the arguments (String, HashMap<String,List<String>>)

我是否做错了什么,或者这可能是此投诉的原因?


答案 1

这是类型推断失败。 是一种静态参数化方法。它允许您使用Maps.newHashMap

Map<String,Integer> map = Maps.newHashMap()

而不是

Map<String,Integer> map = new HashMap<String,Integer>()

省去你不必打字两次。在 Java 7 中,菱形运算符允许您使用<String,Integer>

Map<String,Integer> map = new HashMap<>()

所以这个方法是多余的。

要回答您的问题,只需使用版本,因为类型推断不适用于方法参数。(您可以使用,但这违背了使用该方法的意义)new HashMapMaps.<String,Object>newHashMap()


答案 2

在此处添加延迟的答案:

在类型推断进入java之前,大部分好处都消失了。(耶)但我想知道任何性能差异。这是代码google.common.collect.maps

  /**
   * Creates a <i>mutable</i>, empty {@code HashMap} instance.
   *
   * <p><b>Note:</b> if mutability is not required, use {@link
   * ImmutableMap#of()} instead.
   *
   * <p><b>Note:</b> if {@code K} is an {@code enum} type, use {@link
   * #newEnumMap} instead.
   *
   * @return a new, empty {@code HashMap}
   */
  public static <K, V> HashMap<K, V> newHashMap() {
    return new HashMap<K, V>();
  }

它是相同的代码。