-
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.
-
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.
-
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.
Kiçik Səviyyə Sualları və Cavabları
Ü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).
- 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
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.
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.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 .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: Ç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 :-
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).
-
Sinfin daxili sahələrinə standart olmalıdır get və set metodları vasitəsilə daxil olur. Məsələn, sahə addırsa , getName və setName və 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.
-
Sinif equals() hashCode() və toString() metodlarının ləğv edilmiş versiyalarını ehtiva etməlidir .
-
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.
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 . 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ı burada oxuya bilərsiniz . Bu gün bu məsələyə diqqət yetirəcəyik...
GO TO FULL VERSION