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

Qrupda dərc edilmişdir
Salam! JavaRush-da müxtəlif insanlar toplandı. Bəzilərimiz inkişafa çox vaxt və səy sərf edərək sadəcə Java tərtibatçıları olmaq istəyirlər, digərləri isə artıq Java tərtibatçılarıdır. Bu və ya digər halda siz testlərə - texniki müsahibələrə hazır olmalısınız. Bu sınaq asan deyil və mənəvi hazırlıqla yanaşı, texniki hazırlıq da lazımdır. Bu yaxınlarda dou-da Java Developer Müsahibə SuallarınınMüsahibə suallarının və cavablarının təhlili.  1-1 hissə böyük siyahısına rast gəldim . Bu suallar müxtəlif səviyyələrə bölünür - Kiçik, Orta və Böyük. Narahat olmayın: bütün suallar asan deyil, lakin ulduz işarəsi olanlar nadir hallarda soruşulur. Suallar yaxşıdır, amma əksəriyyətinə cavab verməyə çalışmaq istərdim. Bir məqalənin əhatəsinə girməyəcəyim aydındır, axı orada çoxlu suallar var. Buna görə də, bu, bu cür suallara cavab verən bir sıra məqalələr olacaqdır. Dərhal bir neçə məqamı vurğulayım:
  1. Onlar üçün ən yaxşı suallar və cavablar olan əla məqalə var . Bəzi suallar yuxarıda təqdim olunan siyahı ilə üst-üstə düşür (250+), ona görə də məlumatı bir daha təkrarlamamaq üçün bu suallar atılacaq.

  2. Suallar Ukrayna dilində təqdim olunur, lakin JavaRush iştirakçılarının əksəriyyəti rusdilli olduğundan (və daha çox mən də), cavablar rus dilində olacaq.

  3. Cavablar qısa olacaq, çünki çox ətraflı yazsanız, bəzi suallara cavablar ayrıca məqalə tələb edə bilər. Müsahibələr zamanı belə ətraflı və həcmli cavablara ehtiyac yoxdur, çünki müsahibinizin sizə lazımi mövzularda müsahibə vermək üçün cəmi bir saatı var (və xatırladığınız kimi, bu kifayətdir). Daha dərindən qazmağı sevənlər üçün linklər buraxacağam.

Beləliklə, başlayaq.

Kiçik Səviyyə Sualları və Cavabları

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

Ümumi məsələlər

1. Hansı dizayn nümunələrini bilirsiniz? İşinizdə istifadə etdiyiniz iki şablon haqqında bizə məlumat verin.

Çox sayda şablon var: onlarla bu və bu məqalədən tanış olmağa başlaya bilərsiniz . Yaxşı, onlarla ətraflı tanış olmaq istəyənlər üçün “Əvvəlcə başın” kitabını oxumağı məsləhət görürəm. Dizayn nümunələri" . Onun köməyi ilə siz ən əsas dizayn nümunələrini ətraflı və asan şəkildə öyrənə bilərsiniz. Müsahibədə nümunə kimi istifadə edə biləcəyiniz dizayn nümunələrinə gəldikdə, ağlınıza gələn bəziləri:
  • Builder klassik obyekt yaradılmasına alternativ olan tez-tez istifadə olunan şablondur;
  • Təbii olaraq polimorfizmi təmsil edən strategiya nümunəsi . Yəni bizim bir interfeysimiz var, lakin proqramın davranışı bu interfeysin hansı konkret icrasının funksionallığa ötürülməsindən asılı olaraq dəyişəcək (indi strategiya praktiki olaraq java proqramlarında hər yerdə istifadə olunur).
Bu sizin üçün kifayət deyilsə, Bahara diqqət yetirin (əgər siz artıq onunla tanışsınızsa), çünki bu, öz növbəsində yuxarı və aşağı naxışlarla dolu olan çərçivələrin bütöv bir platformasıdır. Haqqında danışdığım bir neçə nümunə var:
  • Fabrika - ApplicationContext-də (və ya BeanFactory-də);
  • Singleton - bütün lobya standart olaraq tək tonlardır;
  • Proksi - əslində Baharda hər şey bu və ya digər şəkildə bu nümunədən istifadə edir, məsələn, AOP;
  • Məsuliyyət zənciri Spring Security-nin işlədiyi konsepsiyaya əsaslanan nümunədir;
  • Şablon - Spring Jdbc-də istifadə olunur.

Java nüvəsi

Müsahibə suallarının və cavablarının təhlili.  1-3 hissə

2. Java-da hansı məlumat növləri var?

Java ibtidai məlumat növlərinə malikdir:
  • bayt — -128-dən 127-dək diapazonda olan tam ədədlər, çəkisi 1 bayt;
  • qısa — -32768-dən 32767-ə qədər diapazonda olan tam ədədlər, çəkisi 2 baytdır;
  • int — tam ədədlər -2147483648 - 2147483647, çəkisi 4 bayt;
  • long — 9223372036854775808 - 9223372036854775807 diapazonunda olan tam ədədlər, çəkisi 8 baytdır;
  • float — -3.4E+38 ilə 3.4E+38 diapazonunda üzən nöqtəli nömrələr, çəkisi 4 bayt;
  • double — -1.7E+308 ilə 1.7E+308 diapazonunda üzən nöqtəli nömrələr, çəkisi 8 baytdır;
  • char — UTF-16-da tək simvol, 2 bayt ağırlığında;
  • boolean dəyərləri doğru/yanlış , 1 bayt ağırlığında.
Və yığındakı obyektlərə işarə edən məlumat növlərinə istinad edir .

3. Obyekt primitiv məlumat növlərindən nə ilə fərqlənir?

Birinci fərq: tutulan yaddaşın miqdarı: primitivlər çox az yer tutur, çünki onlar yalnız öz dəyərini ehtiva edir, obyektlərdə isə çox, çox müxtəlif dəyərlər ola bilər: həm primitivlər, həm də digər obyektlərə istinadlar. İkinci fərq: Java obyekt yönümlü dildir, ona görə də orada hər şey obyektlər arasında qarşılıqlı əlaqə vasitəsilə işləyir və primitivlər çox yaxşı uyğun gəlmir (əslində Java 100% obyekt yönümlü dil deyil). Üçüncüsü, ikincidən sonra: Java obyektlər arasında qarşılıqlı əlaqəyə yönəldiyi üçün bu obyektlərin onları idarə etmək üçün çoxlu müxtəlif mexanizmləri var. Məsələn, konstruktorlar, metodlar, istisnalar (əsasən obyektlərdə fəaliyyət göstərən) və s. Əslində, primitivlərin bu obyekt yönümlü mühitdə hansısa şəkildə iştirak edə bilməsi (işləməsi) üçün ibtidai növlər üçün sarğılar icad edilmişdir ( Tam , Xarakter , Double , Boolean ...)

4. Parametrləri istinadla və qiymətlə ötürmək arasında fərq nədir?

Primitiv sahələr öz dəyərini saxlayır: məsələn, int i = 9 təyin etsək ; i sahəsində 9 dəyəri saxlanılır . Bir obyektə istinadımız olduqda, bu o deməkdir ki, obyektə istinad olan və ya başqa sözlə, yaddaşda obyektin ünvanının dəyəri olan bir sahəmiz var.
Cat cat = new Cat();
Belə çıxır ki, obyektə istinad olan sahələr də dəyərləri , yaddaş ünvanının dəyərlərini saxlayır. Yəni cat yaddaşda yeni Cat() obyektinin ünvan dəyərini saxlayır . Parametri metoda ötürdükdə onun dəyəri kopyalanır. Primitiv halda, primitivin dəyəri kopyalanacaq. Müvafiq olaraq, metod bir nüsxə ilə işləyəcək, dəyişdirilməsi orijinala təsir etməyəcəkdir. İstinad növü olduqda, yaddaş ünvanının dəyəri kopyalanacaq, müvafiq olaraq, ünvan onun işarə etdiyi obyektlə eyni olacaq. Və bu yeni keçiddən istifadə edərək obyekti dəyişdirsək, o, köhnəsi üçün dəyişdiriləcək (hər ikisi də eyni obyektə işarə edir).

5. JVM, JDK, JRE nədir?

JVM - Java Virtual Maşın tərtibçi tərəfindən əvvəlcədən yaradılan Java bayt kodunu işlədən virtual maşındır. JRE - Java Runtime Environment - mahiyyətcə Java proqramlaşdırma dilində yazılmış kiçik proqramlar və proqramları işlətmək üçün JVM , standart kitabxanalar və digər komponentləri ehtiva edən Java proqramlarının işləməsi üçün mühitdir . Başqa sözlə , JRE tərtib edilmiş Java proqramını işə salmaq üçün lazım olan hər şeyin paketidir, lakin proqramların inkişafı üçün tərtibçilər və ya sazlayıcılar kimi alətlər və yardımçı proqramları ehtiva etmir. JDK - Java Development Kit - genişləndirilmiş JRE dəsti , yəni təkcə işə salmaq üçün deyil, həm də Java proqramlarını inkişaf etdirmək üçün mühitdir. JDK JRE-də olan hər şeyi, əlavə olaraq müxtəlif əlavə alətləri - Java-da proqramlar yaratmaq üçün lazım olan kompilyatorları və sazlayıcıları (həmçinin java sənədlərini ehtiva edir) ehtiva edir.Müsahibə suallarının və cavablarının təhlili.  1-4 hissə

6. Nə üçün JVM istifadə olunur?

Yuxarıda qeyd edildiyi kimi, Java Virtual Maşın tərtibçi tərəfindən əvvəlcədən yaradılmış Java bayt kodunu işlədən virtual maşındır. Yəni JVM Java mənbə kodunu başa düşmür. Buna görə də, ilk olaraq, tərtib edildikdən sonra artıq .class genişlənməsinə malik olan və JVM-nin başa düşdüyü eyni bayt kodu şəklində təqdim olunan .java faylları tərtib edilir . Hər bir ƏS-nin öz JVM-i var, ona görə də bayt kodu fayllarını qəbul edərək, JVM onu yerinə yetirir və onu baş verdiyi ƏS-ə uyğunlaşdırır. Əslində, müxtəlif JVM-lərə görə, JDK (və ya JRE) versiyaları müxtəlif ƏS-lər üçün fərqlənir (hər biri öz JVM-ni tələb edir). İnkişafın digər proqramlaşdırma dillərində necə işlədiyini xatırlayaq. Siz proqram hazırlayırsız, sonra onun kodu müəyyən bir OS üçün maşın koduna yığılır və sonra onu işə sala bilərsiniz. Başqa sözlə, hər bir sistem üçün proqramın müxtəlif versiyalarını yazmalısınız. Halbuki Java-da ikili kod emalı (JVM kod baytlarının yığılması və işlənməsi) sayəsində siz çarpaz platformanın üstünlüklərindən istifadə edə bilərsiniz. Biz bir dəfə kodu yaratdıq, onu bayt koduna yenidən tərtib etdik, istənilən OS-yə köçürdük və yerli JVM kodu işlədir. Bu, Java-nın əfsanəvi xüsusiyyətidir - bir dəfə yazın, hər yerdə işləyin . Bu barədə daha ətraflı “ Başlıq altında Java proqramlarının tərtib edilməsi və icrası ” məqaləsində oxuyun .Müsahibə suallarının və cavablarının təhlili.  1-5 hissə

7. Bayt kodu nədir?

Yuxarıda dediyim kimi, kompilyator Java kodunu ara baytkoda ( .java uzantılı faylları .class uzantılı fayllara) çevirir. Baytkod bir çox cəhətdən maşın koduna bənzəyir, yalnız o, real prosessordan deyil, virtualdan olan bir sıra təlimatlardan istifadə edir. Bundan əlavə, o, proqramın işlədiyi real prosessor üçün əmrlərin icrasını optimallaşdıran JIT kompilyatorunun istifadəsinə yönəlmiş bölmələri əhatə edə bilər. JIT kompilyasiyası, həmçinin on-the-fly kompilyasiya adlanır, proqram işləyərkən bayt kodunu maşına və ya başqa formata yığaraq bayt kodundan istifadə edərək proqramın performansını artıran texnologiyadır. Təxmin etdiyiniz kimi, JVM bayt kodu işlədərkən JIT kompilyatorundan istifadə edir. Bir bayt kodu nümunəsinə nəzər salaq: Müsahibə suallarının və cavablarının təhlili.  1-6 hissəÇox oxunaqlı deyil, elə deyilmi? Yaxşı, bu bizim üçün deyil, JVM üçün bir təlimatdır. Bu məsələni daha yaxşı başa düşməyə kömək edəcək bir məqalə var .

8. JavaBean-ın xüsusiyyətləri hansılardır?

JavaBeans müəyyən qaydaları olan Java sinfidir. JavaBean yazmaq üçün bəzi qaydalar bunlardır :
  1. Sinifdə ictimai giriş dəyişdiricisi olan boş (parametrsiz) ictimai giriş konstruktoru olmalıdır . Bu konstruktor lazımsız problem olmadan bu sinif obyektini yaratmağa imkan verir (parametrlərlə lazımsız təlaş olmaması üçün).

  2. Sinfin daxili sahələrinə standart olmalıdır getset metodları vasitəsilə daxil olur. Məsələn, sahə addırsa , getName setName s. Bu, öz növbəsində, müxtəlif alətlərə (çərçivələrə) lobya məzmununu fəsadlar olmadan avtomatik olaraq müəyyən etməyə və yeniləməyə imkan verir.

  3. Sinif equals() hashCode()toString() metodlarının ləğv edilmiş versiyalarını ehtiva etməlidir .

  4. Sinif seriallaşdırıla bilən olmalıdır, yəni marker interfeysi olmalıdır - Serializable və ya Externalizable interfeysini həyata keçirin . Bu, paxlanın vəziyyətini etibarlı şəkildə saxlamaq, saxlamaq və bərpa etmək üçün lazımdır.

Müsahibə suallarının və cavablarının təhlili.  1-7 hissəJavaBeans növləri haqqında bu materialda oxuya bilərsiniz .

9. OutOfMemoryError nədir?

OutOfMemoryError Java Virtual Maşınının (JVM) işləməsi ilə bağlı kritik işləmə səhvlərindən biridir. JVM obyekti ayıra bilmədikdə çağırılır, çünki onun üçün kifayət qədər yaddaş yoxdur və zibil toplayıcı daha çox yaddaş ayıra bilmir. OutOfMemoryError-un bəzi növləri :
  • OutOfMemoryError: Java yığın sahəsi - kifayət qədər yaddaş olmadığına görə obyekt Java yığınında ayrıla bilməz. Səhv yaddaş sızması və ya standart yığın ölçüsünün cari tətbiq üçün kifayət qədər böyük olmaması səbəbindən baş verə bilər.

  • OutOfMemoryError: GC Overhead həddi aşıldı - məlumatların miqdarı yığına çətinliklə sığdığından, zibil toplayıcı hər zaman işləyir, Java proqramı isə çox yavaş işləyir və nəticədə zibil toplayıcının yuxarı həddi aşılır və proqram bu xəta ilə çökür.

  • OutOfMemoryError: Tələb olunan massiv ölçüsü VM limitini aşır - proqramın yığın ölçüsündən böyük olan massiv üçün yaddaş ayırmağa cəhd etdiyini göstərir, bu da yenə qeyri-kafi standart yaddaş ayrılması ilə əlaqədar ola bilər.

  • OutOfMemoryError: Metaspace — yığında metadata üçün ayrılmış yer bitdi (metadata siniflər və metodlar üçün təlimatdır).

  • OutOfMemoryError: səbəbə görə ölçü baytlarını tələb edin. Mübadilə sahəsi bitdi - yığından yaddaş ayırmağa çalışarkən bəzi uğursuzluqlar baş verdi və nəticədə yığında yaddaş çatışmazlığı yarandı.

10. Stack izi nədir? Necə əldə etmək olar?

Stack Trace tətbiqdə bu nöqtəyə qədər çağırılmış siniflərin və metodların siyahısıdır. Tətbiqdə müəyyən bir nöqtədə yığın izinə aşağıdakı kimi zəng edə bilərsiniz:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Bu yolla biz LIFO ardıcıllığı ilə düzülmüş iz elementləri toplusunu əldə edəcəyik - Last In First Out . Müsahibə suallarının və cavablarının təhlili.  1-8 hissəJava-da, bir qayda olaraq, yığın izi haqqında danışarkən, səhv (və ya istisna) baş verdikdə konsolda göstərilən stek izi nəzərdə tutulur. İstisnaların yığın izini bu kimi əldə edə bilərsiniz:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Yaxşı, əgər biz konsolda istisna stack izini çıxarmaqdan danışırıqsa:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Həmçinin, əgər bizdə emal etməyəcəyimiz, ancaq yönləndirəcəyimiz bir xəta, yoxlanılmamış istisna və ya yoxlanılmış istisna varsa, o zaman proqram qəzaya uğradıqda biz avtomatik olaraq konsolda istisnaların yığın izini alacağıq. Konsolda yığın izi istisnasının kiçik bir nümunəsi: Stack Trace haqqında daha ətraflı buradaMüsahibə suallarının və cavablarının təhlili.  1-9 hissə oxuya bilərsiniz . Bu gün bu məsələyə diqqət yetirəcəyik...Müsahibə suallarının və cavablarının təhlili.  1-10 hissə
Seriyadakı digər materiallar:
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION