Как переопределить hashcode () и equals () определенного элемента arrayList - PullRequest
0 голосов
/ 10 мая 2018

хорошо, так что мой вопрос довольно прост. Я искал StackOverFlow, google и JavaDocs все выше и ниже, но не могу найти ответ на мой конкретный вопрос.

Насколько я понимаю (здесь все сводится к основам), каждый объект получает hashCode() в качестве уникального идентификатора. Мы будем использовать это в качестве примера ...

class Team {
        public Team(String teamName){teamName.this = teamName;}
        String teamName;
    }

    class NBALeague {
        ArrayList<Team> teamsInALeague = new ArrayList<>();
        teamsInALeague.add(new Team("Rockets"));
        teamsInALeague.add(new Team("Warriors"));
        teamsInALeague.add(new Team("Cavaliers"));
        teamsInALeague.add(new Team("76ers"));
    //each unique team when instantiated is assigned a hashCode!

        //now when I change the objects (or add to them rather) they are then 
        //each given a new hashCode()

          public void buildASchedule(){
             Team rockets = teamsInALeague.get(0);
             Team warriors= teamsInALeague.get(1);
             Team cavaliers= teamsInALeague.get(2);
             Team philly= teamsInALeague.get(3);

             String definingString = "This Team is Called: ";

             ArrayList anotherArrayList = new ArrayList();

             anotherArrayList.add(definingString + rockets.teamName);
             //Moving an object from one array list to another doesnt affect
             //its hashcode(), but adding a string to the object does

Теперь, когда у anotherArrayList.get(0) есть новый хэш-код, как мне его переопределить?

Я знаю, что должен переопределить метод hashcode() и equals(), чтобы при размещении в HashSet набор мог идентифицировать дубликаты, но поскольку эти новые хеш-коды создаются при добавлении строки в объект я не знаю, как переопределить хэш-код. Обычно я переопределяю оба метода через класс Team, но опять же это не сработает, поскольку изменение объекта создает новый хэш-код. кто нибудь помогите пожалуйста !!!

1 Ответ

0 голосов
/ 10 мая 2018

Похоже, у вас есть два неправильных представления: что такое на самом деле hashCode и как работает оператор +.

Сначала я расскажу о последнем. Помимо присвоения (=), когда вы применяете оператор к объекту, он никак не изменяет объект. Устав

anotherArrayList.add(definingString + rockets.teamName);

не изменяет и не влияет на переменную rockets. Он не «меняет хэш-код» или какую-либо другую информацию о нем, он просто копирует значение rockets.teamName, соединяет его с чем-то другим и создает новый объект. И этот новый объект будет String, так что вы все равно не сможете добавить его в список.

Теперь о hashCode. Объектам не "присваивается хэш-код" или что-либо подобное. В hashCode () нет ничего особенного, магического или автоматического, это просто метод, который возвращает целое число. Он возвращает то, что вы сказали, чтобы он возвращал, и, если вы не переопределите это, реализация по умолчанию возвращает число, которое никогда не изменяется для данного объекта.

Если вы замените объект другим, например, поместив еще один Team в эту позицию в списке, тогда у этого объекта будет свой собственный хэш-код, который может отличаться от первого. Но просто используя объект или одно из его полей никак не влияет на это.

...