OCA Java imtahan mövzuları

Understanding Equality

== operatoru ilə iki referansı müqayisə etdikdə hər iki referansın da eyni obyektə işarə edib etmədiyini müqayisə edir. equals() metodu ilə müqayisə etdikdə isə referansların dəyərlərini bir-biri ilə müqayisə edir. String classi equals() metodunu override edir deyə eyni dəyərə malik iki Stringi equals() ilə müqayisə etdikdə nəticə true verir. Ancaq StringBuilder classı equals() metodunu override etmir, ona görə də eyni dəyərə malik StringBuilder referanslarını equals() ilə müqayisə etdikdə nəticə false verir. Ümumiyyətlə əgər hər hansı bir class equals() metodunu override etmirsə, həmin classın referansı üzərindən equals() metodu çağırılsa, bu zaman Object classının equals() metodu çağırılır. Çünki bütün classlar aşkar şəkildə qeyd olunmasa da Object classından törəmədirlər və onun metodlarını varis alırlar. Bu mövzu Chapter 5’də ayrıca izah ediləcəkdir, hələlik isə bilməniz yetərlidir ki, Object classının equals() metodu dəyərləri müqayisə etmir, referansları müqayisə edir. Əgər referanslar eyni obyektə işarə edirsə, true qaytarır, digər hallarda isə false qaytarır.

Book classı göründüyü kimi equals() metodunu override etmir, belə olan halda bu class üçün == equals() eyni cür işləyir və eyni nəticəni verir.

İndi isə String StringBuilder ilə bağlı nümunələrə baxaq.

StringBuilder example:

String example:

String immutable`dır və String literal dəyərləri String Pool’da saxlanılır. JVM yaddaşda eyni literaldan ancaq bir ədəd yaradır. Yuxarıdakı nümunədə "Hello World" bir dəfə yaradılır pool`da saxlanılır. x y referanslarının hər ikisi də həmin o obyektə işarə edir.

" Hello World".trim(); literal dəyər olmadığından pool`da saxlanılmır, ona görə də x z eyni obyektə işarə etmirlər, amma eyni dəyərə malikdirlər. Burada da incə bir məqam var, aşağıdakı kod nümunəsinə baxaq:

Bu mövzu ətraflı şəkildə coderanch forumunda müzakirə edilib:

http://www.coderanch.com/t/652234/ocajp/certification/Understanding-Equality-page-Java-OCA

 

String metodlar üzərindən bəzi nümunələrə baxaq:

Output:

  • substring:  test==test returns true
    replace1:   test==test returns false
    replace2:   test==test returns true
    trim1:      test==test returns true
    trim2:      test==test returns false
    toString:   test==test returns true

P.S. replace() char ilə olanda true qaytarır.

 

Primitiv wrapper classların (Integer, Double, Float və s.) equals() metodu ilə istifadəsi zamanı aşağıdakı 3 qayda keçərlidir:

  1. symmetric  ⇒  a.equals(b) ilə b.equals(a) eyni nəticəni qaytarır;
  2. transitive   ⇒   əgər a.equals(b)b.equals(c) geriyə true qaytarırsa, o zaman a.equals(c)true qaytaracaq;
  3. reflexive     ⇒   a.equals(a) geriyə true qaytarır.

Aşağıdakı şəkildəki suala Enthuware test bankında rast gələcəksiniz. İmtahanda əvvəllər “drag-drop” tipli suallar olsa da hazırda bu formatda suallar imtahan testlərindən çıxarılıb. Amma bu sualın içərisində maraqlı məqamlar var, faydalı olacağından qeyd etməyi zəruri bildim.

enthuware-equality-in-java

  • i1 == i2 – geriyə false qaytarır, çünki referanslar fərqli obyektlərə işarə edir.
  • i1 == i3 – geriyə true qaytarır, çünki i3 primitiv tipdə olduğundan i1 “unboxed” edilərək primitiv tipə çevirilir və sonra müqayisə aparılır.
  • i1 == b1 – compile olunmur, çünki i1 b1 referansları eyni ierarxiyada olmayan classlara məxsusdur və compiler compile zamanı bunu tutur və başa düşür ki, bu referanslar eyni obyektə işarə edə bilməzlər.
  • i1.equals(i2) –  geriyə true qaytarır, çünki hər ikisi Integer obyektidir və dəyərləri də eynidir.
  • i1.equals(b1)i1.equals(g1) – geriyə false qaytarır, çünki müqayisə olunan dəyərlər fərqli classlara aiddir. == ilə müqayisədən fərqli olaraq equals() ilə müxtəlif classlara işarə edən referansların müqayisəsi zamanı compile xətası baş vermir, çünki equals() metodu parametr olaraq Object tipi qəbul edir. Bütün wrapper classların equals() metodunun gövdəsində ilk olaraq müqayisə edilən obyektlərin eyni classa aid olub olmadığı yoxlanılır. Əgər eyni classa aid deyilsə, o zaman dəyərlərin yoxlanılması aparılmır, birbaşa false qaytarılır. Integer metodunun equals() metoduna baxsaq bu proses aydın olacaq:
 

Wrapper classlar ilə bağlı digər maraqlı bir nümunəyə Coderanch forumunda rast gələ bilərsiniz:

 

Əlavə olaraq aşağıdakı nümunələrə baxmağınızda da fayda var:

 

Bütün mövzulara bax

About the author

Mushfiq Mammadov

Leave a Comment

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.