tu cerchi di fare l'uguaglianza tra 2 oggetti di tipo Traghetto.
Ora per l'uguaglianza vera e propria dovresti implementare il metodo hashcode (come ben sai sei certo dell'uguaglianza quando fai il corretto override di equals e hashcode).
Poi rivedrei un po' l'algoritmo
codice:
public boolean equals(Object o){
//Ok, se passi null sicuramente sono differenti
if(o==null){
return false;
}
//perché qui ricontrolli null? Lo hai fatto su
//corretto il controllo della classe, classi differenti sicuramente oggetti differenti
if (getClass().equals(o.getClass())){
Traghetto otherTraghetto = (Traghetto) o;
//a questo punto devi controllare punto per punto l'uguaglianza di ogni parametro che
//lo ripeti per tutti i parametri di interesse. Logica, un parametro non valorizzato rende gli oggetti diversi
if (this.nome == null && otherTraghetto.nome != null) return false;
if (this.nome != null && otherTraghetto.nome == null) return false;
//controlli l'uguaglianza tra i due (equals o == a seconda del tipo)
if (!this.nome.equals(otherTraghetto.nome) return false;
//infine hai
for (String string : fermate){
//controlla che questa sia nell'altra struttura, puoi trovare accettabile che ci sia ma in altre posizioni oppure come ti ha fatto furfari controlli posizione per posizione.
}
//arrivato qui sono uguali
return true;
}
ti consiglio di passare all'uso di collection, che ti facilitano il controllo (es. se le tue fermate stanno in un array di stringhe (arraylist) contains mi dice se la fermata è contenuta o meno facilitandoti la vita)