1. Müqayisələr
Çox vaxt proqramçı müxtəlif dəyişənləri bir-biri ilə müqayisə etməli olur. Və, necə ki, artıq buna əmin oldunuz, hər şey o qədər də sadə deyil.
Tam ədədləri müqayisə etmək çox asandır — sadəcə olaraq ==
istifadə edin və vəssalam. Əsas ədədləri müqayisə etmək üçün isə onların fərqini (əslində fərqin modulu) çox kiçik bir ədəd ilə müqayisə etməli olacaqsınız.
Sətirlərin müqayisəsi daha çətindir. Bunun səbəbi isə birincisi, sətirlər obyektlərdir, ikincisi isə vəziyyətdən asılı olaraq proqramçının çox vaxt sətirlərin müqayisəsinin bir az fərqli cür (müəyyən faktorları nəzərə alaraq və ya nəzərə almamaqla) aparılmasını istəməsidir.
2. Mətnlərin yaddaşda yerləşməsi
Artıq görmüsünüz ki, mətnlər yaddaşda tam ədədlər və ya onluq ədədlər kimi saxlanmır:
Mətnlərin saxlanması üçün iki yaddaş bloku istifadə olunur: bir blok mətnin özünü saxlayır (onun ölçüsü mətnin ölçüsündən asılıdır), digər blok (4 bayt ölçüsündə) birinci blokun ünvanını saxlayır.
Təcrübəli proqramçı belə vəziyyətdə " str
dəyişəni String
tipli obyektə referensiya saxlayır" kimi bir şey deyəcək.
3. Sətir referanslarının təyin edilməsi
Bu yanaşmanın faydası aydın olur, əgər bir sətir dəyişəninə başqa bir sətir dəyişəni təyin etmək lazım olarsa. Misal:
String text = "Bu çox vacib bir mesajdır";
String message = text;
Bunun nəticəsində yaddaşda belə bir şey yaranacaq:

Bu təyinetmə əməliyyatının nəticəsində String
obyekti olduğu yerdə qalacaq, amma dəyişən message
yalnız onun ünvanını (obyektə referansı) köçürəcək.
4. İstinadlarla və obyektlərlə iş
Amma əgər siz sətiri böyük hərflərə (baş hərflərə) çevirmək istəsəniz, Java-maşın hər şeyi düzgün edəcək: sizdə String
tipində iki obyekt olacaq, və text
və message
dəyişənləri istinadları saxlayacaq: hər biri öz obyektinə.
Nümunə:
String text = "Bu çox vacib mesajdır";
String message = text.toUpperCase();
Nəticədə yaddaşda belə olacaq:
Nəzərinizə çatdırım ki, toUpperCase()
metodu çağırıldığı sətiri dəyişdirmir. Bunun yerinə yeni bir sətir (yeni obyekt) yaradır və onun istinadını qaytarır.
Və ya daha maraqlı bir nümunə. Tutaq ki, sətiri Scanner
tipli obyektə ötürmək qərarına gəlmisiniz (hansı ki, ondan dəyərləri oxuyacaq).
Nümunə:
String text = "10 20 40 80";
Scanner console = new Scanner(text);
int a = console.nextInt();
int b = console.nextInt();
Scanner
sinfinin işi haqqında daha ətraflı məlumatı buradan öyrənə bilərsiniz.
Baxın, bu yaddaşda necə saxlanılır:
Bu zaman String
tipli obyekt yaddaşda necə yeganə nümunədə idisə, elə də qalır — hər yerdə yalnız ona istinadlar ötürülür və saxlanılır.
5. String
tipli obyektlərin havalalarının müqayisəsi
Və nəhayət, ən maraqlısına gəldik — sətirlərin müqayisəsi.
Sətir dəyişənlərini müqayisə etmək üçün iki operator istifadə edilə bilər: ==
(bərabərdir) və !=
(bərabər deyil). "Daha böyük", "daha kiçik", "daha böyük və ya bərabər" operatorlarından istifadə etmək olmaz — kompilyator icazə verməyəcək.
Ancaq bir maraqlı məqam var: sətir dəyişənlərində nə saxlanılır? Düzdür: obyektlərin adresləri (havalaları). Elə məhz bu adreslər müqayisə olunacaq:
String text = "Salam";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
Yaddaşda bu şəkildə olacaq:
message
və text
dəyişənləri bir və eyni obyektin adresini (havalasını) saxlayır. Ancaq s1
və s2
dəyişənləri çox oxşar obyektlərin havalalarını saxlayır, amma eyni obyektin havalaları deyil.
Və əgər bu 4 dəyişəni kodda müqayisə etsəniz, aşağıdakı nəticəni alacaqsınız:
Kod | Ekrana çıxış |
---|---|
|
|
GO TO FULL VERSION