Как правильно использовать 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  

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 3

Вам нужно использовать generics, как показано ниже:

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

Ответ 4

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

Ответ 5

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

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

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) и до того, как вы получите значение String, вы должны проверить store.containsStringValue(stringKey). Таким образом, вы никогда не получите значения неправильного типа.

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

Ответ 6

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

public class 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);


    }

}

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