logo

Com comparar dos objectes a Java

Objecte Java class és la superclasse de totes les classes Java. Totes les classes Java implementen la classe Object per defecte. La classe Java Object proporciona els dos mètodes importants compara dos objectes en Java , és a dir és igual() i hashCode() mètode. En aquesta secció, aprendrem com és igual() i hashCode() el mètode funciona. Juntament amb això, també aprendrem Com comparar dos objectes a Java amb exemples adequats.

Java proporciona els dos mètodes de la classe Object per comparar els objectes són els següents:

  • Mètode Java equals().
  • Mètode Java hashCode().

Mètode Java equals().

El és igual() El mètode de la classe Object compara la igualtat de dos objectes. Els dos objectes seran iguals si comparteixen la mateixa adreça de memòria.

Sintaxi:

 public boolean equals(Object obj) 

El mètode analitza un objecte de referència com a paràmetre. Retorna true si els objectes són iguals, en cas contrari retorna fals.

També és possible que un objecte sigui igual a un altre objecte donat, llavors el mètode equals() segueix el relació d'equivalència per comparar els objectes.

ex del nom d'usuari
    Reflexiu:Si x és una referència no nul·la, la crida de x.equals(x) ha de tornar veritat.Simètric:Si les dues referències no nul·les ho són x i y, x.equals (y) tornarà veritat si i només si y.equals (x) tornar veritat .transitiu:Si les tres referències no nul·les ho són x, y , i z, x.equals (z) també tornarà veritat si x és igual a (y ) i y.equals (z) ambdós retorns veritat .coherent:Si les dues referències no nul·les ho són x i i , la crida múltiple de x.igual a (y) retorna constantment cert o fals. No proporciona cap informació utilitzada en la comparació.
  • Per a qualsevol referència no nul·la x, x.equals(nul) retorna fals.

En resum, per a qualsevol referència no nul·la, diguem x i i , retorna cert si i només si ambdues referències fan referència al mateix objecte.

Recordeu: Quan substituïm el mètode equals(), és necessari anul·lar el mètode hashCode(). La substitució seguiu la convenció del mètode hashCode() que indica que l'objecte igual ha de tenir el mateix codi hash.

Exemple del mètode equals().

En l'exemple següent, hem creat constructor del Doble i Llarg classe i passa els valors corresponents, com a argument que s'emmagatzemen en els seus objectes, respectivament.

Després d'això, a la primera sentència println, hem invocat el mètode equals() i hem analitzat un objecte y com a paràmetre que compara l'objecte x i y. Torna fals perquè x té el valor doble i y té el valor llarg que no és igual.

De la mateixa manera, a la segona sentència println, hem invocat el mètode equals() i hem analitzat el mateix valor que al constructor de la classe Double . Torna veritat perquè l'objecte de la classe doble, és a dir, x té el mateix valor que hem passat al mètode equals().

ObjectComparisonExample.java

trencar java
 public class ObjectComparisonExample { public static void main(String[] args) { //creating constructor of the Double class Double x = new Double(123.45555); //creating constructor of the Long class Long y = new Long(9887544); //invoking the equals() method System.out.println('Objects are not equal, hence it returns ' + x.equals(y)); System.out.println('Objects are equal, hence it returns ' + x.equals(123.45555)); } } 

Sortida:

 Objects are not equal, hence it returns false Objects are equal, hence it returns true 

Diferència entre l'operador == i el mètode equals().

En Java , el == l'operador compara que dues referències són idèntiques o no. Mentre que el és igual() El mètode compara dos objectes.

Els objectes són igual quan tenen el mateix estat (normalment comparant variables). Els objectes són idèntics quan comparteixen la identitat de classe.

Per exemple, l'expressió obj1==obj2 posa a prova la identitat, no la igualtat. Mentre que l'expressió obj1.equals (obj2) compara la igualtat.

Mètode Java hashCode().

A Java, el codi hash és un valor enter signat de 32 bits. És un identificador únic proporcionat per JVM a l'objecte Java. Cada objecte Java està associat amb el codi hash. El codi hash està gestionat per una estructura de dades basada en hash, com ara HashTable, HashSet, etc.

Recordeu: Quan substituïm el mètode equals(), també és necessari anul·lar el mètode hashCode().

Sintaxi:

 public int hashCode() 

Retorna un valor de codi hash generat aleatòriament de l'objecte que és únic per a cada instància. El valor generat aleatòriament pot canviar durant les diverses execucions del programa.

mín màx

El contracte general per a hashCode és:

  • Quan s'invoca més d'una vegada durant l'execució d'una aplicació, el mètode hashCode() retornarà constantment el mateix codi hash (valor sencer). Tingueu en compte que l'objecte no s'ha de modificar.
  • Si els dos objectes són iguals segons el mètode equals(), llavors invocar el mètode hashCode() en aquests dos objectes ha de produir el mateix valor enter.
  • No és necessari que si els dos objectes són desiguals segons el mètode equals(), llavors invocar el mètode hashCode() en aquests dos objectes pot produir un valor enter diferent. Significa que pot produir el mateix codi hash per als dos objectes.

Exemple del mètode hashCode().

En l'exemple següent, hem creat dues classes Employee.java i HashCodeExample.java .

A la classe Employee, hem definit dos camps regno de tipus int i nom de tipus String. Després d'això, hem creat un constructor de la classe Employee i passem aquests dos camps com a paràmetre.

Per realitzar la comparació d'objectes, hem creat una classe separada anomenada HashCodeExample . En aquesta classe, hem creat dues instàncies de la classe Employee, és a dir. emp1 i emp2 . Després d'això, hem invocat el mètode hashCode() mitjançant objectes. Hem emmagatzemat el valor del codi hash a la variable a i b , respectivament.

Employee.java

 public class Employee { private int regno; private String name; //constructor of Employee class public Employee(int regno, String name) { this.name = name; this.regno = regno; } public int getRegno() { return regno; } public void setRegno(int Regno) { this.regno = regno; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 

HashCodeExample.java

 public class HashcodeExample { public static void main(String[] args) { //creating two instances of the Employee class Employee emp1 = new Employee(918, 'Maria'); Employee emp2 = new Employee(918, 'Maria'); //invoking hashCode() method int a=emp1.hashCode(); int b=emp2.hashCode(); System.out.println('hashcode of emp1 = ' + a); System.out.println('hashcode of emp2 = ' + b); System.out.println('Comparing objects emp1 and emp2 = ' + emp1.equals(emp2)); } } 

Sortida:

 hashcode of emp1 = 2398801145 hashcode of emp2 = 1852349007 Comparing objects emp1 and emp2 = false 

Anul·lació del mètode equals().

Podem anul·lar el mètode equals() de la següent manera si volem proporcionar una implementació pròpia.

retall de cadena javascript
 //overriding equals() method @Override public boolean equals(Object obj) { if (obj == null) return false; if (obj == this) return true; return this.getRegno() == ((Employee) obj). getRegno(); } 

El fragment de codi anterior mostra que dos empleats seran iguals si s'emmagatzemen a la mateixa adreça de memòria o tenen el mateix regne. Quan executem el programa (HashCodeExample.java) amb el fragment de codi anterior, obtenim la següent sortida.

Sortida:

 hashcode of emp1 = 2032578917 hashcode of emp2 = 1531485190 Comparing objects emp1 and emp2 = true