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

Есть ли какая-либо значимая разница между equals (Object o) и equals (Name o)? Если да, то какое значение это имеет?

Я видел две разные версии этого кода, одну из Java Oralce и другую из Youtube. Единственная разница между двумя версиями заключается в типе параметра метода equals(). Один из них equals(Object o), а другой equals(Name o). Мне просто интересно, есть ли какая-то существенная разница между двумя версиями? если да, то какое это имеет значение? Спасибо за любую помощь, которую я мог получить!

public class Name implements Comparable<Name> {
    private final String firstName, lastName;

    public Name(String firstName, String lastName) {
        if (firstName == null || lastName == null)
            throw new NullPointerException();
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String firstName() { return firstName; }
    public String lastName()  { return lastName;  }

    public boolean equals(Object o) {
        if (!(o instanceof Name))
            return false;
        Name n = (Name) o;
        return n.firstName.equals(firstName) && n.lastName.equals(lastName);
    }

    public int hashCode() {
        return 31*firstName.hashCode() + lastName.hashCode();
    }

    public String toString() {
    return firstName + " " + lastName;
    }

    public int compareTo(Name n) {
        int lastCmp = lastName.compareTo(n.lastName);
        return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
    }
}

  • Чтобы переопределить equals, параметр должен быть Object, а не каким-то другим. В противном случае вы перегружаете, а не переопределяете, и неправильный equals будет вызываться в различных контекстах. Связанный вопрос и его ответы (и несколько других здесь, на SO) содержат подробности. 19.03.2016

Ответы:


1

equals(Object o) переопределяет метод equals Object, а equals(Name o) — нет. Следовательно, если класс Name используется с каким-либо классом, который использует equals Object (например, HashSet<Name>, ArrayList<Name> и т. д.), вам следует реализовать equals(Object o), если вы хотите переопределить логику по умолчанию, определяющую, равны ли два объекта каждому другое (по умолчанию a.equals(b) если a==b).

Например, следующий код выдаст результат 2, если реализован equals(Name o) (поскольку в соответствии с реализацией по умолчанию equals(Object o) два объекта, добавленные в Set, не равны друг другу) и 1, если equals(Object o) реализовано, как в вашем примере кода. (поскольку согласно вашей реализации equals(Object o) два объекта, добавленные в Set, равны друг другу, а HashSet предотвращает дублирование).

Set<Name> names = new HashSet<>();
names.add(new Name("John","Smith"));
names.add(new Name("John","Smith"));
System.out.println(names.size());
19.03.2016
Новые материалы

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

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

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

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

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

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

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