-3

我正在尝试使用方法一进行初始化:

Map<String, String> mapInter = Collections.EMPTY_MAP;
mapInter = new HashMap<String, String>();
mapInter.put("one", "one");
System.out.println(mapInter.hashCode());        

方法二:

HashMap<String, String> myMap = new HashMap<String, String>(10);
myMap.put("key", "value");
System.out.println(myMap.hashCode());

在我打印哈希码的第一种方法中,它打印为零,但在第二种方法中,它打印哈希码。初始化后将返回哈希码。

为什么第一种情况下的 HashCode 打印为零,而第二种情况下没有?

4

5 回答 5

4

仅当两者和相同时,HashCode才会为 0 。Keyvalue

之所以会这样,是因为 HashMap 中的 Entry 的 hashcode 实现,如下:

public final int hashCode() 
{
  return (key==null   ? 0 : key.hashCode()) ^ (value==null ? 0 : value.hashCode());
}

它对^键和值的哈希码执行,如果两者相同,则始终返回 0。

在您的示例中,如果您更改,myMap.put("key", "key")则两个地图都将返回哈希码 0。

Map<String, String> mapInter = Collections.EMPTY_MAP;
mapInter = new HashMap<String, String>();
mapInter.put("one", "one");     
System.out.println(mapInter.hashCode());

方法二:

HashMap<String, String> myMap = new HashMap<String, String>(10);
myMap.put("key", "key");
System.out.println(myMap.hashCode());

输出:

0
0
于 2013-08-02T08:30:20.980 回答
2

初始化中的使用Collections.EMPTY_MAP,正如您在方法一中使用的那样,没什么

您将该EMPTY_MAP字段分配给一个变量,然后立即覆盖它。如果您根本不执行第一个任务,您的代码将是相同的,例如:

Map<String, String> mapInter;
mapInter = new HashMap<String, String>();
mapInter.put("one", "one"); 

或者

Map<String, String> mapInter = new HashMap<String, String>();
mapInter.put("one", "one");   

变量曾经拥有的值,与当前对象的哈希码无关。

于 2013-08-02T08:34:16.287 回答
0

Collections 类仅由操作或返回集合的静态方法组成。不适合您的Collections.EMPTY_MAP. 相当于调用下面的方法

/**
 * 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<>();

所以基本上它返回一个没有数据的地图。

于 2013-08-02T08:34:32.660 回答
0

我推荐方法三:

Map<String, String> map = new HashMap<>(10);
map.put("key", "value");

这样,如果您决定不使用 a HashMap,您只需要修改一件事。

于 2013-08-02T08:32:15.830 回答
0

以下代码中的第一行是多余的,因为您在第二行中覆盖了它。

Map<String, String> mapInter = Collections.EMPTY_MAP;
mapInter = new HashMap<String, String>();

上面的代码等于

Map<String, String> mapInter = null;
mapInter = new HashMap<String, String>();

这也等于

Map<String, String> mapInter = new HashMap<String, String>();
于 2013-08-02T08:33:37.257 回答