Hashcode ed è uguale per Hashset

Per favore chiarisci il mio dubbio su Hashset. Considera il seguente codice,

class Person { String name; Person(String n) { name=n; } public String getName() { return name; } @Override public boolean equals(Object arg0) { System.out.println("in equals"); Person obj=(Person)arg0; System.out.println("1st "+getName()); System.out.println("2nd "+obj.getName()); if(this.getName().equals(obj.getName())) { return true; } return false; } @Override public int hashCode() { System.out.println("in hash code"); System.out.println(" value is "+Integer.valueOf(name.charAt(0))); return Integer.valueOf(name.charAt(0)); } } 

in main ho il seguente codice

 Person obj1=new Person("bcd"); Person obj2=new Person("cde"); Person obj3=new Person("abc"); Person obj4=new Person("abc"); 

Ora se aggiungo questi oggetti a hashset

 Set sset=new HashSet(); sset.add(obj1); sset.add(obj4); sset.add(obj2); sset.add(obj3); 

Sto ottenendo questo risultato

 in hash code value is 98 in hash code value is 97 in hash code value is 99 in hash code value is 97 in equals 1st abc 2nd abc 

Domanda 1 : perché la funzione equals () viene chiamata una sola volta per controllare obj3 e obj4? Perché non viene controllato per il resto degli oggetti?

Domanda 2 : Se la risposta è perché entrambi hanno lo stesso codice hash, solo allora verrà chiamato uguaglianza, quindi perché non viene richiesto il codice seguente

 sset.add(obj1); sset.add(obj4); sset.add(obj2); sset.add(obj4); 

l’output è:

 in hash code value is 98 in hash code value is 97 in hash code value is 99 in hash code value is 97 

Non sta andando all’interno del metodo equals () anche se due stessi oggetti vengono aggiunti al set hash che ha lo stesso codice hash.

Domanda 3 : Ho iterato il valore precedente e stampato il contenuto ma non sono stati chiamati né hashcode né uguali. quando è davvero utile sovrascrivere il metodo hashcode e equals?

Domanda 4 : Quando sarà chiamato hashCode() e equals() ?