Sobes.tech
Junior

Java'da nesnelerin karşılaştırılması nasıl yapılır?

sobes.tech yapay zeka

AI'dan gelen yanıt

Java'da nesne karşılaştırması, tam olarak neyin karşılaştırılacağına bağlı olarak birkaç farklı şekilde yapılır: nesne referansları veya nesne içeriği.

  1. Referans karşılaştırması:

    • == operatörü: İki referansın aynı nesneye işaret edip etmediğini kontrol eder.
    Object obj1 = new Object();
    Object obj2 = new Object();
    boolean areSameReference = (obj1 == obj2); // false, farklı nesneler
    Object obj3 = obj1;
    boolean areStillSameReference = (obj1 == obj3); // true, aynı nesneye referanslar
    
  2. İçerik karşılaştırması:

    • equals() metodu: Bu metod Object sınıfında tanımlıdır ve varsayılan olarak referansları karşılaştırır. Ancak, sınıflar bu metodu içeriğe göre karşılaştırma yapmak üzere yeniden tanımlayabilir. Örneğin, String, Integer, koleksiyonlar (ArrayList, HashMap) equals metodunu değerleri veya öğeleri karşılaştırmak için yeniden tanımlar.
    String str1 = new String("hello");
    String str2 = new String("hello");
    boolean areEqualContent = str1.equals(str2); // true, içerik aynı
    boolean areSameReferenceString = (str1 == str2); // false, farklı String nesneleri
    
    Integer int1 = 10;
    Integer int2 = 10;
    boolean areEqualIntegers = int1.equals(int2); // true
    boolean areSameReferenceInteger = (int1 == int2); // bu, Integer önbelleğe alma durumuna bağlı olarak true veya false olabilir, ancak equals kullanmak daha iyidir
    
    • equals() metodunu yeniden tanımlarken, hashCode() metodunu da yeniden tanımlamak gerekir; aksi takdirde, sözleşmeye uyulmamış olur: Eğer obj1.equals(obj2) true ise, obj1.hashCode() ve obj2.hashCode() eşit olmalıdır. Tersine, aynı hash kodlarına sahip nesnelerin equals() ile eşit olduğu garanti edilmez.
  3. compareTo() veya karşılaştırıcılar kullanılarak karşılaştırma:

    • Comparable arayüzü: compareTo(T other) metodunu tanımlar ve kendi sınıfındaki nesnelerin diğer nesnelerle karşılaştırılmasını sağlar. Negatif, sıfır veya pozitif değer döndürür, bu da nesnenin diğerine göre küçük, eşit veya büyük olduğunu gösterir.
    public class MyObject implements Comparable<MyObject> {
        private int value;
    
        //... yapıcı ve getterlar
    
        @Override
        public int compareTo(MyObject other) {
            return Integer.compare(this.value, other.value);
        }
    }
    
    • Comparator arayüzü: Herhangi bir nesne için özel karşılaştırma mantığını tanımlamaya olanak tanır, hatta bu nesneler Comparable implement etmese bile. Bu, farklı sıralama veya karşılaştırma mantıklarına ihtiyaç duyulduğunda veya orijinal sınıfı değiştirmek mümkün olmadığında kullanışlıdır.
    import java.util.Comparator;
    
    public class MyObjectValueComparator implements Comparator<MyObject> {
        @Override
        public int compare(MyObject obj1, MyObject obj2) {
            return Integer.compare(obj1.getValue(), obj2.getValue());
        }
    }
    

Karşılaştırma yöntemi seçimi, belirli göreve bağlıdır: nesnelerin kimliğini kontrol etmek için ==, içeriğin eşitliğini kontrol etmek için equals(), ve sıralama veya karmaşık karşılaştırmalar için Comparable/Comparator kullanılır.