JavaRush /Java блогу /Random-KY /Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун...
Константин
Деңгээл

Java иштеп чыгуучусу үчүн интервьюдан алынган суроолордун жана жооптордун анализи. 1-бөлүк

Группада жарыяланган
Салам! JavaRushга ар кандай адамдар чогулду. Кээ бирибиз Java иштеп чыгуучулары болууну каалайбыз, өнүгүүгө көп убакыт жана күч жумшап жатабыз, ал эми башкалар Java иштеп чыгуучуларыбыз. Тигил же бул учурда сиз тесттерге даяр болушуңуз керек - техникалык интервью. Бул сынак оңой эмес, моралдык даярдыктан тышкары техникалык даярдык да керек. Мен жакында Java Developer интервью суроолорунунИнтервьюдагы суроолорду жана жоопторду талдоо.  1-1-бөлүк чоң тизмесин көрдүм . Бул суроолор ар кандай деңгээлдерге бөлүнөт - Кенже, Орто жана Улук. Коркпоңуз: бардык суроолор оңой эмес, бирок жылдызчасы барлар чанда гана берилет. Суроолор жакшы, бирок мен алардын көбүнө жооп берүүгө аракет кылгым келет. Мен бир макаланын алкагына кирбей турганым түшүнүктүү, анткени ал жерде көптөгөн суроолор бар. Ошондуктан, бул суроолорго жооп берген макалалардын бүтүндөй сериясы болот. Мен дароо бир нече пункттарды баса белгилей кетейин:
  1. Алар үчүн жогорку суроолор жана жооптор менен сонун макала бар . Кээ бир суроолор жогоруда келтирилген тизме менен дал келет (250+), андыктан маалыматты дагы бир жолу кайталабоо үчүн бул суроолор өткөрүлүп жиберилет.

  2. Суроолор украин тorнде берилген, бирок JavaRush катышуучуларынын көпчүлүгү орус тилдүү болгондуктан (жана көбүрөөк деңгээлде мен да), жооптор орус тorнде болот.

  3. Жооптор кыска болот, анткени сиз майда-чүйдөсүнө чейин жазсаңыз, кээ бир суроолорго жооптор өзүнчө макаланы талап кылышы мүмкүн. Ал эми интервью учурунда мындай деталдуу жана көлөмдүү жооптордун кереги жок, анткени сиздин маектешиңизде сизден керектүү темалар боюнча интервью алуу үчүн бир гана саат бар (жана, эсиңизде болсо, бул жетиштүү). Тереңирээк казууну жакшы көргөндөр үчүн шилтемелерди калтырам.

Ошентип, баштайлы.

Жаштар деңгээлиндеги суроолор жана жооптор

Интервьюдагы суроолорду жана жоопторду талдоо.  1-2-бөлүк

Жалпы суроолор

1. Кандай дизайн үлгүлөрүн билесиз? Жумушуңузда колдонгон эки шаблон жөнүндө айтып бериңиз.

Калыптардын көп түрдүүлүгү бар: алар менен ушул жана ушул макаладан тааныша баштасаңыз болот. Алар менен кеңири таанышууну каалагандар үчүн мен "Биринчи баш. Дизайн үлгүлөрү" . Анын жардамы менен сиз эң негизги дизайн үлгүлөрүн майда-чүйдөсүнө чейин жана оңой үйрөнө аласыз. Интервьюда мисал катары колдоно ала турган дизайн үлгүлөрү жөнүндө сөз болгондо, кээ бирлери эске түшөт:
  • Builder - көп колдонулган шаблон, классикалык an objectти түзүүгө альтернатива;
  • Табиятынан полиморфизмди чагылдырган стратегия үлгүсү . Башкача айтканда, бизде бир интерфейс бар, бирок программанын жүрүм-туруму бул интерфейстин кайсы конкреттүү ишке ашыруу функционалдуулукка өткөрүлүп берилгенине жараша өзгөрөт (азыр стратегия Java тиркемелеринде дээрлик бардык жерде колдонулат).
Эгер бул сизге жетишсиз болсо, Жазга көңүл буруңуз (эгерде сиз аны менен мурдатан тааныш болсоңуз), ал өз кезегинде өйдө жана ылдый үлгүлөр менен толтурулган алHowтардын бүтүндөй платформасы. Бул жерде мен айтып жаткан бир нече мисал:
  • Factory - ApplicationContext'те (же BeanFactory'де);
  • Singleton - бардык буурчак демейки боюнча синглтондор;
  • Прокси - жазында бардык нерсе бул үлгүнү тигил же бул түрдө колдонот, мисалы, AOP;
  • Жоопкерчorктин чынжырчасы Spring Security иштейт концепцияга негизделген үлгү;
  • Үлгү - Жаз Jdbc колдонулат.

Java Core

Интервьюдагы суроолорду жана жоопторду талдоо.  1-3-бөлүк

2. Javaда кандай маалымат түрлөрү бар?

Java алгачкы маалымат түрлөрү бар:
  • byte — -128ден 127ге чейинки диапазондогу бүтүн сандар, салмагы 1 byte;
  • кыска — -32768ден 32767ге чейинки диапазондогу бүтүн сандар, салмагы 2 byte;
  • int — бүтүн сандар -2147483648ден 2147483647ге чейин, салмагы 4 byte;
  • узун — 9223372036854775808ден 9223372036854775807ге чейинки диапазондогу бүтүн сандар, салмагы 8 byte;
  • float — -3.4E+38ден 3.4E+38ге чейинки диапазондогу калкыма чекиттүү сандар, салмагы 4 byte;
  • double — калкыма чекиттери -1,7E+308ден 1,7E+308ге чейинки диапазондо, салмагы 8 byte;
  • char — UTF-16дагы жалгыз символдор, салмагы 2 byte;
  • логикалык маанилери true/false , салмагы 1 byte.
Жана маалымат түрлөрүнө шилтеме , алар үймөктөгү an objectтерди көрсөтөт.

3. Объект алгачкы маалымат түрлөрүнөн эмнеси менен айырмаланат?

Биринчи айырма: ээлеген эс тутумдун көлөмү: примитивдер өтө аз ээлейт, анткени алар өздөрүнүн гана маанисин камтыйт, ал эми an objectтерде өтө, өтө көп түрдүү баалуулуктар болушу мүмкүн: примитивдер да, башка an objectтерге шилтемелер да. Экинчи айырма: Java an objectиге багытталган тил, андыктан андагы бардык нерсе an objectтердин ортосундагы өз ара аракеттенүү аркылуу иштейт, ал эми примитивдер анча туура келбейт (чындыгында Java 100% an objectиге багытталган тил эмес). Үчүнчүдөн, экинчиден: Java an objectилердин ортосундагы өз ара аракеттенүүгө багытталгандыктан, бул an objectтерде аларды башкаруунун көптөгөн ар кандай механизмдери бар. Мисалы, конструкторлор, методдор, өзгөчөлүктөр (негизинен an objectтерде иштешет) ж.б. Чындыгында, примитивдер бул an objectке багытталган чөйрөгө кандайдыр бир жол менен (иштесе) кириши үчүн, таңгычтар примитивдик типтер үчүн ойлоп табылган ( Integer , Character , Double , Boolean ...)

4. Параметрлерди шилтеме жана маани боюнча өткөрүүнүн ортосунда кандай айырма бар?

Примитивдик талаалар өз маанисин сактайт: мисалы, int i = 9 орнотсок ; i талаасында 9 мааниси сакталат . Бизде an objectке шилтеме болгондо, бул бизде an objectке шилтеме менен же башкача айтканда, эс тутумдагы an objectтин дарегинин мааниси бар талаа бар экенин билдирет.
Cat cat = new Cat();
Көрсө, an objectке шилтемеси бар талаалар баалуулуктарды , эстутум дарегинин маанилерин да сактайт. Башкача айтканда, cat жаңы Cat() an objectинин дарек маанисин эс тутумда сактайт. Параметрди методго өткөргөндө анын мааниси көчүрүлөт. Примитив болгон учурда, примитивдин мааниси көчүрүлөт. Демек, ыкма көчүрмө менен иштейт, аны өзгөртүү оригиналга таасирин тийгизбейт. Маалымдама түрү болгон учурда, эстутум дарегинин мааниси көчүрүлөт, тиешелүүлүгүнө жараша дарек ал көрсөткөн an object менен бирдей болот. Жана бул жаңы шилтемени колдонуп an objectти өзгөртсөк, ал эскиге өзгөрөт (анткени экөө тең бир эле an objectти көрсөтүп турат).

5. JVM, JDK, JRE деген эмне?

JVM – Java Virtual Machine – компилятор тарабынан алдын ала түзүлгөн Java byte-codeун иштеткен виртуалдык машина. JRE - Java Runtime Environment - бул негизинен Java тиркемелерин иштетүү үчүн чөйрө, анда JVM , стандарттык китепканалар жана Java программалоо тorнде жазылган апплеттерди жана тиркемелерди иштетүү үчүн башка компоненттер бар. Башкача айтканда , JRE компиляцияланган Java программасын иштетүү үчүн зарыл болгон нерселердин пакети, бирок тиркемени иштеп чыгуу үчүн компиляторлор же мүчүлүштүктөрдү оңдоочу сыяктуу куралдарды жана утorталарды камтыbyte. JDK - Java Development Kit - кеңейтилген JRE топтому , башкача айтканда, ишке киргизүү үчүн гана эмес, ошондой эле Java тиркемелерин иштеп чыгуу үчүн чөйрө. JDK JREде болгон нерселердин бардыгын, ошондой эле ар кандай кошумча куралдарды - компиляторлорду жана Java'да тиркемелерди түзүү үчүн зарыл болгон мүчүлүштүктөрдү оңдоочуларды камтыйт (ошондой эле java documentтерин камтыйт).Интервьюдагы суроолорду жана жоопторду талдоо.  1-4-бөлүк

6. Эмне үчүн JVM колдонушат?

Жогоруда айтылгандай, Java Virtual Machine – компилятор тарабынан алдын ала түзүлгөн Java byte codeун иштеткен виртуалдык машина. Башкача айтканда, JVM Java булак codeун түшүнбөйт. Ошондуктан, биринчиден, .java файлдары түзүлөт , алар компиляциядан кийин .class кеңейтүүсүнө ээ жана JVM түшүнгөн byte code түрүндө берилген. Ар бир ОСтин өзүнүн JVM бар, андыктан byte-code файлдарын алгандан кийин, JVM аны ишке ашырат жана аны ОС болуп турган ОСке ылайыкташтырат. Чынында, ар кандай JVMлерден улам, JDK (же JRE) versionлары ар кандай OS үчүн айырмаланат (алардын ар бири өзүнүн JVMин талап кылат). Башка программалоо тилдеринде иштеп чыгуу кандай иштээрин эстеп көрөлү. Сиз программаны иштеп чыгасыз, андан кийин анын codeу белгилүү бир ОС үчүн машина codeуна түзүлөт, андан кийин сиз аны иштете аласыз. Башкача айтканда, ар бир система үчүн программанын ар кандай versionларын жазуу керек. Ал эми Javaда кош codeду иштетүүнүн аркасында (JVM code byteтарын түзүү жана иштетүү) сиз кросс-платформанын артыкчылыктарынан пайдалана аласыз. Биз бир жолу codeду түзүп, аны bytecodeго кайра компиляциялап, каалаган ОСке өткөрүп бердик жана жергorктүү JVM codeду иштетет. Бул Java-нын легендарлуу касиети - бир жолу жаз, каалаган жерде иштет . Интервьюдагы суроолорду жана жоопторду талдоо.  1-5-бөлүкБул тууралуу кененирээк макаладан окуңуз " Java тиркемелерин капоттун астында түзүү жана аткаруу ."

7. Байтcode деген эмне?

Мен жогоруда айткандай, компилятор Java codeун аралык bytecodeго (.java кеңейтorши бар файлдарды .class кеңейтилген файлдарга) айлантат. Байтcode көп жагынан машина codeуна окшош, болгону ал чыныгы процессордон эмес, виртуалдык инструкциялардын топтомун колдонот. Мындан тышкары, ал программа иштеп жаткан реалдуу процессор үчүн буйруктардын аткарылышын оптималдаштырган JIT компиляторун колдонууга багытталган бөлүмдөрдү камтышы мүмкүн. JIT компиляциясы, ошондой эле ыкчам компиляция деп аталат, бул программа иштеп жатканда byte codeду машинага же башка форматка компиляциялоо аркылуу byte codeду колдонуу менен программанын иштешин жогорулаткан технология. Сиз ойлогондой, JVM byte codeду иштеткенде JIT компиляторун колдонот. Келгиле, byte-codeдун мисалын карап көрөлү: Интервьюдагы суроолорду жана жоопторду талдоо.  1-6-бөлүкӨтө окулbyte, туурабы? Ооба, бул биз үчүн көрсөтмө эмес, бирок JVM үчүн. Бул жерде сизге бул маселени жакшыраак түшүнүүгө жардам бере турган макала .

8. JavaBean кандай мүнөздөмөлөргө ээ?

JavaBeans бул белгилүү эрежелери бар Java классы. Бул жерде JavaBean жазуу үчүн кээ бир эрежелер бар :
  1. Класста бош (параметрлери жок) жалпыга жеткorктүүлүктү өзгөртүүчү жалпыга жеткorктүү конструктор болушу керек . Бул конструктор бул класстын an objectисин керексиз көйгөйлөрсүз түзүүгө мүмкүндүк берет (параметрлер менен ашыкча ызы-чуу болбошу үчүн).

  2. Класстын ички талааларына стандарт болушу керек болгон get жана set методдору аркылуу кирүүгө болот. Мисалы, талаа аты болсо , анда getName жана setName ж.б. Бул, өз кезегинде, ар кандай куралдарга (алHowтарга) төө буурчактын мазмунун автоматтык түрдө аныктоого жана жаңыртууга мүмкүндүк берет.

  3. Класс equals() ыкмаларынын hashCode() жана toString() жокко чыгарылган versionларын камтышы керек .

  4. Класс сериализациялануучу болушу керек, башкача айтканда, анын маркер интерфейси болушу керек - Сериялаштырылуучу же Externalizable интерфейсин ишке ашыруу . Бул буурчактын абалын ишенимдүү сактоо, сактоо жана калыбына келтирүү үчүн зарыл.

Интервьюдагы суроолорду жана жоопторду талдоо.  1-7-бөлүкБул материалдан JavaBeans түрлөрү жөнүндө окуй аласыз .

9. OutOfMemoryError деген эмне?

OutOfMemoryError Java Virtual Machine (JVM) иштеши менен байланышкан маанилүү аткаруу каталарынын бири болуп саналат. JVM an objectти бөлүштүрө албаган учурда чакырылат, анткени ал үчүн жетиштүү эстутум жок жана таштанды жыйноочу көбүрөөк эстутумду бөлө алbyte. OutOfMemoryError айрым түрлөрү :
  • OutOfMemoryError: Java үймөк мейкиндиги - эстутум жетишсиз болгондуктан an object Java үймөгүндө бөлүштүрүлбөйт. Ката эс тутумдун агып кетишинен же демейки үймөктүн көлөмү учурдагы колдонмо үчүн жетиштүү эмес болгондуктан келип чыгышы мүмкүн.

  • OutOfMemoryError: GC Overhead чеги ашып кетти - маалыматтардын көлөмү үймөгө араң туура келгендиктен, таштанды жыйноочу ар дайым иштейт, ал эми Java программасы абдан жай иштейт, натыйжада таштанды жыйноочунун ашыкча чеги ашып кетти жана колдонмо бул ката менен бузулат.

  • OutOfMemoryError: Суралган массивдин өлчөмү VM чегинен ашып кетти - колдонмо үймөк өлчөмүнөн чоңураак массив үчүн эстутумду бөлүүгө аракет кылганын көрсөтөт, бул дагы демейки эстутумдун жетишсиз бөлүштүрүлүшүнө байланыштуу болушу мүмкүн.

  • OutOfMemoryError: Metaspace — үймөктө метаберorштер үчүн бөлүнгөн орун түгөнүп калды (метаберorштер класстар жана методдор үчүн нускама).

  • OutOfMemoryError: себеп боюнча byte өлчөмүн сураңыз. Алмашуу мейкиндиги жок - үймөктөн эстутумду бөлүүгө аракет кылып жатканда кандайдыр бир мүчүлүштүктөр орун алды жана натыйжада үймөктө эстутум жетишсиз болду.

10. Стек изи деген эмне? Кантип алса болот?

Stack Trace бул колдонмонун ушул учуруна чейин чакырылган класстардын жана методдордун тизмеси. Колдонмонун белгилүү бир жеринде стек изин төмөнкүдөй чакыра аласыз:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Ушундай жол менен биз LIFO тартибинде тизилген стек микроэлементтер массивине ээ болобуз - Last In First Out . Интервьюдагы суроолорду жана жоопторду талдоо.  1-8-бөлүкJavaда, эреже катары, стек изи жөнүндө сөз болгондо, алар ката (же өзгөчө жагдай) пайда болгондо, консолдо көрсөтүлүүчү стек изин билдирет. Сиз төмөнкүдөй өзгөчөлүктөрдүн стек изин ала аласыз:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
Эгерде биз консолдо өзгөчө стек изин чыгаруу жөнүндө сөз кылсак:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Ошондой эле, бизде ката, текшерилбеген өзгөчөлүк же текшерилген өзгөчөлүк бар болсо , биз аны иштетпейбиз, бирок алдыга жылдырабыз, анда колдонмо бузулганда биз автоматтык түрдө консолдогу өзгөчөлүктөрдүн стек изин алабыз. Консолдогу стек изи өзгөчөлүгүнүн кичинекей мисалы: Сиз бул жерденИнтервьюдагы суроолорду жана жоопторду талдоо.  1-9-бөлүк Stack Trace жөнүндө көбүрөөк окуй аласыз . Биз бүгүн ушул маселеге токтолобуз...Интервьюдагы суроолорду жана жоопторду талдоо.  1-10-бөлүк
Сериядагы башка материалдар:
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION