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(), и метод можно вызывать только на объекте, не на примитиве.