La méthode equals() déterminant une égalité d'objet, permet de comparer deux références d'instance de classe par rapport à leur valeur.

boolean resultat = ref_obj1.equals(ref_obj2);

L'égalité d'objet est obtenue lorsque deux objets distincts contiennent une valeur identique, à ne pas confondre avec l'égalité de référence, obtenue si deux références d'objets pointent vers un même objet.

class equal {
  public static void main(String[] args){
  String ref_obj1 = new String("Un texte.");
  String ref_obj2 = new String("Un texte.");
  if(ref_obj1.equals(ref_obj2))
      System.out.println("Réussi");
  else System.out.println("Echec");

  ref_obj1 = "Une autre chaîne !";
  if(ref_obj1.equals(ref_obj2))
      System.out.println("Réussi");
  else System.out.println("Echec");
  }
}
//affiche
Réussi
Echec

La méthode equals() est définie dans la superclasse java.lang.Object. Elle est outrepassée dans des sous-classes telles que java.lang.String, java.lang.Boolean, java.util.Vector, etc..

Le comportement de la méthode equals() varie selon la classe qui l'invoque.

La méthode equals() invoquée par une référence d'instance de la classe Object effectue un comparaison d'égalité de référence avec un argument d'un type quelconque.

Object ref_obj1 = new Object();
Object ref_obj2 = new Object();
UneClasse ref_obj3 = new UneClasse();
Object ref_obj4 = ref_obj1;

boolean resultat = ref_obj1.equals(ref_obj2);
// resultat = false;

boolean resultat = ref_obj1.equals(ref_obj3);
// resultat = false;

boolean resultat = ref_obj1.equals(ref_obj4);
// resultat = true;

Par contre, lorsque deux références pointent vers des objets d'un type identique, elles sont effectivement comparés par rapport à leur valeur.

Boolean ref_obj1 = new Boolean(true);
Boolean ref_obj2 = new Boolean(true);

boolean resultat = ref_obj1.equals(ref_obj2);
// resultat = true;

boolean resultat = ref_obj1.equals(ref_obj3);
// resultat = true;

Si un objet d'un type quelconque est comparé à un autre objet de type Object, alors si les deux objets sont des instances d'une même classe, une comparaison de valeur devient possible, sinon la méthode equals() retourne false.

UneClasse ref_obj1 = new UneClasse();
UneClasse ref_obj2 = new UneClasse();
Object ref_obj3 = new Object();
Object ref_obj4 =  = new UneClasse();

boolean resultat = ref_obj1.equals(ref_obj3);
// resultat = false;

boolean resultat = ref_obj1.equals(ref_obj4);
// resultat = true;

ref_obj3 = ref_obj2;
boolean resultat = ref_obj1.equals(ref_obj3);
// resultat = true;

Dans tous les cas, si les types du temps d'exécution sont différents et même si les types références sont identiques, la méthode equals() retourne toujours false.

class equal {
  public static void main(String[] args){
  String ch = new String("Un texte.");
  String ch2 = new String("Un texte.");
  Boolean log = new Boolean(true);
  Boolean log2 = new Boolean(true);
  Object obj = new Object();
  Object obj2 = new Object();
  String ch3 = new String("U");
  Character car = new Character('U');
  Object obj_car = new Character('U');
  Object obj_ent = new Integer(10);
  Object obj_ent2 = new Long(10);

  if(obj.equals(obj2)) System.out.println("Obj(obj) : Réussi");
  else System.out.println("Obj(obj) : Echec");

  if(obj.equals(log2)) System.out.println("Obj(log) : Réussi");
  else System.out.println("Obj(log) : Echec");

  if(obj.equals(ch2)) System.out.println("Obj(ch) : Réussi");
  else System.out.println("Obj(ch) : Echec");

  if(ch.equals(obj2)) System.out.println("ch(obj) : Réussi");
  else System.out.println("ch(obj) : Echec");

  if(ch.equals(ch2)) System.out.println("ch(ch) : Réussi");
  else System.out.println("ch(ch) : Echec");

  if(ch.equals(log2)) System.out.println("ch(log) : Réussi");
  else System.out.println("ch(log) : Echec");

  if(log.equals(obj2)) System.out.println("log(obj) : Réussi");
  else System.out.println("log(obj) : Echec");

  if(log.equals(log2)) System.out.println("log(log) : Réussi");
  else System.out.println("log(log) : Echec");

  if(log.equals(obj2)) System.out.println("log(obj) : Réussi");
  else System.out.println("log(obj) : Echec");

  if(car.equals(ch3)) System.out.println("car(ch) : Réussi");
  else System.out.println("car(ch) : Echec");

  if(ch3.equals(car)) System.out.println("ch3(car) : Réussi");
  else System.out.println("ch3(car) : Echec");

  if(car.equals(obj_car))
      System.out.println("car(obj_car) : Réussi");
  else System.out.println("car(obj_car) : Echec");

  if(obj_ent.equals(obj_ent2))
      System.out.println("obj_ent(obj_ent2) : Réussi");
  else System.out.println("obj_ent(obj_ent2) : Echec");

  if(obj_ent2.equals(obj_ent))
      System.out.println("obj_ent2(obj_ent) : Réussi");
  else System.out.println("obj_ent2(obj_ent) : Echec");

  obj = log;
  if(log2.equals(obj))
      System.out.println("log(obj=log) : Réussi");
  else System.out.println("log(obj=log) : Echec");

  if(obj.equals(log2))
      System.out.println("obj=log(log) : Réussi");
  else System.out.println("obj=log(log) : Echec");
  }
}

Par ailleurs, l'égalité d'objet est vraie dans les deux sens.