Я пытаюсь создать HashMap, в котором будут целые числа в качестве ключей и объекты в качестве значений.
Мой синтаксис:
HashMap<int, myObject> myMap = new HashMap<int, myObject>();
Однако возвращаемая ошибка - Синтаксическая ошибка токена "int", ожидаемые размеры после этого токена - я не понимаю, почему я должен добавить измерение (например, преобразовать int в массив), поскольку мне нужно сохранить только цифру как ключ.
Что я мог сделать?
Заранее спасибо! :)
HashMap
не обрабатывает примитивы, только объекты.int
ценностью, а не с ключом.Integer
Вместо этого используйте .Ответы:
Вы не можете использовать примитив, потому что HashMap использует объект внутри для ключа. Таким образом, вы можете использовать только объект, унаследованный от Object (то есть любой объект).
Это функция put () в HashMap, и, как вы можете видеть, она использует Object для K:
Выражение «k = e.key» должно прояснить это.
Я предлагаю использовать обертку типа Integer и autoboxing.
источник
Integer
Вместо этого используйте .Java автоматически добавит ваши
int
примитивные значения вInteger
объекты.Дополнительные сведения об автобоксировании см. В документации Oracle Java.
источник
myObject
ArrayMap
илиSimpleArrayMap
Android для экономии памяти и повышения производительности ( дополнительная информация )Для всех, кто кодирует Java для устройств Android и оказывается здесь: используйте
SparseArray
для повышения производительности;с этим вы можете использовать int вместо Integer, например;
источник
SparseArray
Если вы выделите кучу вставок для упаковки и распаковки памяти, как в случае с aHashMap
, виртуальной машине нужно будет приостановить выполнение для сборки мусора раньше. Это важно, если вы пытаетесь что-то делать часто и быстро.SparseArray
это O (п) (HashMap
имеет O (1) ). Это важно при большом количестве элементов. Вставка в начало такого массива происходит намного медленнее.put()
принимаетO(n)
(неn log n
) для вставки в начале, потому что он находит позицию, а затем сдвигает все следующие элементы.delete()
сам по себе действительно принимаетO(log n)
, но следующая вставка или повторение элементов после удаления потребует сборки мусора, которая принимаетO(n)
.Вы можете попробовать использовать Trove http://trove.starlight-systems.com/
TIntObjectHashMap, вероятно, то, что вы ищете.
источник
Основная причина, по которой HashMap не позволяет использовать примитив в качестве ключей, заключается в том, что HashMap разработан таким образом, что для сравнения ключей он использует метод equals () , и метод может быть вызван только для объекта, а не для примитива.
Таким образом, когда int автоматически преобразуется в Integer, Hashmap может вызывать метод equals () для объекта Integer.
Вот почему вы должны использовать Integer вместо int. Я имею в виду, что hashmap выдает ошибку при вводе int в качестве ключа (не знаю смысла выданной ошибки)
И если вы так думаете, вы можете повысить производительность Map, сделав примитив в качестве ключа, существует библиотека FastUtil, которая содержит реализацию Map с типом int в качестве ключа.
Из-за этого он намного быстрее, чем Hashmap.
источник
Map<Integer, String>
воMap<Object, Object>
время компиляции. Кстати, есть IdentityHashMap, который использует==
оператор для проверки равенства, который по-прежнему не допускает примитивных типов.HashMap не допускает примитивных типов данных в качестве аргументов. Он может принимать только объекты, поэтому
не будет работать.
Вы должны изменить декларацию на
поэтому даже если вы сделаете следующее
Примитивный тип данных автоматически упаковывается в объект Integer.
Вы можете узнать больше об автобоксе здесь http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
источник
Если вы кодируете в Android, есть SparseArray , отображающий целое число на объект.
источник
используйте int как объект, а не как примитивный тип
источник
-1
. Я в отличие от других комментирую перед наказанием (я не -1 вам).Пожалуйста, используйте
HashMap<Integer, myObject> myMap = new HashMap<Integer, myObject>();
источник
Массив также является объектом, поэтому
HashMap<int[], MyObject>
это допустимая конструкция, которая использует массивы int в качестве ключей.Компилятор не знает, что вы хотите или что вам нужно, он просто видит почти правильную языковую конструкцию и предупреждает о том, чего не хватает, чтобы она была полностью правильной.
источник
Тем, кто заинтересован в такой карте, потому что вы хотите уменьшить объем автобокса в Java оберток над типами примитивов, я бы рекомендовал использовать коллекции Eclipse . Trove больше не поддерживается , и я считаю, что это довольно ненадежная библиотека (хотя она все равно довольно популярна), и ее нельзя сравнивать с коллекциями Eclipse .
В этом примере выше IntObjectHashMap .
Поскольку вам нужно сопоставление int-> object , также рассмотрите возможность использования
YourObjectType[]
массива илиList<YourObjectType>
доступа к значениям по индексу, поскольку map по своей природе является ассоциативным массивом с типом int в качестве индекса.источник