JavaRush /Java Blogu /Random-AZ /Java tərtibatçısı üçün müsahibələrdən alınan sualların və...

Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili. 11-ci hissə

Qrupda dərc edilmişdir
Salam! Kursu olmayan ən sürətli gəmi belə dalğalar boyunca sürüklənəcək. Əgər indi mənim məqaləmi oxuyursansa, mütləq məqsədin var. Əsas odur ki, azmaq deyil, öz xəttini sona qədər davam etdirmək - Java tərtibatçısı olmaqdır. Bu gün mən Java tərtibatçıları üçün 250+ sualın təhlilini davam etdirmək istəyirəm ki, bu da sizə nəzəriyyədəki bəzi boşluqları örtməyə kömək edəcək. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-1 hissə

97. Bərabərləri yenidən təyin edərkən müqavilənin yenidən müəyyən edilməsi şərtləri qoyulurmu?

Yenidən təyin edilmiş equals() metodu aşağıdakı şərtlərə (qaydalara) uyğun olmalıdır:
  • refleksivlik - istənilən x dəyəri üçün x.equals(x) kimi ifadə həmişə doğru qaytarmalıdır ( x != null olduqda ).

  • simmetriya - xy- nin istənilən qiymətləri üçün x.equals(y) formasının ifadəsi yalnız y.equals(x) true qaytardıqda doğru qaytarmalıdır .

  • tranzitivlik - x , yz hər hansı dəyərləri üçün , əgər x.equals(y) doğruy.equals(z)doğru qaytarırsa , o zaman x.equals(z) doğru qaytarmalıdır .

  • ardıcıllıq - hər hansı xy dəyərləri üçün x.equals(y) -a təkrar edilən zəng həmişə iki obyekti müqayisə etmək üçün istifadə olunan sahələr zənglər arasında dəyişməzsə, əvvəlki çağırışın dəyərini bu metoda qaytaracaq. .

  • müqayisə null - istənilən x dəyəri üçün x.equals(null) çağırışı false qaytaracaq .

98. Equals və HashCode-u ləğv etməsəniz nə baş verir?

Bu halda hashCode() verilmiş obyektin saxlandığı yaddaş yeri əsasında yaradılan nömrəni qaytaracaq. Yəni, tamamilə eyni sahələri olan iki obyekt, ləğv edilməmiş hashCode() çağırarkən fərqli dəyərlər alacaq (axı onlar müxtəlif yaddaş yerlərində saxlanılır). Qaytarılmamış equals() istinadları müqayisə edir ki, onların eyni obyekti göstərib-göstərmədiyinə baxın. Yəni, müqayisə == vasitəsilə aparılır və eyni sahələrə malik obyektlər halında o, həmişə false qaytaracaq . True yalnız eyni obyektə istinadları müqayisə edərkən olacaq. Bəzən bu üsullara üstünlük verməməkdə məntiq var. Məsələn, siz müəyyən bir sinifin bütün obyektlərinin unikal olmasını istəyirsiniz və bu metodları ləğv etmək yalnız unikallıq məntiqini pozacaq. Əsas odur ki, ləğv edilmiş və ləğv edilməyən metodların nüanslarını başa düşmək və vəziyyətdən asılı olaraq hər iki yanaşmadan istifadə etməkdir.

99. Niyə simmetriya yalnız x.equals(y) doğru olduqda doğrudur?

Bir az qəribə sual. Əgər A obyekti B obyektinə bərabərdirsə, B obyekti A obyektinə bərabərdir. Əgər B obyekti A obyektinə bərabər deyilsə, bunun əksi necə mümkündür? Bu sadə məntiqdir. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-2 hissə

100. HashCode-da toqquşma nədir? Bununla necə məşğul olmaq olar?

HashCode toqquşması iki fərqli obyektin eyni hashCode dəyərinə malik olduğu bir vəziyyətdir . Bu necə mümkündür? Məsələ burasındadır ki, hashcode Tam ədəd növünə uyğunlaşdırılıb və bu da öz növbəsində -2147483648 ilə 2147483647, yəni təxminən 4 milyard fərqli tam ədədə malikdir. Bu diapazon böyükdür, lakin sonsuz deyil. Buna görə də, iki tamamilə fərqli obyektin eyni hash kodu olduqda vəziyyətlər mümkündür. Bu çox az ehtimaldır, lakin mümkündür. Zəif tətbiq edilmiş hash funksiyası eyni hash kodlarının tezliyini də artıra bilər, məsələn, kiçik diapazonda nömrələri qaytaracaq və bu da toqquşma şansını artıracaqdır. Toqquşma ilə mübarizə aparmaq üçün həshCode metodunu yaxşı tətbiq etməlisiniz ki, dəyərlərin yayılması maksimum olsun və dəyərlərin təkrarlanma şansı minimal olsun.

101. HashCode müqaviləsində iştirak edən element öz dəyərini dəyişərsə nə baş verir?

Əgər hash kodunun hesablanmasında iştirak edən element dəyişdirilibsə, o zaman obyektin özünün hash kodu dəyişdiriləcək (əgər hash funksiyası yaxşıdırsa). Buna görə də, HashMap -də dəyişməz (dəyişməz) obyektlərdən açar kimi istifadə etmək tövsiyə olunur, çünki yaradıldıqdan sonra onların daxili vəziyyətini (sahələrini) dəyişmək mümkün deyil. Müvafiq olaraq, onların hash kodu da yaradıldıqdan sonra çevrilmir. Dəyişən obyekti açar kimi istifadə etsəniz, bu obyektin sahələrini dəyişdirdiyiniz zaman onun hash kodu dəyişəcək və nəticədə siz bu cütü HashMap- da itirə bilərsiniz . Axı o, orijinal hash kodu üçün kovada saxlanacaq və onu dəyişdirdikdən sonra başqa bir vedrədə axtarılacaq. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-3-cü hissə

102. String adı və int yaş sahələrindən ibarət olan Student sinfi üçün Equals və HashCode metodlarını yazın.

public class Student {
int age;
String name;

 @Override
 public boolean equals(final Object o) {
   if (this == o) {
     return true;
   }
   if (o == null || this.getClass() != o.getClass()) {
     return false;
   }

   final Student student = (Student) o;

   if (this.age != student.age) {
     return false;
   }
   return this.name != null ? this.name.equals(student.name) : student.name == null;
 }

 @Override
 public int hashCode() {
   int result = this.age;
   result = 31 * result + (this.name != null ? this.name.hashCode() : 0);
   return result;
 }
}
Bərabərdir:
  • Birincisi, biz birbaşa əlaqələri müqayisə edirik, çünki bağlantılar eyni obyektə aiddirsə, yoxlamanı davam etdirməyin mənası nədir? Onsuz da hər şey doğru olacaq .

  • Null və uyğun sinif növləri üçün yoxlanılır, çünki obyekt null və ya başqa bir növ arqumentdirsə, bu o deməkdir ki, obyektlər bərabər deyil - false .

  • Arqument obyektinin bir növə ötürülməsi (əgər o, ana tipli obyektdirsə).

  • İbtidai sinif sahəsinin müqayisəsi (hər şeydən sonra bunun üçün =! vasitəsilə müqayisə kifayətdir ), əgər sahə bərabər deyilsə - false .

  • Qeyri-primitiv sahənin null və bərabərlik üçün yoxlanılması ( String -də metod ləğv edilib və düzgün müqayisə ediləcək), əgər hər iki sahə null və ya bərabərdirsə , yoxlama başa çatır və metod true qaytarır .

HashCode:
  • İlkin hash kodu dəyərinin obyektin yaş primitivinə təyin edilməsi .

  • Cari hash kodunu 31-ə vurmaq (daha çox yayılmaq üçün) və ona qeyri-primitiv sətir sahəsinin hash kodunu əlavə etmək (əgər boş deyilsə).

  • Nəticənin qaytarılması.

  • Bu hash kodunun ləğvi nəticəsində eyni adint dəyərləri olan obyektlər həmişə eyni dəyəri qaytaracaq.

103. if (obj instanceof Student) və if (getClass() == obj.getClass()) istifadə etmək arasında fərq nədir?

Gəlin hər bir yanaşmanın nə etdiyinə baxaq:
  • instanceof sol tərəfdəki obyekt istinadının sağ tərəfdəki növün nümunəsi və ya onun bəzi alt növü olub olmadığını yoxlayır.

  • getClass() == ... növün eyniliyini yoxlayır.

Yəni getClass() sinfin tam identikliyini yoxlayırsa, instanceof obyekt sadəcə alt tip olsa belə doğru qaytaracaq və bu, polimorfizmdən aktiv istifadə edərkən bizə daha çox çeviklik verə bilər. Əslində, onların işinin xüsusiyyətlərini başa düşsəniz və lazımi yerlərdə tətbiq etsəniz, hər iki yanaşma yaxşıdır.

104. Clon() metodunun qısa təsvirini verin.

Clone() obyekt sinfinin metodudur , məqsədi cari obyektin (cari obyektin surəti) klonunu yaratmaq və qaytarmaqdır. Onu istifadə etmək üçün CloneableJava tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-4-cü hissə marker interfeysini tətbiq etməlisiniz :
Student implements Cloneable
clone() metodunun özünü ləğv edin :
@Override
protected Object clone() throws CloneNotSupportedException {
 return super.clone();
}
Axı, Obyekt sinfində qorunur, yəni yalnız Tələbə sinfinin özündə görünəcək , lakin kənardan siniflərə görünməyəcək.

105. İstinad tipli obyektin sahələri ilə işləyən clone() metodunun özəlliyi nədən ibarətdir?

Obyektləri klonlayarkən yalnız primitiv dəyərlər və obyekt istinadlarının dəyəri kopyalanır. Bu o deməkdir ki, əgər obyektin daxili sahəsində başqa obyektlə əlaqəsi varsa, onda yalnız bu keçid klonlaşdırılacaq, lakin bu digər obyektin özü klonlaşdırılmayacaq. Əslində, bunu səthi klonlaşdırma adlandırırlar. Yaxşı, bütün yuvalanmış obyektlərin klonlaşdırılması ilə tam hüquqlu klonlamaya ehtiyacınız varsa nə olacaq? Bunların əlaqələrin surətləri deyil, yığındakı digər işğal edilmiş yaddaş hüceyrələri olan obyektlərin tam hüquqlu klonları olduğuna necə əmin olmaq olar? Əslində, hər şey olduqca sadədir - bunun üçün bu daxili obyektlərin hər bir sinfində clone() metodunu da ləğv etməli və marker interfeysi əlavə etməlisiniz - Cloneable . Onda kopyalanacaq obyektlərə istinadlar deyil, obyektlərin özləri olacaq, çünki indi onların da özlərini kopyalamaq imkanı var.

İstisnalar

106. Səhv və istisna arasında fərq nədir?

Həm istisnalar, həm də səhvlər Throwable sinfinin alt sinifləridir . Bununla belə, onların öz fərqləri var. Səhv, əsasən sistem resurslarının qeyri-kafi olması səbəbindən yaranan problemi göstərir. Və tətbiqimiz bu tip problemləri aşkar etməməlidir. Səhvlərin bəzi nümunələri sistem qəzası və yaddaş çatışmazlığı xətasıdır. Səhvlər yoxlanılmamış tipdə olduğu üçün əsasən icra zamanı baş verir. Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-5-ci hissəİstisnalar icra zamanı və tərtib zamanı baş verə biləcək problemlərdir. Adətən bu, tərtibatçılar tərəfindən yazılmış kodda olur. Yəni, istisnalar daha çox proqnozlaşdırıla biləndir və tərtibatçılar olaraq bizdən daha çox asılıdır. Eyni zamanda, səhvlər daha təsadüfi və bizdən daha müstəqildir, əksinə, tətbiqimizin işlədiyi sistemin özü ilə bağlı problemlərdən asılıdır.

107. Yoxlanmış və yoxlanılmış, istisna, atma, atma arasında fərq nədir.

Əvvəldə dediyim kimi, istisna proqramın icrası zamanı və tərtibatçının yazdığı kodda (bəzi qeyri-normal vəziyyətə görə) baş vermiş səhvdir. Yoxlanmış hər zaman cəhd-tutmaq mexanizmindən istifadə edilməli və ya yuxarıdakı üsullara atılmalı olan bir istisna növüdür . Metod tərəfindən atılan mümkün istisnaları göstərmək üçün metodun başlığında Throws istifadə olunur. Yəni yuxarıdakı üsullara istisnaların “atılması” mexanizmi budur. Yoxlanılmamış, idarə edilməsinə ehtiyac olmayan və adətən daha az proqnozlaşdırıla bilən və baş vermə ehtimalı az olan istisna növüdür. Ancaq istəsən, onlar da emal edilə bilər. İstisna əl ilə atılarkən Throw istifadə olunur, məsələn:
throw new Exception();

108. İstisnaların iyerarxiyası hansıdır?

İstisnalar iyerarxiyası çox böyük və genişdir, hətta burada onun haqqında hər şeyi danışmaq üçün çox genişdir. Buna görə də, biz yalnız onun əsas əlaqələrini nəzərdən keçirəcəyik: Java tərtibatçısı üçün müsahibələrdən alınan sualların və cavabların təhlili.  11-6 hissəBurada iyerarxiyanın ən yuxarı hissəsində sinfi görürük - Atılan - ümumi sinif, istisna iyerarxiyasının əcdadı, o da öz növbəsində bölünür:
  • Səhv - kritik, yoxlanılmayan səhvlər.
  • İstisna - yoxlanılan istisnalar.
İstisna müxtəlif yoxlanılmamış iş vaxtı istisnalarına və müxtəlif yoxlanılmış istisnalara bölünür.

109. Yoxlanılan və qeyd olunmayan istisna nədir?

Daha əvvəl dediyim kimi:
  • Yoxlanmışdır - bir şəkildə idarə etməli olduğunuz istisnalar, yəni onları ya sınaq blokunda emal edin , ya da yuxarıdakı üsula "irəli" göndərin. Bunu etmək üçün metod imzasında, metod arqumentlərini sadaladıqdan sonra, metodun istifadəçilərinə metodun bu istisnanı (xəbərdarlıq kimi bir şey) ata biləcəyini göstərən trows <istisna növü> açar sözündən istifadə etməlisiniz. bu metodun istifadəçiləri üçün istisnaları idarə etmək məsuliyyəti.

  • Yoxlanılmamış - tərtib zamanı yoxlanılmadığı və bir qayda olaraq daha gözlənilməz olduğu üçün idarə edilməsinə ehtiyac olmayan istisnalar. Yəni yoxlanılandan əsas fərq ondan ibarətdir ki, onlar üçün bu cəhd-tutma və ya atma mexanizmləri eyni işləyir, lakin onlar məcburi deyil.

101. Metodun try-catch blokunda istisnanın tutulması və işlənməsi nümunəsini yazın.

try{                                                 // начало блока перехвата
 throw new Exception();                             // ручной бросок исключения
} catch (Exception e) {                              // данное исключение и его потомки будут перехватываться
 System.out.println("Упс, что-то пошло не так =("); // вывод некоторого исключения в консоль
}

102. Öz istisnalarınızdan istifadə edərək, bir istisnanın tutulması və idarə olunması nümunəsini yazın

Əvvəlcə, İstisnadan miras qalan və konstruktorunu xəta mesajı ilə əvəz edən öz istisna sinifimizi yazaq :
public class CustomException extends Exception {

 public CustomException(final String message) {
   super(message);
 }
}
Yaxşı, onda biz onu əl ilə atacağıq və əvvəlki sualdakı kimi kəsəcəyik:
try{
 throw new CustomException("Упс, что-то пошло не так =(");
} catch (CustomException e) {
 System.out.println(e.getMessage());
}
Yenə də onu işə saldığınız zaman konsola aşağıdakı çıxışı alacaqsınız:
Vay, nəsə xəta baş verdi =(
Разбор вопросов и ответов с собеседований на Java-разработчика. Часть 11 - 7İstisnalar haqqında daha çox məlumatı burada tapa bilərsiniz . Yaxşı, bu gün üçün hamısı budur! Növbəti hissədə görüşənədək!
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION