Nano Hash - криптовалюты, майнинг, программирование

Уникальная идентификация объекта Java Set

В Java набор не может содержать два уникальных объекта, тогда как список не имеет этого ограничения. Каков механизм в наборе, который идентифицирует уникальные объекты. Скорее всего, это может быть реализация метода equals или метода hashCode, или обоих добавляемых объектов. Кто-нибудь знает, каков на самом деле механизм идентификации уникальных объектов. Это метод equals, метод hashcode или оба метода или что-то еще?

05.06.2013

Ответы:


1

Это зависит от реализации Set. Для HashSet и LinkedHashSet используются методы equals и hashCode. Для TreeSet используется естественный Comparator объекта или специально предоставленный Comparator.

По сути, это объясняется в Set javadoc ( выделение мое):

Коллекция, не содержащая повторяющихся элементов. Говоря более формально, наборы не содержат пары элементов e1 и e2, таких что e1.equals(e2), и не более одного нулевого элемента. Как следует из названия, этот интерфейс моделирует математическую абстракцию множеств.

Интерфейс Set накладывает дополнительные условия, помимо унаследованных от интерфейса Collection, на контракты всех конструкторов и на контракты методов add, equals и hashCode.

TreeSet имеет другое поведение, поскольку реализует SortedSet (этот интерфейс расширяет интерфейс Set). Из его javadoc (выделено мной):

Набор, который дополнительно обеспечивает общий порядок своих элементов. Элементы упорядочиваются с использованием их естественного порядка или с помощью компаратора, который обычно предоставляется во время создания отсортированного набора. Итератор набора будет проходить по набору в порядке возрастания элементов.)

Обратите внимание, что порядок, поддерживаемый отсортированным набором (независимо от того, предоставлен явный компаратор или нет), должен быть согласован с equals, если отсортированный набор должен правильно реализовать интерфейс Set (см. интерфейс Comparable или интерфейс Comparator для точного определения соответствия с equals.) Это так, потому что интерфейс Set определен в терминах операции equals, но отсортированный набор выполняет все сравнения элементов, используя свой метод compareTo (или сравнение).

05.06.2013
  • Спасибо за ответ. @Луиджи 05.06.2013

  • 2

    Источник HashSet: кажется, что элементы хранятся как ключи в HashMap (для чего требуются уникальные ключи), а метод put в HashMap проверяет следующее:

    if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
    

    Таким образом, он сравнивает оба хэша и запускает equals.

    TreeSet использует TreeMap для поддержки своих данных, а TreeMaps put использует компаратор.

    05.06.2013
  • Этот исходный код, вероятно, не будет совместим с другими реализациями JVM, такими как JRockit или JVM от IBM. 05.06.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..