1. İstinadların və məzmunun müqayisəsi
Java-da sətirlər — primitiv deyil, obyektdir. Siz a və b 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” |
|---|---|---|
|
Bəli | |
|
Xeyr | |
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ə
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() və 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" və 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.
GO TO FULL VERSION