logo

Java'da İki Nesne Nasıl Karşılaştırılır

Java Nesnesi class, tüm Java sınıflarının süper sınıfıdır. Tüm Java sınıfları varsayılan olarak Object sınıfını uygular. Java Object sınıfı iki önemli yöntemi sağlar: ikisini karşılaştır Java'daki nesneler yani eşittir() Ve hash kodu() yöntem. Bu bölümde nasıl yapılacağını öğreneceğiz eşittir() Ve hash kodu() yöntem işe yarıyor. Bununla birlikte şunları da öğreneceğiz Java'da iki nesne nasıl karşılaştırılır doğru örneklerle.

Java, nesneleri karşılaştırmak için Object sınıfının iki yöntemini sağlar:

  • Java equals() Yöntemi
  • Java hashCode() Yöntemi

Java equals() Yöntemi

eşittir() Object sınıfının yöntemi, iki nesnenin eşitliğini karşılaştırır. Aynı hafıza adresini paylaşıyorlarsa iki nesne eşit olacaktır.

Sözdizimi:

 public boolean equals(Object obj) 

Yöntem, bir referans nesnesini parametre olarak ayrıştırır. Nesneler eşitse true değerini döndürür, aksi takdirde false değerini döndürür.

Bir nesnenin verilen başka bir nesneye eşit olması da mümkündür, bu durumda equals() yöntemi aşağıdakileri takip eder: denklik ilişkisi Nesneleri karşılaştırmak için.

    Dönüşlü:Eğer X boş olmayan bir referanstır, çağrılması x.eşittir(x) doğruya dönmelidir.Simetrik:Boş olmayan iki referans ise X Ve y, x.eşittir(y) dönecek doğru ancak ve ancak y.eşittir(x) geri dönmek doğru .Geçişli:Boş olmayan üç referans ise x, y , Ve z, x.eşittir(z) ayrıca geri dönecek doğru eğer x.eşittir(y ) Ve y.eşittir(z) her ikisi de geri döner doğru .Tutarlı:Boş olmayan iki referans ise X Ve Ve , çoklu çağrı x.eşittir(y) sürekli olarak doğru veya yanlış değerini döndürür. Karşılaştırmada kullanılan herhangi bir bilgi sağlamaz.
  • Boş olmayan herhangi bir referans için x, x.equals(null) false değerini döndürür.

Kısacası, boş olmayan herhangi bir referans için şunu söyleyin: X Ve Ve , ancak ve ancak her iki referansın da aynı nesneye başvurması durumunda true değerini döndürür.

Hatırlamak: equals() metodunu override ettiğimizde hashCode() metodunu da override etmemiz gerekir. Geçersiz kılma, eşit nesnenin eşit karma koduna sahip olması gerektiğini belirten hashCode() yöntemine ilişkin kurala uyun.

equals() yöntemi örneği

Aşağıdaki örnekte oluşturduğumuz yapıcı arasında Çift Ve Uzun sınıf ve karşılık gelen değerleri sırasıyla nesnelerinde depolanan bir argüman olarak iletir.

Daha sonra ilk println ifadesinde equals() yöntemini çağırıp, x ve y nesnesini karşılaştıran bir parametre olarak y nesnesini ayrıştırdık. Geri dönüyor YANLIŞ çünkü x double değerini, y ise eşit olmayan long değerini tutar.

Benzer şekilde, ikinci println ifadesinde equals() yöntemini çağırdık ve Double sınıfının yapıcısındakiyle aynı değeri ayrıştırdık. Geri dönüyor doğru çünkü çift sınıfın nesnesi, yani x, equals() yönteminde ilettiğimiz değerin aynısını tutar.

ObjectComparisonExample.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)); } } 

Çıktı:

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

== Operatör ve equals() Yöntemi Arasındaki Fark

İçinde Java , == operatörü iki referansın aynı olup olmadığını karşılaştırır. Oysa eşittir() yöntem iki nesneyi karşılaştırır.

Nesneler eşit aynı duruma sahip olduklarında (genellikle değişkenleri karşılaştırırken). Nesneler birebir aynı sınıf kimliğini paylaştıklarında.

Örneğin, ifade obj1==obj2 eşitliği değil kimliği test eder. İfade iken obj1.eşittir(obj2) eşitliği karşılaştırır.

Java hashCode() Yöntemi

Java'da karma kod, 32 bitlik işaretli bir tamsayı değeridir. tarafından sağlanan benzersiz bir kimliktir. JVM Java nesnesine. Her Java nesnesi karma koduyla ilişkilendirilir. Karma kodu, HashTable, HashSet vb. gibi karma tabanlı bir veri yapısı tarafından yönetilir.

Hatırlamak: equals() yöntemini geçersiz kıldığımızda, hashCode() yöntemini de geçersiz kılmamız gerekir.

Sözdizimi:

 public int hashCode() 

Her örnek için benzersiz olan, nesnenin rastgele oluşturulmuş bir karma kod değerini döndürür. Rastgele oluşturulan değer, programın çeşitli yürütmeleri sırasında değişebilir.

HashCode'un genel sözleşmesi şöyledir:

Java bağlantılı listesi
  • Bir uygulamanın yürütülmesi sırasında birden fazla kez çağrıldığında, hashCode() yöntemi sürekli olarak aynı karma kodunu (tamsayı değeri) döndürecektir. Nesnenin değiştirilmemesi gerektiğini unutmayın.
  • Equals() yöntemine göre iki nesne eşitse, bu iki nesnede hashCode() yönteminin çağrılması aynı tamsayı değerini üretmelidir.
  • İki nesne equals() yöntemine göre eşit değilse, bu iki nesnede hashCode() yönteminin çağrılmasının farklı bir tamsayı değeri üretmesi gerekli değildir. Bu, her iki nesne için de aynı hash kodunu üretebileceği anlamına gelir.

hashCode() yöntemi örneği

Aşağıdaki örnekte iki sınıf oluşturduk. Çalışan.java Ve HashCodeExample.java .

Employee sınıfında, int tipinde regno ve String tipinde iki alan tanımladık. Daha sonra Employee sınıfının bir kurucusunu oluşturduk ve bu iki alanı parametre olarak aktardık.

Nesnelerin karşılaştırmasını gerçekleştirmek için adında ayrı bir sınıf oluşturduk. Karma Kod Örneği . Bu sınıfta, Employee sınıfının iki örneğini oluşturduk; emp1 Ve emp2 . Bundan sonra hashCode() yöntemini nesneleri kullanarak çağırdık. Karma kod değerini değişkende sakladık A Ve B , sırasıyla.

Çalışan.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)); } } 

Çıktı:

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

equals() Yöntemini geçersiz kılma

Kendi uygulamamızı sağlamak istiyorsak equals() yöntemini aşağıdaki şekilde geçersiz kılabiliriz.

 //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(); } 

Yukarıdaki kod parçacığı, iki çalışanın aynı bellek adresinde saklanması veya aynı regno'ya sahip olması durumunda eşit olacağını göstermektedir. Programı (HashCodeExample.java) yukarıdaki kod parçasıyla çalıştırdığımızda aşağıdaki çıktıyı alıyoruz.

Çıktı:

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