2 Matching Annotations
  1. Aug 2023
    1. Добавление элементов

      Сначала вычисляется хэшкод ключа, затем индекс корзины в которую он будет добавлен по модулю от величины коллекции

      int bucketNum = (hashcode & 0x7fffffff) % capacity;

      Если такой ключ есть в коллекции, то выбросит исключение. Если присваивать по индексу, то новый элемент заменит старый. Если количество элементов меньше емкости словаря, то сложность приближается к О(1). Если необходимо увеличить емкость, то сложность становится O(n), где n - количество элементов. Если происходит [[Коллизия|коллизия]], т.е. элемент с таким индексом уже существует в массиве хэшей, то значение добавляется в корзину, а предыдущему последнему элементу корзины для этого ключа в поле next присваивается индекс нового элемента (Что бы можно было перебрать все значения по индексу и найти требуемое значение по ключу). Получается что для каждого индекса в таблице buckets создается однонапрявленный связный список. Этот механизм разрешения коллизий называется changing. Если количество коллизий становится большим (>100), то при расширении коллекции происходит операция перехэширования

    2. Инициализация

      При создании, если передан начальный размер коллекции или по умолчанию первое простое число 3. Создаётся 2 коллеции int[] buckets (индексы) и Entry[] entries (значения).