Методы Hashcode() и Equals() в Java

Hashcode() и Equals() в Java-программировании – частая тема, с которой сталкиваются новички. Здесь необходимо понять, что каждый метод значит и каким образом требуется писать код с их помощью. Как раз-таки в данном материале будет рассмотрено, что требуется знать начинающему программисту на Java, чтобы в будущем работать без особых недопониманий и трудностей с методами Hashcode() и Equals().

Но для начала, прежде чем разбираться непосредственно с самой работой этих частей кодов, требуется понять, что такое Hashcode(). Если говорить простым языком, то это компонент, называемый результатом работы метода, ко входному параметру которого передан объект. Либо же можно назвать его по-другому – битовая строка фиксированной длины, полученная из массива произвольной длины.

Как писать Hashcode() и Equals()?

Для того, чтобы понять, как писать Hashcode() и Equals() в языке Java, требуется использовать множество примеров для каждой ситуации. Но для самого начала нужен вот такой простой, объясняющий принцип действия Hashcode():

publicclassMain {
public static void main(String[] args) {
Object object = new Object();
int hCode;
hCode = object.hashCode();
System.out.println(hCode);
}
}

Данный пример – самый базовый и требуется исключительно для того, чтобы пользователи поняли принцип действия команды. После выполнения данного кода, в окно результата выведется 10-значное число, которое и будет являться битовой строкой фиксированной длины. Предел здесь обозначен с помощью int, что требуется также знать для новичков, ведь в будущем встретятся подобные структуры, с которыми не должно быть недопониманий.

Так как массивом произвольной длины является объект, то в данном примере он так же выражен определенным образом. Здесь обозначается таковой как Object, за него отвечает целая строка кода.
Благодаря разобранному выше примеру, пользователь может без каких-либо проблем заниматься далее кодами с участием Hashcode().

Но необходимо также изучить Equals(), ведь он тоже имеет немало важного материала. Перед тем, как опять же, приступать к написанию примеров кода, требуется пояснить одну деталь – когда создается оператор new, то каждый раз станет появляться новый объект в памяти. И для иллюстрации всего этого нужно создать новый класс в коде:

public class BlackBox {
int varA;
int varB;

BlackBox(int varA, int varB){
this.varA = varA;
this.varB = varB;
}
}

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

public class DemoBlackBox {
public static void main(String[] args) {
BlackBox object1 = new BlackBox(5, 10);
BlackBox object2 = new BlackBox(5, 10);
}
}

Когда в памяти создастся 2 объекта, каждый со своими свойствами, придется применить средство для сравнения обоих. Хоть человек и будет понимать, что по свойствам оба элемента равны, но требуется также убедиться в этом с помощью команды. Она выглядит следующим образом:

object1.equals(object2);

Здесь может быть 2 исхода. Либо программа выведет ответ «Booleantrue», если значения эквивалентны, либо «False», если что-то не равно. Вот еще один пример с Equals() и Hashcode():

object1.equals(object2)
object1.hashCode() == object2.hashCode()

В обоих случаях должно быть «True». И теперь, когда разобран основной материал с обоими командами, следует приступить к переопределению значений Equals() и Hashcode().

Переопределение Equals() и Hashcode() в Java

Иногда требуется переопределять метод Equals(). Javaрекомендует соблюдать несколько важных моментов при этом:

  • Объект должен быть равен самому себе;
  • A.equals(b) должен вернуть true, а b.equals(a) так же должен вернуть true(к примеру). То же самое и с 3 «equals»;
  • Повторный вызов equals() должен возвращать одно неизменное значение, пока что-то из свойств не будет изменено;
  • Объект должен проверяться на null. Если он равен такому значению, то a.equals(null) вернет значение false.

А вот один из примеров переопределения метода Equals():

public class Person {
private int id;
private String firstName;
private String lastName;

public int getId() { return id; }
public void setId(int id) { this.id = id;}

public String getFirstName() { return firstName; }
public void setFirstName(String firstName) { this.firstName = firstName; }
public String getLastName() { return lastName; }
public void setLastName(String lastName) { this.lastName = lastName; }
@Override
public boolean equals(Object obj) {
if (obj == this) {
return true;
}
if (obj == null || obj.getClass() != this.getClass()) {
return false;
}

Person guest = (Person) obj;
return id == guest.id
&& (firstName == guest.firstName
|| (firstName != null &&firstName.equals(guest.getFirstName()))) && (lastName == guest.lastName
|| (lastName != null && lastName .equals(guest.getLastName())
));
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((firstName == null) ? 0 : firstName.hashCode()); result = prime * result + id; result = prime * result +
((lastName == null) ? 0 : lastName.hashCode()); return result;
}
}

Что нужно помнить о Equals() и Hashcode()?

Необходимо также помнить о том, что может быть наиболее важным в процессе написания кода. У Equals() и Hashcode() есть специальные особенности, о которых требуется запомнить. Иногда они могут стать очень полезными – в зависимости от ситуации.

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

Последнее явления можно назвать коллизией – когда у разных объектов одинаковое значение хэш-кодов. Вероятность появления такого, как правило, может очень сильно варьироваться и добиться этого можно в зависимости от используемого алгоритма генерации Hashcode().

Об Equals() требуется знать только единственное и самое главное. Это – предназначение частицы кода. Нужна она исключительно для того, чтобы выявлять равенство или неравенство между объектами. Более никаких предназначений у Equals() нет.

Образовательный портал 3TY.RU
Adblock
detector