Почему .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»