Со стандартным hashmap его невозможно сделать эффективно (без прохождения всего). Цель hashmap - обеспечить быстрый доступ к элементам с небольшими издержками памяти. У вас есть массив с целым размером и функцией hashcode, которая возвращает целое число для каждого сохраненного объекта. Затем вы сможете найти элемент, применив index = hashcode (key), который в основном выполняет 1 операцию, чтобы найти что-либо. Но у вас ужасная память (размер массива равен всем целым числам).
Другие варианты состоят в том, чтобы иметь список и пройти через все элементы. Здесь у вас не будет лишних затрат памяти, но сложность поиска будет O (n) - вам нужно будет пройти все, чтобы убедиться, что элемент не находится в массиве (или найти его раньше).
Hashmap находится посередине. Вы выделяете массив размера, скажем 100. Затем вы вычисляете функцию hashcode для ключа, а результат - 105. Таким образом, вы помещаете объект в индекс {hashcode_result} по модулю array_size. В нашем случае 105% 100 == 5.
Интересный материал зависит от реализации, что вы будете делать, если у вас есть столкновение, которое в качестве ключа2 с тем же позитивом. Например, если значение hashcode равно 205, 305 ... (по модулю будет 5 для всех этих хэш-кодов). Одной из возможностей было бы добавить эти дополнительные элементы в следующий доступный индекс 6, 7 ... В Java (или, по крайней мере, насколько я помню) ковши выполнены в виде связанных списков, так что вы будете иметь
0 => []
1 => []
2 => []
3 => []
4 => []
5 => [k=105, k=205, k=305...]
Единственный способ, как использовать HashMap для случая использования будет реализовать функцию Hashcode , который всегда генерирует один и тот же хэш для одного и того же класса. Но это приведет к вырождению хэш-карты в n списков, где n - количество подклассов. И поиск будет ужасно страдать (вам нужно будет выполнять операции M/n для поиска значения, где M - количество элементов, а n - количество различных классов), а правильно реализованный hashmap (равномерное распределение значений хэш-кода) гарантирует, что число выборок будет эффективно равна 1.
Короче говоря - из-за структуры HashMap, вы не можете сделать любой тип loopkup данных в зависимости от эффективного (вы Виль убить производительность для поиска через списки). Если вы хотите иметь этот тип поиска, ответ john16384 действительно хороший.
Я не думаю, что клавиши имеют тип X, XY, XZ :) – john16384
Спасибо) просто ошибка, исправлено это – dmitryvim