Due mappe sono uguali se le stesse chiavi mappano gli stessi valori. (In alcune implementazioni.) Quindi per controllare l'uguaglianza, l'uguaglianza di ogni membro dovrebbe essere controllata.
Pertanto, se una mappa contiene se stessa, si otterrebbe una ricorsione infinita di controlli di uguaglianza.
Lo stesso vale per gli hash, in quanto possono essere calcolati in base agli hash degli elementi nella mappa.
Esempio:
Map<Int, Object> ma;
Map<Int, Object> mb;
Map<Int, Object> mc;
ma.put(1, ma);
ma.put(2, mb);
mc.put(1, ma);
mc.put(2, mb);
Come essere umano, possiamo vedere ma
e mc
sono uguali dalla definizione. Un computer vedrebbe 2 mappe su mb (una mappa vuota) in entrambe le mappe, il che è positivo. Vedrebbe 1 mappe su un'altra mappa sia in mc che in ma. Controlla se queste mappe sono uguali. Per determinarlo, controlla nuovamente se i due valori per 1 sono uguali. E di nuovo.
Si noti che questo non è il caso per tutte le implementazioni. Alcune implementazioni potrebbero controllare l'uguaglianza nella posizione in memoria dell'oggetto salvato, ... Ma ogni controllo ricorsivo verrà ripetuto all'infinito.
se ricordo bene il metodo equals controlla se il contenuto delle mappe sono uguali. e questo viene fatto usando il metodo equals dei contenuti, cioè la mappa stessa. Sono abbastanza sicuro che finiremo con StackOverflowError –
Potrebbe essere il modo in cui una mappa è uguale all'aspetto della funzione? forse causerà un ciclo infinito? Solo un pensiero – Kevin
@MarcoForberg Se ricordo bene, è consigliabile verificare se l'oggetto con cui si sta confrontando è effettivamente te stesso e restituire true immediatamente se è così. –