CodeGym /Kurslar /JAVA 25 SELF /Sətirlərin müqayisəsi: equals, equalsIgnoreCase, compareT...

Sətirlərin müqayisəsi: equals, equalsIgnoreCase, compareTo

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

1. İstinadların və məzmunun müqayisəsi

Java-da sətirlər — primitiv deyil, obyektdir. Siz ab dəyişənlərini yazdığınızda, onlar sətir hovuzunda eyni sətirə işarə edə bilərlər. Konstruktor vasitəsilə yaradılan c isə artıq başqa bir obyekt olur. == operatoru məhz istinadları müqayisə edir, mətni deyil.

String a = "hello";
String b = "hello";
String c = new String("hello");

System.out.println(a == b); // true (çox güman ki, internləşdirilmiş sətir)
System.out.println(a == c); // false (fərqli obyektlər)

Xətanın nümayişi

String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1 == s2); // false

Sətirlər eyni görünməsinə baxmayaraq, yaddaşda fərqli obyektlərdir.

2. equals(): sətirlərin məzmununun müqayisəsi

Məhz məzmunu müqayisə etmək üçün equals() metodundan istifadə edin — o, sətirləri simvol-simvol (böyük/kiçik hərfə həssas) müqayisə edir.

String s1 = "Java";
String s2 = new String("Java");
System.out.println(s1.equals(s2)); // true

Nümunə: parolların müqayisəsi

String inputPassword = "Secret123";
String realPassword = "Secret123";
if (inputPassword.equals(realPassword)) 
{
    System.out.println("Girişə icazə verildi!");
} 
else 
{
    System.out.println("Parol yanlışdır.");
}

Vacibdir!

Əgər obyektlərdən ən azı biri null-dursa, equals() çağırışı NullPointerException-a səbəb olacaq. Təhlükəsiz şablon:

if ("nəsə".equals(someString)) { ... }

3. equalsIgnoreCase(): registri nəzərə almadan müqayisə

Registri görməməzliyə vurmaq vacib olduqda (məsələn, istifadəçi girişi), equalsIgnoreCase() istifadə edin.

String name1 = "Ivan";
String name2 = "ivan";
System.out.println(name1.equalsIgnoreCase(name2)); // true

Nümunə: e-poçt ünvanlarının müqayisəsi

String email1 = "User@Example.com";
String email2 = "user@example.com";
if (email1.equalsIgnoreCase(email2))
{
    System.out.println("E-poçt ünvanları üst-üstə düşür!");
}

Qısa: equals və equalsIgnoreCase

Metod Böyük/kiçik hərfə həssasdirmi? Nümunə “Java” vs “java”
equals()
Bəli
false
equalsIgnoreCase()
Xeyr
true

4. compareTo(): sətirlərin leksikoqrafik müqayisəsi

Metod compareTo() leksikoqrafik müqayisə (sözlük sırası) aparır. Birinci sətir “kiçik”dirsə, mənfi ədəd qaytarır, 0 — bərabərdir, müsbət — “böyük”dürsə.

System.out.println("apple".compareTo("banana")); // < 0
System.out.println("apple".compareTo("apple"));  // 0
System.out.println("banana".compareTo("apple")); // > 0

a.compareTo(b) →
   < 0 — əgər a, b-dən əvvəl gəlirsə
   0   — əgər bərabərdirsə
   > 0 — əgər a, b-dən sonra gəlirsə
Leksikoqrafik müqayisə: compareTo() nəticəsi

Bu necə işləyir?

  • Müqayisə soldan sağa, simvolların Unicode kodlarına görə aparılır.
  • İlk fərq tapılan kimi simvolların kodları arasındakı fərq qaytarılır.
  • Əgər bir sətir digərinin prefiksi olsa, daha qısa olan “kiçik” sayılır.
System.out.println("cat".compareTo("catalog")); // < 0 ("cat" daha qısadır)
System.out.println("catalog".compareTo("cat")); // > 0

Nümunə: sətir massivinin çeşidlənməsi

String[] fruits = {"banana", "apple", "pear"};
Arrays.sort(fruits); // daxildə compareTo() istifadə olunur
System.out.println(Arrays.toString(fruits)); // [apple, banana, pear]

compareToIgnoreCase()

System.out.println("Java".compareToIgnoreCase("java")); // 0

5. startsWith() və endsWith() metodları

startsWith()endsWith() metodları sətirin başlanğıcını və sonunu yoxlayır, true/false qaytarır.

String fileName = "document.pdf";
String url = "https://www.google.com";

System.out.println(fileName.startsWith("doc"));  // true
System.out.println(fileName.endsWith(".txt"));   // false
System.out.println(url.startsWith("https://"));  // true

Bunun nə üçün lazımdır: formatların (fayl adları, URL-lər) doğrulanması və prefiks/suffikslərə görə filtrasiya (məsələn, bütün ".jpg" faylları).

6. contains() metodu: alt sətir axtarışı

contains(CharSequence s) — alt sətirin olub-olmadığını yoxlamağın sadə yoludur. Registrə həssasdır.

String text = "Java dünyasına xoş gəldiniz!";
System.out.println(text.contains("dünya"));   // true
System.out.println(text.contains("C++"));   // false

Registri nəzərə almamaq üçün hər iki sətiri eyni registrə çevirin: toLowerCase()/toUpperCase().

7. toLowerCase() və toUpperCase() metodları

Yeni sətir nüsxəsi qaytarırlar: biri kiçik, digəri böyük hərflərə çevrilmiş. Registrdən asılı olmayan müqayisə və formatlama üçün faydalıdır.

String title = "Java Programming";
String lower = title.toLowerCase();
String upper = title.toUpperCase();

System.out.println(lower); // java programming
System.out.println(upper); // JAVA PROGRAMMING

8. split() metodu: sətiri hissələrə bölmək

split(String regex) sətiri ayırıcıya (müntəzəm ifadə) görə bölür və String[] massivini qaytarır.

Nümunə 1: vergüllərə görə

String names = "Alex,Maria,Ivan,Elena";
String[] nameArray = names.split(",");
for (String name : nameArray) 
{
    System.out.println(name.trim()); // trim() mümkün boşluqları silir
}
// Çıxış:
// Alex
// Maria
// Ivan
// Elena

Nümunə 2: boşluqlara görə

String sentence = "Mən Java öyrənirəm";
String[] words = sentence.split(" ");
for (String word : words) 
{
    System.out.println(word);
}
// Çıxış:
// Mən
// Java
// öyrənirəm

Xüsusiyyətlər:

  • Ayırıcı — regex-dir. Xüsusi simvolları qaçırmaq (escape) lazımdır (məsələn, nöqtə: "\\.").
  • Metod həmişə massiv qaytarır, hətta bir elementdən ibarət olsa belə.

9. Təcrübə: real tətbiqdə sətirlərin müqayisəsi

String registeredEmail = "user@example.com";
String registeredPassword = "Secret123";

Scanner console = new Scanner(System.in);

System.out.print("E-poçtu daxil edin: ");
String email = console.nextLine();

System.out.print("Parolu daxil edin: ");
String password = console.nextLine();

// E-poçtu registri nəzərə almadan, parolu isə registri nəzərə alaraq müqayisə edirik
if (email.equalsIgnoreCase(registeredEmail) && password.equals(registeredPassword))
{
    System.out.println("Xoş gəldiniz!");
}
else
{
    System.out.println("Yanlış e-poçt və ya parol.");
}

Şərhlər: e-poçt üçün equalsIgnoreCase(), parol üçün isə ciddi equals() istifadə olunur. Sətirlər üçün == operatorundan istifadə etmək olmaz — o, istinadları müqayisə edir.

10. Sətirləri müqayisə edərkən tipik səhvlər

Səhv №1: Sətirləri == ilə equals() əvəzinə müqayisə etmək
== operatoru istinadları müqayisə edir, məzmunu yox, buna görə nəticə gözlənilməz ola bilər.

Səhv №2: equals() metodunu null ola bilən obyekt üzərində çağırmaq
Metodu mütləq null olmayan obyekt üzərində çağırın və ya Objects.equals(a, b) istifadə edin.

Səhv №3: Vacib olduqda registri nəzərə almamaq
Məsələn, parollar registr nəzərə alınmaqla müqayisə edilməlidir. Tələbləri dəqiqləşdirin.

Səhv №4: Sətirlərin digər tip obyektlərlə müqayisəsi
"123"123 eyni şey deyil. equals() tipləri avtomatik çevirmir.

Səhv №5: Fərqli registrli sətirlərin çeşidlənməsi
Böyük hərflər kiçiklərdən əvvəl gəlir. Registri nəzərə almadan çeşidləmək üçün Arrays.sort(array, String.CASE_INSENSITIVE_ORDER) istifadə edin.

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION