CodeGym/Java блог/Случаен/Проучване на въпроси и отговори от интервю за работа за п...
John Squirrels
Ниво
San Francisco

Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик. Част 1

Публикувано в групата
здрасти CodeGym събра разнообразна група от хора. Някои от нас не искат нищо повече от това да станат Java разработчици и ние инвестираме много време и усorя в разработката. Други вече са Java разработчици. И в двата случая трябва да сте готови да бъдете тествани в технически интервюта. Това не е лесно. Те изискват Howто емоционална, така и техническа подготовка. Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 1Наскоро попаднах на няколко големи списъка с въпроси за интервю за позиции на Java разработчици. Въпросите са разделени на различни нива: младши, средни и старши. Не се тревожете: не всички въпроси са лесни, но тези със звездичка рядко се задават. Въпросите са добри и бих искал да се опитам да отговоря на повечето от тях. Ясно е, че всичко това няма да се побере в една статия. В края на краищата там има много въпроси. Това означава, че ще има цяла поредица от статии с отговори на тези въпроси за интервю. Позволете ми веднага да подчертая няколко точки: отговорите ще бъдат кратки, тъй като отговорите, написани много подробно, могат да бъдат изтеглени в отделна статия. Освен това на интервютата не се искат свръхподробни и обемни отговори, защото вашият интервюиращ има само час, за да ви интервюира по важни теми (и,

Въпроси и отговори за позиция младши разработчик

Общи въпроси

1. Какви дизайнерски модели познавате? Разкажете ни за два дизайн модела, които сте използвали в работата си.

Има огромно разнообразие от модели. За тези от вас, които искат да се запознаят задълбочено с шаблоните за проектиране, препоръчвам да прочетат книгата "Head First. Design Patterns". Ще ви помогне лесно да научите детайлите на най-основните дизайнерски модели. По отношение на дизайнерските модели, които бихте могли да споменете на интервю за работа, следното идва на ум:
  • Builder — често използван шаблон, алтернатива на класическия подход за създаване на обекти;
  • Стратегия — модел, който по същество представлява полиморфизъм. Това означава, че имаме един интерфейс, но поведението на програмата се променя в зависимост от конкретната имплементация на интерфейса, предадена на функцията (моделът на стратегията сега се използва почти навсякъде в applicationsта на Java).
Ако това не ви е достатъчно, обърнете внимание на Spring (ако вече сте запознати с него), защото това е цяла платформа от рамки, които от своя страна са пропити с модели от началото до края. Ето няколко примера за това, за което говоря:
  • Factory — този модел може да бъде намерен в ApplicationContext (or в BeanFactory);
  • Singleton — всички зърна са сингълтони по подразбиране;
  • Прокси — основно всичко в Spring използва този модел по един or друг начин, например AOP;
  • Верига на отговорност — модел, който е в основата на Spring Security;
  • Шаблон — използван в Spring JDBC.

Java Core

Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 2

2. Какви типове данни има в Java?

Java има следните примитивни типове данни:
  • byte — цели числа от -128 до 127, заема 1 byte;
  • short — цели числа от -32768 до 32767, заема 2 byteа;
  • int — цели числа, вариращи от -2147483648 до 2147483647, заема 4 byteа;
  • long — цели числа, вариращи от 9223372036854775808 до 9223372036854775807, заема 8 byteа;
  • float — числа с плаваща запетая, вариращи от -3.4E+38 до 3.4E+38, заема 4 byteа;
  • двойно — числата с плаваща запетая, вариращи от -1.7E+308 до 1.7E+308, заемат 8 byteа;
  • char — единични знаци в UTF-16, заема 2 byteа;
  • булеви стойности true/false, заема 1 byte.
И има референтни типове данни, които сочат към обекти в купчината.

3. Как обектът се различава от примитивните типове данни?

Първата разлика е количеството заета памет: примитивите заемат много малко, защото съдържат само собствената си стойност, но обектите могат да съдържат много различни стойности - Howто примитиви, така и препратки към други обекти. Втората разлика е следната: Java е обектно-ориентиран език, така че всичко в Java работи е взаимодействие между обекти. Примитивите не се вписват много добре тук. Всъщност, това е причината Java да не е 100% обектно-ориентиран език. Третата разлика, която следва от втората е, че тъй като Java е фокусирана върху взаимодействията на обекти, има много различни механизми за управление на обекти. Например конструктори, методи, изключения (които работят основно с обекти) и т.н. И за да позволят на примитивите по няHowъв начин да работят в тази обектно-ориентирана среда, създателите на Java измислихаобвивки за примитивните типове ( Integer , Character , Double , Boolean ...)

4. Каква е разликата между предаването на аргументи по препратка и по стойност?

Примитивните полета съхраняват стойността си: например, ако зададем int i = 9; , тогава полето i съхранява стойността 9. Когато имаме препратка към обект, това означава, че имаме поле с препратка към обекта. С други думи, имаме поле, което съхранява address на обекта в паметта.
Cat cat = new Cat();
Това означава, че полетата с препратка към обект също съхраняват стойности . Техните стойности са addressи на паметта. Това означава, че cat съхранява address на паметта на новия обект Cat() . Когато предаваме аргумент на метод, неговата стойност се копира. В случай на примитив, стойността на примитив се копира. Съответно методът работи с копието. Когато копието се промени, оригиналът не се засяга. В случай на референтен тип, стойността на address на паметта се копира. Съответно и двете референтни променливи ще съхраняват addressи, сочещи към един и същи обект. И ако използваме тази нова препратка, за да променим обекта, тогава ще открием, че тя също е променена за старата препратка. В крайна сметка и двамата сочат към един и същи обект.

5. Какво е JVM, JDK и JRE?

JVM означава Java Virtual Machine , която изпълнява Java byte code, предварително генериран от компилатора. JRE означава Java Runtime Environment . По принцип това е среда за стартиране на Java applications. Той включва JVM, стандартни библиотеки и други компоненти за стартиране на аплети и applications, написани на езика за програмиране Java. С други думи, JRE е пакет от всичко необходимо за стартиране на компorрана Java програма, но не включва инструменти и помощни програми като компилатори or дебъгери за разработване на applications. JDK означава Java Development Kit , който е разширение на JRE. Тоест, това е среда не само за стартиране на Java applications, но и за тяхното разработване. JDK съдържа всичко в JRE, плюс различни допълнителни инструменти — компилатори и дебъгери — необходими за създаване на Java applications (включва Java documentи). Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 3

6. Защо да използваме JVM?

Както беше посочено по-горе, Java Virtual Machine е виртуална машина, която изпълнява Java byte code, който е предварително генериран от компилатора. Това означава, че JVM не разбира изходния code на Java. И така, първо компorраме .java файлове. Компorраните файлове имат .classразширение и сега са под формата на byte code, който JVM разбира. JVM е различен за всяка ОС. Когато JVM изпълнява файлове с byte code, той ги адаптира за операционната система, на която работи. Всъщност, тъй като има различни JVM, JDK (or JRE) също се различават за различните OS (всяка version се нуждае от собствена JVM). Нека си припомним How работи разработката в други езици за програмиране. Вие пишете програма, след това нейният code се компorра в машинен code за конкретна операционна система и след това можете да я стартирате. С други думи, трябва да напишете различни версии на програмата за всяка платформа. Но двойната обработка на codeа на Java (компorране на изходния code в bytecode и след това обработка на bytecode от JVM) ви позволява да се насладите на предимствата на кросплатформено решение. Ние създаваме codeа веднъж и го компorраме в byte code. След това можем да го пренесем във всяка операционна система и собствената JVM може да го стартира. И точно това е легендарното на Javaфункция за писане веднъж, стартиране навсякъде . Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 4

7. Какво е byte code?

Както казах по-горе, компилаторът преобразува Java codeа в междинен byte code (преминаваме от файлове с разширение .java към файлове с разширение .class). В много отношения byte codeът е подобен на машинния code, с изключение на това, че неговият набор от инструкции не е за реален процесор, а за виртуален. Това каза, че може да включва секции, предназначени за JIT компилатор, който оптимизира изпълнението на команда за действителния процесор, на който програмата работи. JIT компилацията, наричана още компилация в движение, е технология, която увеличава производителността на програма с byte code чрез компorране на byte codeа в машинен code or друг формат, докато програмата работи. Както може би се досещате, JVM използва JIT компилатора, когато изпълнява byte code. Нека да разгледаме примерен byte code: Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 5Не е много четиво, а? Добрата новина е, че тази инструкция не е предназначена за нас. Това е за JVM.

8. Какви са характеристиките на JavaBean?

JavaBean е Java клас, който следва определени правила . Ето някои от правилата за писане на JavaBean :
  1. Класът трябва да съдържа празен конструктор (без аргументи) с модификатор за публичен достъп. Този конструктор позволява да се създаде обект от класа без ниHowви излишни проблеми (така че да няма излишно ръчкане с аргументи).

  2. Вътрешните полета са достъпни чрез методите get и set instance, които трябва да имат стандартната реализация. Например, ако имаме поле за име , тогава трябва да имаме getName и setName и т.н. Това позволява на различни инструменти (рамки) автоматично да получават и задават съдържанието на bean-овете без ниHowви затруднения.

  3. Класът трябва да замени методите equals() , hashCode() и toString() .

  4. Класът трябва да може да се сериализира. Това означава, че трябва да има интерфейса на маркера Serializable or да внедри интерфейса Externalizable . Това е, за да може състоянието на зърна да бъде надеждно запазено, съхранено и възстановено.

Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 6

9. Какво е OutOfMemoryError?

OutOfMemoryError е критична грешка по време на изпълнение, свързана с Java Virtual Machine (JVM). Тази грешка възниква, когато JVM не може да разпредели обект, защото няма достатъчно памет за него и събирачът на отпадъци не може да разпредели повече памет. Няколко вида OutOfMemoryError :
  • OutOfMemoryError: Java heap space — обектът не може да бъде разпределен в Java heap поради недостатъчна памет. Тази грешка може да бъде причинена от изтичане на памет or от размер на паметта по подразбиране, който е твърде малък за текущото приложение.

  • OutOfMemoryError: GC Overhead limit надвишен — тъй като данните на приложението едва се побират в купчината, събирачът на боклук работи през цялото време, което кара Java програмата да работи много бавно. В резултат на това лимитът за събиране на боклук е превишен и приложението се срива с тази грешка.

  • OutOfMemoryError: Размерът на искания масив надвишава лимита на VM — това показва, че приложението се е опитало да разпредели памет за масив, който надвишава размера на купчината. Отново, това може да означава, че по подразбиране е разпределена недостатъчна памет.

  • OutOfMemoryError: Metaspace — купчината изчерпа пространството, разпределено за метаданни (метаданните са инструкции за класове и методи).

  • OutOfMemoryError: byteове за размер на искане за причина. Няма място за суап — възникна грешка при опит за разпределяне на памет от купчината и в резултат на това купчината няма достатъчно място.

10. Какво е проследяване на стека? Как да го получа?

Проследяването на стека е списък на класовете и методите, които са бor извикани до този момент при изпълнението на приложение. Можете да получите трасирането на стека в определена точка от приложението, като направите следното:
StackTraceElement[] stackTraceElements =Thread.currentThread().getStackTrace();
Това ни дава масив от StackTraceElements, подредени в реда „Последен влязъл, първи излязъл“ (LIFO) . Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 7В Java, когато хората говорят за проследяване на стека, те обикновено имат предвид проследяване на стека, показвано на конзолата, когато възникне грешка (or изключение). Можете да получите трасирането на стека от изключения като това:
StackTraceElement[] stackTraceElements;
try{
                ...
} catch (Exception e) {
   stackTraceElements = e.getStackTrace();
}
И ако искаме да покажем трасирането на стека на изключение на конзолата:
try{
                ...
} catch (Exception e) {
  e.printStackTrace();
}
Освен това, ако възникне грешка, непроверено изключение or необработено проверено изключение, ние автоматично получаваме трасирането на стека на изключението на конзолата, когато приложението се срине. Ето малък пример за проследяване на стека на конзолата: Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 8И на тази бележка ще приключим нашата дискусия по тази тема днес.Проучване на въпроси и отговори от интервю за работа за позиция Java разработчик.  Част 1 - 9
Прочетете още:
Коментари
  • Популярен
  • Нов
  • Стар
Трябва да сте влезли, за да оставите коментар
Тази страница все още няма коментари