-3

私はアプローチ1で初期化しようとしています:

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

アプローチ 2 :

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

最初のアプローチではハッシュコードを印刷するとゼロが印刷されますが、2番目のアプローチではハッシュコードが印刷されます。初期化後、ハッシュコードが返されます。

最初のケースの HashCode がゼロを出力したのに、2 番目のケースでは出力されなかったのはなぜですか?

4

5 に答える 5

4

とが同じ場合のみ、HashCodeは 0 になります。Keyvalue

これは、次のように、HashMap 内の Entry のハッシュコード実装が原因で発生しています。

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

アプローチ 2 :

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アプローチ 1 で使用したように、初期化での使用は、何もありません。

フィールドを変数に割り当て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

アプローチ 3 をお勧めします。

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

そうすれば、HashMap結局 a を使用しないことにした場合でも、変更する必要があるのは 1 つだけです。

于 2013-08-02T08:32:15.830 に答える
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

以下のコードの 1 行目は、2 行目でオーバーライドしているため、冗長です。

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 に答える