HashMap и int как ключ

Я пытаюсь создать HashMap, который будет иметь целое число как ключи и объекты как значения.

Моим синтаксисом является:

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

Однако возвращенная ошибка - Синтаксическая ошибка в токене "int", измерения, ожидаемые после этого токена - я не понимаю, почему я должен добавить измерение (т.е. сделать int в массив), так как мне нужно только сохраните цифру как клавишу.

Что я могу сделать?

Спасибо заранее!:)

Ответы

Ответ 1

Используйте Integer вместо этого.

HashMap<Integer, MyObject> myMap = new HashMap<Integer, MyObject>();

Java автоматически автоматически добавит ваши примитивные значения int к объектам Integer.

Подробнее о autoboxing из документации Oracle Java.

Ответ 2

Для всех, кто кодирует Java для устройств Android и заканчивается здесь: используйте SparseArray для лучшей производительности

private final SparseArray<myObject> myMap = new SparseArray<myObject>();

с этим вы можете использовать int вместо Integer, например

int newPos = 3;

myMap.put(newPos, newObject);
myMap.get(newPos);

Ответ 3

Вы можете попробовать использовать Trove http://trove.starlight-systems.com/
TIntObjectHashMap - это, вероятно, то, что вы ищете.

Ответ 4

Вы не можете использовать примитив, потому что HashMap использует объект внутри ключа. Таким образом, вы можете использовать только объект, который наследует объект Object (это любой объект).

Это функция put() в HashMap, и, как вы видите, она использует Object for K:

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key);
    int i = indexFor(hash, table.length);
    for (Entry<K,V> e = table[i]; e != null; e = e.next) {
        Object k;
        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
            V oldValue = e.value;
            e.value = value;
            e.recordAccess(this);
            return oldValue;
        }
    }

    modCount++;
    addEntry(hash, key, value, i);
    return null;
}

Выражение "k = e.key" должно быть понятным.

Я предлагаю использовать обертку типа Integer и autoboxing.

Ответ 5

Если вы код в Android, SparseArray, сопоставление целого с объектом.

Ответ 6

HashMap не разрешает примитивные типы данных в качестве аргументов. Он может принимать только объекты, поэтому

HashMap<int, myObject> myMap = new HashMap<int, myObject>();

не будет работать.

Вы должны изменить объявление на

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

даже если вы выполните следующие

myMap.put(2,myObject);

Примитивный тип данных автобоксирован объекту Integer.

8 (int) === boxing ===> 8 (Integer)

Здесь вы можете узнать больше о autoboxing http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

Ответ 7

использовать int как объект не как примитивный тип

HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

Ответ 8

Основная причина, заключающаяся в том, что HashMap не разрешает примитивные ключи, состоит в том, что HashMap разработан таким образом, что для сравнения ключей используется метод equals(), и метод можно вызывать только на объекте, а не на примитиве.

Таким образом, когда int является autoboxed Integer, Hashmap может вызывать метод equals() для объекта Integer.

Вот почему вы должны использовать Integer вместо int. Я имею в виду, что hashmap выдает ошибку при помещении int в качестве ключа (не знаю значения ошибки, которая была выбрана)

И если вы так думаете, вы можете сделать производительность карты быстрее, создав примитив как ключ, есть библиотека под названием FastUtil, которая содержит реализацию Map с типом типа в качестве ключа.

Из-за этого он намного быстрее, чем Hashmap

Ответ 9

Пожалуйста, используйте HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();

Ответ 10

Я не понимаю, почему я должен добавить измерение (т.е. сделать int в массив), так как мне нужно только сохранить цифру в качестве ключа.

Массив также является объектом, поэтому HashMap<int[], MyObject> является допустимой конструкцией, которая использует int массивы как ключи.

Компилятор не знает, чего вы хотите или что вам нужно, он просто видит правильную конструкцию языка и предупреждает, что ее отсутствие было полностью правильным.

Ответ 11

Основная причина, по которой HashMap разработан для сравнения ключей, использует метод equals(), и метод можно вызывать только на объекте, не на примитиве.