Как правильно использовать HashMap?

HashMap savedStuff = new HashMap();
savedStuff.put("symbol", this.symbol); //this is a string
savedStuff.put("index", this.index); //this is an int

дает мне предупреждение:

HashMap is a raw type. References to generic type HashMap<K,V> should be parameterized  

6 ответов


Я не уверен, что вы пытаетесь сделать, но поскольку пример, который вы предоставили, использует жестко закодированные строки для индексации данных, похоже, вы знаете, какие данные вы хотите сгруппировать вместе. Если это так, то карта скорее всего не подойдет. Лучшим подходом было бы сделать класс из обычно сгруппированных данных:

public class SavedStuff {
  private int index;
  private String symbol;

  public SavedStuff(int index, String symbol) {
    this.index = index;
    this.symbol = symbol;
  }

  public int getIndex() {
    return index;
  }

  public String getSymbol() {
    return symbol;
  }
}

Это позволит вашему клиенту код:

SavedStuff savedStuff = ...
String symbol = savedStuff.getSymbol();

вместо этого:

Map<String, Object> savedStuff = ...
String symbol = savedStuff.get("symbol");

первый пример много менее хрупкий, потому что вы не индексируете данные со строковыми константами. Это также дает вам возможность добавлять поведение поверх сгруппированных данных, что делает ваш код более объектно-ориентированным.


HashMap<String, Object> savedStuff = new HashMap<String, Object>();

конечно, вам все равно придется быть осторожным, чтобы использовать правильный тип при извлечении элементов.


вам нужно использовать дженериков как показано ниже :

Map<String, Object> savedStuff = new HashMap<String, Object>();

С помощью HashMap<String, Object> вероятно, лучшее, что вы можете сделать, если вы настаиваете на гетерогенных значениях на одной карте-вам нужно будет бросить те делать что-нибудь полезное, когда вы их извлекаете (и как вы узнаете, какой тип их бросить to...?), но, по крайней мере, вы будете typesafe в отношении ключи.


вот другой подход:

вспомогательный класс, который содержит карту и предоставляет различные взгляды на это:

public class ValueStore {


    /**
     * Inner map to store values.
     */
    private final Map<String,Object> inner = new HashMap<String,Object>();

    /**
     * Returns true if the Value store contains a numeric value for this key.
     */
    public boolean containsIntValue(final String key){
        return this.inner.get(key) instanceof Integer;
    }


    /**
     * Returns true if the Value store contains a String value for this key.
     */
    public boolean containsStringValue(final String key){
        return this.inner.get(key) instanceof String;
    }

    /**
     * Returns the numeric value associated with this key.
     * @return -1 if no such value exists
     */
    public int getAsInt(final String key){
        final Object retrieved = this.inner.get(key);
        return retrieved instanceof Integer ? ((Integer) retrieved).intValue() : -1;
    }


    /**
     * Returns the String value associated with this key.
     * @return null if no such value exists
     */
    public String getAsString(final String key){
        final Object retrieved = this.inner.get(key);
        return retrieved instanceof String ? (String) retrieved : null;
    }

    /**
     * Store a string value.
     */
    public void putAsInt(final String key, final int value){
        this.inner.put(key, Integer.valueOf(value));
    }


    /**
     * Store an int value.
     */
    public void putAsString(final String key, final String value){
        this.inner.put(key, value);
    }

    /**
     * Main method for testing.
     */
    public static void main(final String[] args) {
        final ValueStore store = new ValueStore();
        final String intKey = "int1";
        final String stringKey = "string1";
        final int intValue = 123;
        final String stringValue = "str";

        store.putAsInt(intKey, intValue);
        store.putAsString(stringKey, stringValue);

        assertTrue(store.containsIntValue(intKey));
        assertTrue(store.containsStringValue(stringKey));
        assertFalse(store.containsIntValue(stringKey));
        assertFalse(store.containsStringValue(intKey));
        assertEquals(123, store.getAsInt(intKey));
        assertEquals(stringValue, store.getAsString(stringKey));
        assertNull(store.getAsString(intKey));
        assertEquals(-1, store.getAsInt(stringKey));
    }

}

прежде чем вы получите значение int, вы должны проверить значение store.containsIntValue(intKey) и прежде чем получить строковое значение, вы бы проверить store.containsStringValue(stringKey). Таким образом, вы никогда не получите значения неправильного типа.

(можно, конечно, расширить для поддержки других типов)


Это простой код для использования hashmap. Там я буду использовать ключ как целое число и значение как строковый тип. Карта очень полезна, когда наша функциональность работает на парах ключей и значений. Ниже приведен простой пример использования hashmap. Надеюсь, это очень полезно для всех.

открытый класс CreateHashMap {

public static void main(String[] args) {

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

/*
 * Associates the specified value with the specified key in 
   this map (optional operation). If the map previously 
   contained a mapping for the key, the old value is 
   replaced by the specified value
 */
    map.put(1,"ankush");
    map.put(2, "amit");
    map.put(3,"shivam");
    map.put(4,"ankit");
    map.put(5, "yogesh");

    //print hashmap
    System.out.println("HashMap = "+map);


}

}

ссылки : создание и использование карты