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. 2-ci hissə

Qrupda dərc edilmişdir
Hər kəsə bir daha salam! Biz Junior, Middle və Senior developers üçün 250+ suala cavab axtarmağa davam edirik . Suallar olduqca maraqlıdır və mən özüm onları təhlil etməyi xoşlayıram: belə məqamlarda nəzəri biliklərdə və ən gözlənilməz yerlərdə boşluqlar aşkar edə bilərsiniz. Əvvəlki hissəni bu məqalədəMüsahibə suallarının və cavablarının təhlili.  Hissə 2 - 1 tapa bilərsiniz . Ancaq başlamazdan əvvəl sizə xatırlatmaq istəyirəm:
  1. Bir daha məlumatı təkrarlamamaq üçün bu məqalələr silsiləsi ilə kəsişən sualları atlayacağam. Bu materialları oxumağı məsləhət görürəm, çünki onlar ən çox yayılmış (məşhur) Java Core müsahibə suallarını ehtiva edir.
  2. DOU ilə bağlı suallar ukrayna dilində təqdim olunur, amma burada hər şey rus dilində olacaq.
  3. Cavabları daha təfərrüatlı təsvir etmək olar, amma mən yazmayacağam, o vaxtdan hər bir sualın cavabı bütöv bir məqaləni götürə bilər. Və heç bir müsahibədə sizdən bu qədər ətraflı soruşmayacaqlar.
Lazım gələrsə, daha dərindən öyrənmək üçün keçidlər buraxacağam. Gəlin uçaq!

11. Object sinfinin bütün metodlarını adlandırın

Obyekt sinifinin 11 metodu var:
  • Class<?> getClass() — cari obyektin sinfinin alınması;
  • int hashCode() — cari obyektin hash kodunun alınması;
  • boolean equals​(Object obj) - cari obyektin digəri ilə müqayisəsi;
  • Object clone() - cari obyektin surətinin yaradılması və qaytarılması;
  • String toString() — obyektin sətir təsvirinin alınması;
  • void notify() - bu obyektin monitorunda gözləyən bir mövzunun oyanması (mövzu seçimi təsadüfi);
  • void notifyAll() - bu obyektin monitorunda gözləyən bütün mövzuları oyadır;
  • void wait() - cari telini cari monitorda gözləmə rejiminə keçir (dondurur), bəziləri xəbərdar edənə və ya notifyAll mövzunu oyandırana qədər yalnız sinxronlaşdırılmış blokda işləyir;
  • etibarsız gözləmə(uzun fasilə) - cari monitorda (cari sinxronlaşdırılmışda) cari mövzunu da dondurur, lakin bu vəziyyətdən çıxmaq üçün bir taymerlə (və ya yenidən: bildiriş və ya bildiriş oyanana qədər);
  • void wait(uzun zaman aşımı, int nanos) - yuxarıda təsvir edilən metoda oxşar, lakin donmadan çıxmaq üçün daha dəqiq taymerlərlə;
  • void finalize() - bu obyekti silməzdən əvvəl zibil yığan şəxs bu metodu çağırır (nəhayət). İşğal edilmiş ehtiyatları təmizləmək üçün istifadə olunur.
HashCode , equals​ , clone , toString və finalize metodlarından düzgün istifadə etmək üçün onlar cari tapşırıq və şərait nəzərə alınmaqla yenidən müəyyən edilməlidir.

12. Resurslarla işləyərkən cəhd et və nəhayət cəhd et arasında fərq nədir?

Tipik olaraq, try-catch-finally istifadə edərkən son blok resursları bağlamaq üçün istifadə olunurdu. Java 7, resursları azad etmək üçün try-catch-finally analoqu olan , lakin daha yığcam və oxunaqlı olan, resurslarla sınaqdan keçirmə operatorunun yeni növünü təqdim etdi . try-catch-finally nəyə bənzədiyini xatırlayaq :
String text = "some text......";
BufferedWriter bufferedWriter = null;
try {
   bufferedWriter = new BufferedWriter(new FileWriter("someFileName"));
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
} finally {
   try {
       bufferedWriter.close();
   } catch (IOException e) {
       e.printStackTrace();
   }
}
İndi bu kodu yenidən yazaq, lakin resurslarla cəhd edin :
String text = "some text......";
try(BufferedWriter bufferedWriter =new BufferedWriter(new FileWriter("someFileName"))) {
   bufferedWriter.write(text);
} catch (IOException e) {
   e.printStackTrace();
}
Birtəhər asanlaşdı, elə deyilmi? Sadələşdirməyə əlavə olaraq, bir neçə məqam var:
  1. Resurslarla cəhddə , mötərizədə elan edilmiş resurslar (bağlanacaq) AutoCloseable interfeysini və onun yeganə metodu olan close() tətbiq etməlidir .

    Bağlama metodu gizli nəhayət blokda icra olunur , əks halda proqram verilmiş resursun necə bağlanacağını necə başa düşəcək?

    Ancaq çox güman ki, nadir hallarda öz resurslarınızı və onların bağlanma üsulunuzu yazacaqsınız.

  2. Blokun icrası ardıcıllığı:

    1. bloklamağa cəhd edin .
    2. Nəhayət, gizli .
    3. Əvvəlki addımlarda istisnaları tutan tutma bloku .
    4. Nəhayət aydın .

    Bir qayda olaraq, siyahıda aşağı görünən istisnalar yuxarıda görünənləri kəsir.

Təsəvvür edin ki , try-catch-finally istifadə edərkən cəhdinizdə bir istisna baş verir . Müvafiq olaraq, xüsusi tutma bloku dərhal icra etməyə başlayır , burada başqa bir istisna yazırsınız (məsələn, səhvi daha ətraflı təsvir edən bir mesajla) və metodun bu istisnanı daha da atmasını istəyirsiniz. Sonra finally blokunun icrası gəlir və orada da bir istisna atılır. Amma bu fərqlidir. Bu üsul sonda bu iki istisnadan hansını atacaq? İstisna son blok tərəfindən atıldı ! Ancaq resurslarla cəhdlə bağlı bir məqam da var . İndi eyni vəziyyətdə resurslarla cəhdlərin davranışına baxaq . Biz close() metodunda , yəni gizli finally- da resursları bağlamağa cəhd etdikdə try blokunda bir istisna alırıq . Bu istisnalardan hansını tutacaq ? Try bloku tərəfindən atılan biri ! Gizli finally ( class() metodundan) istisna nəzərə alınmayacaq. Bu məhəl qoymama istisnanın yatırılması da adlanır.

13. Bit üzrə əməliyyatlar hansılardır?

Bitwise əməliyyatları məntiqi əməliyyatları və bit istiqamətində sürüşmələri ehtiva edən bit sətirləri üzərində əməliyyatlardır. Məntiqi əməliyyatlar:
  • bitwise AND - bit dəyərlərini müqayisə edir və prosesdə 0 (yanlış) olaraq təyin edilmiş istənilən bit nəticədə müvafiq biti 0 olaraq təyin edir. Yəni, müqayisə edilən hər iki dəyərdə bit 1 (doğru) idisə, nəticə də 1 olacaq.

    kimi işarələnir - AND , &

    Nümunə: 10111101 & 01100111 = 00100101

  • bitwise OR əvvəlkinin tərs əməliyyatıdır. 1-ə təyin edilmiş istənilən bit nəticədə oxşar biti 1 kimi təyin edir. Buna uyğun olaraq, hər iki müqayisə edilən dəyərdə bit 0 idisə, nəticədə alınan bit də 0 olacaq.

    - OR , | kimi işarələnir

    Nümunə: 10100101 | 01100011 = 11100111

  • bitwise NOT - bir dəyərə tətbiq edilir, bitləri çevirir (ters çevirir). Yəni 1 olan bitlər 0 olacaq; və 0 olanlar 1 olacaq.

    - DEYİL , ~ kimi işarələnir

    Misal: ~10100101 = 01011010

  • bitwise exclusive OR - bit dəyərlərini müqayisə edir və hər iki dəyərdə bit 1-ə bərabərdirsə, nəticə 0, hər iki dəyərdə bit 0 olarsa, nəticə 0 olacaqdır. nəticənin 1-ə bərabər olması üçün bitlərdən yalnız biri 1-ə, ikincisi isə 0-a bərabər olmalıdır.

    kimi qeyd olunur - XOR , ^

    Nümunə: 10100101 ^ 01100011 = 11000110

Bit istiqamətində sürüşmələr - >> və ya << dəyərin bitlərini göstərilən istiqamətə, göstərilən nömrəyə uyğun olaraq dəyişdirir. Boşalan vəzifələr sıfırlarla doldurulur. Misal üçün:
  1. 01100011 >> 4 = 00000110
  2. 01100011 << 3 = 00011000
Mənfi nömrəni sağa köçürərkən də bir istisna var. Xatırladığınız kimi, birinci bit işarə üçün cavabdehdir və bu bit 1-ə bərabərdirsə, rəqəm mənfidir. Mənfi ədədi köçürsəniz, boşalmış mövqelər artıq sıfırlarla deyil, birlərlə doldurulacaq, çünki işarə bitini saxlamaq lazımdır. Məsələn: 10100010 >> 2 = 11101000 Eyni zamanda, Java-da əlavə işarəsiz sağa sürüşdürmə operatoru var >>> Bu operator >>-un analoqudur, yerdəyişmə zamanı boşalmış mövqelər olub-olmamasından asılı olmayaraq 0 ilə doldurulur. rəqəm mənfi və ya müsbətdir. Məsələn: 10100010 >>> 2 = 00101000 Bitwise əməliyyatları haqqında ətraflı burada oxuyun . Müsahibə suallarının və cavablarının təhlili.  2-2 hissəJava-da bitwise yerdəyişmələrinin istifadəsinə misal olaraq, açar üçün xüsusi daxili hash kodunu təyin etmək üçün istifadə olunan HashMap-ın hash()Müsahibə suallarının və cavablarının təhlili.  2-3 hissə metodunu verə bilərsiniz: Bu üsul sizə HashMap-da məlumatları bərabər paylamağa imkan verir. toqquşmaların sayı.

14. Java-da obyektlər hansı standart dəyişməz siniflərdir?

Dəyişməz , orijinal parametrlərinin dəyişdirilməsinə icazə verməyən bir obyektdir. Dəyişdirmək istədiyiniz parametrlərlə verilmiş tipli yeni obyektləri qaytaran metodlara malik ola bilər. Bəzi standart dəyişməz obyektlər:
  • Bu günə qədər Java-da ən məşhur dəyişməz obyekt String-dir;
  • standart növləri əhatə edən sarğı siniflərinin nümunələri: Boolean, Character, Byte, Short, Integer, Long, Double, Float;
  • adətən xüsusilə BÖYÜK ədədlər üçün istifadə olunan obyektlər - BigInteger və BigDecimal;
  • stacktraces-də vahid olan obyekt (məsələn, istisna stacktrace-də) StackTraceElement;
  • Fayl sinifinin obyekti - faylları dəyişə bilər, lakin eyni zamanda özü dəyişməzdir;
  • UUID - tez-tez elementlər üçün unikal id kimi istifadə olunur;
  • java.time paketinin bütün sinif obyektləri;
  • Locale - coğrafi, siyasi və ya mədəni bölgəni müəyyən etmək üçün istifadə olunur.

15. Dəyişməyən obyektin adi obyektlərdən üstün cəhətləri hansılardır?

  1. Bu cür obyektlər çox yivli mühitdə istifadə edildikdə təhlükəsizdir . Onlardan istifadə etməklə, iplik yarışı şərtlərinə görə məlumatların itirilməsindən narahat olmaq lazım deyil. Adi obyektlərlə işləməkdən fərqli olaraq: bu halda çox diqqətlə düşünməli və obyektdən paralel mühitdə istifadə mexanizmlərini işləməli olacaqsınız.
  2. Dəyişməyən obyektlər xəritədə yaxşı açarlardır, çünki siz dəyişən obyektdən istifadə etsəniz və sonra obyekt öz vəziyyətini dəyişdirsəniz, HashMap-dan istifadə edərkən çaşqınlıq yarana bilər: obyekt hələ də mövcud olacaq və siz containKey() istifadə etsəniz, o, olmaya bilər. tapılsın.
  3. Dəyişməz obyektlər proqram işləyərkən heç vaxt dəyişdirilməməli olan dəyişməz (sabit) məlumatların saxlanması üçün əladır.
  4. "Uğursuzluğa atomizm" - dəyişməz bir obyekt istisna atırsa, o, hələ də arzuolunmaz (sınıq) vəziyyətdə qalmayacaq.
  5. Bu sinifləri sınaqdan keçirmək asandır.
  6. Kopya konstruktoru və klon tətbiqi kimi əlavə mexanizmlərə ehtiyac yoxdur.

OOP haqqında suallar

Müsahibə suallarının və cavablarının təhlili.  2-4 hissə

16. Ümumiyyətlə və prosedur proqramlaşdırma ilə müqayisədə OOP-nin üstünlükləri hansılardır?

Beləliklə, OOP üstünlükləri:
  1. Mürəkkəb proqramları yazmaq prosedur proqramlaşdırmadan daha asandır, çünki hər şey kiçik modullara - bir-biri ilə qarşılıqlı əlaqədə olan obyektlərə bölünür və nəticədə proqramlaşdırma obyektlər arasındakı münasibətlərə düşür.
  2. OOP istifadə edərək yazılmış proqramları dəyişdirmək daha asandır (dizayn konsepsiyalarına əməl olunduğu müddətcə).
  3. Verilənlər və onun üzərindəki əməliyyatlar vahid bir varlıq təşkil etdiyinə görə, onlar bütün tətbiq ərzində ləkələnmir (bu, tez-tez prosedur proqramlaşdırma ilə olur).
  4. İnformasiya inkapsulyasiyası istifadəçidən ən vacib məlumatları qoruyur.
  5. Eyni kodu müxtəlif verilənlərlə təkrar istifadə etmək mümkündür, çünki siniflər hər birinin öz atribut dəyərlərinə malik olan çoxlu obyektlər yaratmağa imkan verir.
  6. Varislik və polimorfizm həmçinin mövcud kodu təkrar istifadə etməyə və genişləndirməyə imkan verir (oxşar funksionallığı təkrarlamaq əvəzinə).
  7. Prosedur yanaşmasından daha asan tətbiq genişlənməsi.
  8. OOP yanaşması icra detallarından mücərrədləşdirməyə imkan verir.

17. OOP-da hansı çatışmazlıqların olduğunu söyləyin

Təəssüf ki, onlar da mövcuddur:
  1. OOP çoxlu nəzəri biliklər tələb edir ki, siz nəyisə yaza bilməyəcəksiniz.Müsahibə suallarının və cavablarının təhlili.  2-5 hissə
  2. OOP ideyalarını başa düşmək və praktikada tətbiq etmək o qədər də asan deyil (bir az da filosof olmaq lazımdır).
  3. OOP istifadə edərkən, sistemin daha mürəkkəb təşkili səbəbindən proqram təminatının performansı bir qədər azalır.
  4. OOP yanaşması daha çox yaddaş tələb edir, çünki hər şey adi dəyişənlərdən daha çox yaddaş tutan siniflərdən, interfeyslərdən, metodlardan ibarətdir.
  5. İlkin təhlil üçün tələb olunan vaxt prosessualdan daha çoxdur.

18. Statik və dinamik polimorfizm nədir

Polimorfizm obyektlərin eyni sinif və ya interfeys üçün fərqli davranmasına imkan verir. Erkəngec bağlanma kimi də tanınan iki növ polimorfizm var . Statik polimorfizm və ya daha əvvəl bağlanma:
  • kompilyasiya zamanı (proqramın həyat dövrünün əvvəlində) baş verir;
  • kompilyasiya zamanı hansı metodun yerinə yetirilməsinə qərar verir;
  • Metodun həddindən artıq yüklənməsi statik polimorfizm nümunəsidir;
  • erkən bağlama özəl, statik və terminal üsulları ehtiva edir;
  • miras erkən bağlanmada iştirak etmir;
  • Statik polimorfizm konkret obyektləri deyil, növü dəyişən adının solunda təmsil olunan sinif haqqında məlumatı əhatə edir.
Dinamik polimorfizm və ya gec bağlanma:
  • icra zamanı baş verir (proqram işləyərkən);
  • dinamik polimorfizm metodun icra müddətində hansı xüsusi icraya malik olacağına qərar verir;
  • metodun üstünlüyü dinamik polimorfizm nümunəsidir;
  • gec bağlama müəyyən bir obyektin, onun növünə istinadın və ya onun super sinifinin təyin edilməsidir;
  • irsiyyət dinamik polimorfizmlə əlaqələndirilir.
Bu məqalədə erkən və gec bağlama arasındakı fərqlər haqqında daha çox oxuya bilərsiniz .

19. OOP-də abstraksiya prinsipini müəyyən edin

OOP-da abstraksiya, əhəmiyyətsiz detallar istisna olmaqla, obyektin əhəmiyyətli xüsusiyyətlərini vurğulamaq üçün bir yoldur. Yəni, OOP yanaşması ilə proqram tərtib edərkən, onların həyata keçirilməsinin təfərrüatlarına varmadan, ümumilikdə modellərə diqqət yetirirsiniz. Java-da interfeyslər abstraksiyadan məsuldur . Məsələn, bir maşınınız var və bu interfeys olacaq. Və onunla müxtəlif qarşılıqlı əlaqələr - məsələn, mühərriki işə salmaq, sürət qutusundan istifadə etmək - bunlar icra detallarına varmadan istifadə etdiyimiz funksiyalardır. Axı siz avtomobili idarə edərkən, sürət qutusunun öz məqsədini tam olaraq necə yerinə yetirdiyini və ya açarın mühərriki necə işə saldığını və ya sükan çarxının təkərləri necə döndərdiyini düşünmürsən. Və bu funksionallıqdan birinin həyata keçirilməsi dəyişdirilsə də (məsələn, mühərrik), siz bunu fərq edə bilməzsiniz. Bunun sizin üçün əhəmiyyəti yoxdur: siz icranın təfərrüatlarına girmirsiniz. Fəaliyyətin həyata keçirilməsi sizin üçün vacibdir. Əslində, bu, icra detallarından abstraksiyadır. Bu gün dayanacağımız yer budur: davam edəcək!Müsahibə suallarının və cavablarının təhlili.  2-6 hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION