CodeGym /Kurslar /Java SELF AZ /Referansların müqayisəsi

Referansların müqayisəsi

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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 yaddaşda yerləşməsi

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:

Sətir referanslarının təyin edilməsi

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ə textmessage 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:

İstinadlarla və obyektlərlə iş

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:

İstinadlarla və obyektlərlə iş. Scanner

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:

String tipli obyektlərin havalalarının müqayisəsi

messagetext dəyişənləri bir və eyni obyektin adresini (havalasını) saxlayır. Ancaq s1s2 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ış
String text = "Salam";
String message = text;
String s1 = text.toUpperCase();
String s2 = text.toUpperCase();
System.out.println(text == message);
System.out.println(text == s1);
System.out.println(s1 == s2); 




true  // adreslər bərabərdir
false // adreslər fərqlidir
false // adreslər fərqlidir

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