Почему .hashcode() печатает другое значение, если оно было напечатано один раз раньшеJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Почему .hashcode() печатает другое значение, если оно было напечатано один раз раньше

Сообщение Anonymous »

Может ли кто-нибудь объяснить следующее поведение .hashcode().
при работе с двумя классами ниже я получаю разные значения для вызовов .hashcode().
Значение хэш-кода моей переменной (contact3) в Main меняется в зависимости от того, вызываю ли я хеш-код() в mergeContactData. Это означает, что если я закомментирую вызов хэш-кода в mergeContactData, хэш-код для contact3 в Main будет отличаться от того, если бы я его не закомментировал.
Чего я не понимаю, так это почему это значение меняется, если я просто печатаю хеш-код.
public class Main {

public static void main(String[] args) {
Contact contact = new Contact("Gustavo", "xxx", 5555555555L);
Contact contact2 = new Contact("Gustavo", "xxx", 5555555555L);
Contact contact3 = contact.mergeContactData(contact2);
System.out.println("Hashcode for contact3: " + contact3.hashCode());

}
}

import java.util.HashSet;
import java.util.Set;

public class Contact {

private String name;
private Set emails = new HashSet();
private Set phones = new HashSet();

public Contact(String name) {
this(name, null, 0);
}

public Contact(String name, String email) {
this(name, email, 0);
}

public Contact(String name, long phone) {
this(name, null, phone);
}

public Contact(String name, String email, long phone) {
this.name = name;
if (email != null) {
this.emails.add((email));
}

if (phone < 1000000000) {
System.out.println("Invalid Phone Number");
return;
}
String phoneNumber = "";
phoneNumber += "(" +
String.valueOf(phone / 10000000);
phone = phone % 10000000;
phoneNumber += ")" + String.valueOf(phone / 10000);
phone = phone % 10000;
phoneNumber += "-" + String.valueOf(phone);

this.phones.add(phoneNumber);
}

public String getName() {
return this.name;
}

public Contact mergeContactData(Contact contact) {

if (this.name.equals(contact.name)) {
Contact newContact = new Contact(this.name);
newContact.emails.addAll(this.emails);
newContact.phones.addAll(this.phones);
newContact.emails.addAll(contact.emails);

System.out.println(newContact.hashCode());

contact.phones.forEach(s -> newContact.phones.add(s));
return newContact;
} else {
System.out.println("Not the same contact name");
return this;
}
}

@Override
public String toString() {
return this.name + " -> emails: " + this.emails + " Phone: " + this.phones;
}

}


Подробнее здесь: https://stackoverflow.com/questions/791 ... nce-before
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»