Пособие для будущего Java разработчика. Собеседование и карьера. Собеседования на Middle Java разработчика Список вопросов для собеседования java

  • Что такое ООП?
  • Что такое объект?
  • Назовите основные принципы ООП.
  • Что такое наследование?
  • Что такое полиморфизм? Какие проявления полиморфизма в Java Вы знаете?
  • Что такое инкапсуляция?
  • Что такое aбстракция?
  • В чем преимущества объектно-ориентированных языков программирования?
  • Как использование объектно – ориентерованного подхода улучшает разработку программного обеспечения?
  • Имеется выражение «является» и «имеет». Что они подразумевают в плане принципов ООП? В чем разница между композицией и агрегацией?
  • Что вы подразумеваете под полиморфизмом, инкапсуляцией и динамическим связыванием?

  • Чем отличается JRE, JVM и JDK?
  • Опишите модификаторы доступа в Java.
  • Что такое package level access.
  • Чем абстрактный клас отличается от интерфейса? В каких случаях Вы бы использовали абстрактный класс, а в каких интерфейс?
  • Может ли объект получить доступ к private-переменной класса? Если, да, то каким образом?
  • Для чего в джаве статические блоки?
  • Можно ли перегрузить static метод?
  • Расскажите про внутренние классы. Когда вы их будете использовать?
  • В чем разница между переменной экземпляра и статической переменной? Приведите пример.
  • Приведите пример когда можно использовать статический метод?
  • Расскажите про классы- загрузчики и про динамическую зарузку классов.
  • Для чего нужен оператор "assert" в джава?
  • Почему в некоторых интерфейсах вообще не определяют методов?
  • Какая основная разница между String, StringBuffer, StringBuilder?
  • Расскажите про потоки ввода-вывода Java.
  • Что такое Heap и Stack память в Java?
  • Какая разница между Stack и Heap памятью в Java?
  • Расскажите про модель памяти в джава?
  • Как работает сборщик мусора (garbage collector)?
  • Расскажите про приведение типов. Что такое понижение и повышение типа? Когда вы получаете ClassCastException?
  • Что такое статический класс, какие особенности его использования?
  • Каким образом из вложенного класса получить доступ к полю внешнего класса.
  • Какие существуют типы вложенных классов? Для чего они используются?
  • Возможно ли при переопределении (override) метода изменить:
  • Модификатор доступа
  • Возвращаемый тип
  • Тип аргумента или количество
  • Имя аргументов
  • Изменять порядок, количество или вовсе убрать секцию throws?
  • Что такое autoboxing?
  • Что такое Generics?
  • Какова истинная цель использования обобщенных типов в Java?
  • Каким образом передаются переменные в методы, по значению или по ссылке?
  • Какие методы есть у класса Object?
  • Правила переопределения метода Object.equals().
  • Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
  • Какая связь между hashCode и equals?
  • Каким образом реализованы методы hashCode и equals в классе Object?
  • Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
  • Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
  • Для чего нужен метод hashCode()?
  • Правила переопределения метода Object.hashCode().
  • Расскажите про клонирование объектов. В чем отличие между поверхностным и глубоким клонированием?
  • Правила переопределения метода Object.clone().
  • Где и как вы можете использовать закрытый конструктор?
  • Что такое конструктор по умолчанию?
  • Опишите метод Object.finalize().
  • Чем отличаются слова final, finally и finalize?
  • Опишите иерархию исключений.
  • Какие виды исключений в Java вы знаете, чем они отличаются?
  • Что такое checked и unchecked Exception?
  • Как создать свой unchecked Exception?
  • Какие есть Unchecke exeption?
  • Что такое Error?
  • Опишите работу блока try-catch-finally.
  • Возможно ли использование блока try-finally (без catch)?
  • Всегда ли исполняется блок finally?
  • Какие есть оссобенности класса String? что делает метод intern().
  • Можно ли наследовать строковый тип, почему?
  • Почему строка является популярным ключом в HashMap в Java?
  • Дайте определение понятию конкатенация строк.
  • Как перевернуть строку?
  • Как сравнить значение двух строк?
  • Как обрезать пробелы в начале и конце строки?
  • Дайте определение понятию "пул строк".
  • Можно ли синхронизировать доступ к строке?
  • Как правильно сравнить значения строк двух различных объектов типа String и StringBuffer?
  • Почему строка неизменная и финализированная в Java?
  • Напишите метод удаления данного символа из строки.
  • Что такое рефлексия?
  • Что произойдет со сборщиком мусора (GC), если во время выполнения метода finalize() некоторого объекта произойдет исключение?
  • Что такое интернационализация, локализация?
  • Что такое Аннотации в Java?
  • Какие функции выполняет Аннотации?
  • Какие встроенные аннотации в Java вы знаете?
  • Что делают аннотации @Retention, @Documented, @Target и @Inherited?
  • Что делают аннотации @Override, @Deprecated, @SafeVarargs и @SuppressWarnings?
  • Какой жизненный цикл аннотации можно указать с помощью @Retention?
  • К каким элементам можно применять аннотацию, как это указать?
  • Как создать свою Аннотацию?
  • Атрибуты каких типов допустимы в аннотациях?
  • Что такое JMX?
  • Какие выгоды предлагает JMX?
  • Что еще умеет JMX кроме дистанционного управления?
  • Что такое MBean?
  • Какие типы MBeans существуют?
  • Что такое MBean Server?
  • Какие механизмы обеспечивают безопасность в технологии Java?
  • Назовите несколько видов проверок которые выполняет верификатор байт-кода Java?
  • Что вы знаете о "диспетчере защиты" в Java?
  • Что такое JAAS?
  • Что такое Рефакторинг?

  • Что такое Коллекция?
  • Назовите основные интерфейсы коллекций и их имплементации.
  • Чем отличается ArrayList от LinkedList? В каких случаях лучше использовать первый, а в каких второй?
  • Чем отличается HashMap от Hashtable?
  • Чем отличается ArrayList от Vector?
  • Как сравниваются елементы коллекций?
  • Расположите в виде иерархии следующие интерфейсы: List, Set, Map, SortedSet, SortedMap, Collection,Iterable, Iterator, NavigableSet, NavigableMap.
  • Почему Map - это не Collection, в то время как List и Set являются Collection?
  • Дайте определение понятию "iterator".
  • Что вы знаете об интерфейсе Iterable?
  • Как одной строчкой преобразовать HashSet в ArrayList?
  • Как одной строчкой преобразовать ArrayList в HashSet?
  • Как перебрать все ключи Map учитывая, что Map - это не Iterable?
  • Как перебрать все значения Map учитывая, что Map - это не Iterable?
  • Как перебрать все пары ключ-значение в Map учитывая, что Map - это не Iterable?
  • В чем проявляется "сортированность" SortedMap, кроме того, что toString() выводит все по порядку?
  • Как одним вызовом копировать элементы из любой Collection в массив?
  • Реализуйте симметрическую разность двух коллекций используя методы Collection (addAll(), removeAll(), retainAll()).
  • Сравните Enumeration и Iterator.
  • Как между собой связаны Iterable и Iterator?
  • Как между собой связаны Iterable, Iterator и "for-each " введенный в Java 5?
  • Сравните Iterator и ListIterator.
  • Что произойдет, если я вызову Iterator.next() не "спросив" Iterator.hasNext()?
  • Что произойдет, если я вызову Iterator.next() перед этим 10 раз вызвав Iterator.hasNext()? Я пропущу 9 элементов?
  • Если у меня есть коллекция и порожденный итератор, изменится ли коллекция, если я вызову iterator.remove()?
  • Если у меня есть коллекция и порожденный итератор, изменится ли итератор, если я вызову collection.remove(..)?
  • Зачем добавили ArrayList, если уже был Vector?
  • В реализации класса ArrayList есть следующие поля: Object elementData, int size. Объясните, зачем хранить отдельно size, если всегда можно взять elementData.length?
  • LinkedList - это односвязный, двусвязный или четырехсвязный список?
  • Какое худшее время работы метода contain() для элемента, который есть в LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Какое худшее время работы метода contain() для элемента, который есть в ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Какое худшее время работы метода add() для LinkedList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Какое худшее время работы метода add() для ArrayList (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Сколько выделяется элементов в памяти при вызове ArrayList.add()?
  • Сколько выделяется элементов в памяти при вызове LinkedList.add()?
  • Оцените количество памяти на хранение одного примитива типа byte в LinkedList?
  • Оцените количество памяти на хранение одного примитива типа byte в ArrayList?
  • Я добавляю элемент в середину List-а: list.add(list.size()/2, newElem). Для кого эта операция медленнее - для ArrayList или для LinkedList?
  • Как перебрать элементы LinkedList в обратном порядке, не используя медленный get(index)?
  • Как одним вызовом из List получить List со всеми элементами, кроме первых и последних 3-х?
  • Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.hashCode() == ref1.hashCode()?
  • Могут ли у разных объектов в памяти (ref0 != ref1) быть ref0.equals(ref1) == true?
  • Могут ли у разных ссылок на один объект в памяти (ref0 == ref1) быть ref0.equals(ref1) == false?
  • Есть класс Point{int x, y;}. Почему хэш-код в виде 31 * x + y предпочтительнее чем x + y?
  • Если у класса Point{int x, y;} "правильно " реализовать метод equals (return ref0.x == ref1.x && ref0.y == ref1.y), но сделать хэш-код в виде int hashCode() {return x;}, то будут ли корректно такие точки помещаться и извлекаться из HashSet?
  • equals() порождает отношение эквивалентности. Какими из свойств обладает такое отношение: коммутативность, симметричность, рефлексивность, дистрибутивность, ассоциативность, транзитивность?
  • Можно ли так реализовать equals(Object that) {return this.hashCode() == that.hashCode()}?
  • В equals требуется проверять, что аргумент (equals(Object that)) такого же типа как и сам объект. В чем разница между this.getClass() == that.getClass() и that instanceof MyClass?
  • Можно ли реализовать метод equals класса MyClass вот так: class MyClass {public boolean equals(MyClass that) {return this == that;}}?
  • Будет ли работать HashMap, если все ключи будут возвращать int hashCode() {return 42;}?
  • Зачем добавили HashMap, если уже был Hashtable?
  • Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресацией и на основе метода цепочек. Как реализована HashMap? Почему так сделали (по вашему мнению)? В чем минусы и плюсы каждого подхода?
  • Сколько переходов по ссылкам происходит, когда вы делаете HashMap.get(key) по ключу, который есть в таблице?
  • Сколько создается новых объектов, когда вы добавляете новый элемент в HashMap?
  • Как работает HashMap при попытке сохранить в нее два элемента по ключам с одинаковым hashCode, но для которых equals == false?
  • HashMap может выродиться в список даже для ключей с разным hashCode. Как это возможно?
  • Какое худшее время работы метода get(key) для ключа, которого нет в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Какое худшее время работы метода get(key) для ключа, который есть в таблице (O(1), O(log(N)), O(N), O(N*log(N)), O(N*N))?
  • Объясните смысл параметров в конструкторе HashMap(int initialCapacity, float loadFactor).
  • В чем разница между HashMap и IdentityHashMap? Для чего нужна IdentityHashMap? Как может быть полезна для реализации сериализации или клонирования?
  • В чем разница между HashMap и WeakHashMap? Для чего нужна WeakHashMap?
  • В WeakHashMap используются WeakReferences. А почему бы не создать SoftHashMap на SoftReferences?
  • В WeakHashMap используются WeakReferences. А почему бы не создать PhantomHashMap на PhantomReferences?
  • Сделайте HashSet из HashMap (используйте только множество ключей, но не множество значений).
  • Сделайте HashMap из HashSet (HashSet>).
  • Сравните интерфейсы java.util.Queue и java.util.Deque.
  • Кто кого расширяет: Queue расширяет Deque, или Deque расширяет Queue?
  • Почему LinkedList реализует и List, и Deque?
  • В чем разница между классами java.util.Arrays и java.lang.reflect.Array?
  • В чем разница между классами java.util.Collection и java.util.Collections?
  • Напишите НЕмногопоточную программу, которая заставляет коллекцию выбросить ConcurrentModificationException.
  • Что такое "fail-fast поведение"?
  • Для множеств еnum-ов есть специальный класс java.util.EnumSet? Зачем? Чем авторов не устраивал HashSet или TreeSet?
  • java.util.Stack - считается "устаревшим". Чем его рекомендуют заменять? Почему?
  • Какая коллекция реализует дисциплину обслуживания FIFO?
  • Какая коллекция реализует дисциплину обслуживания FILO?
  • Приведите пример, когда какая-либо коллекция выбрасывает UnsupportedOperationException.
  • Почему нельзя написать "ArrayList numbers = new ArrayList();" но можно "List numbers = new ArrayList();"?
  • LinkedHashMap - что это еще за "зверь"? Что в нем от LinkedList, а что от HashMap?
  • LinkedHashSet - что это еще за "зверь"? Что в нем от LinkedList, а что от HashSet?
  • Говорят, на LinkedHashMap легко сделать простенький кэш c "invalidation policy", знаете как?
  • Что позволяет сделать PriorityQueue?
  • В чем заключаются отличия java.util.Comparator от java.lang.Comparable?

  • Что такоє символьная ссылка?
  • Какая разница между I/О и NIO?
  • Какие особенности NIO вы знаете?
  • Какие существуют виды потоков ввода/вывода?
  • Назовите основные классы потоков ввода/вывода.
  • Чем отличаются и что общего у OutputStream, InputStream, Writer, Reader?
  • Какие подклассы базового класса InputStream ви знаєте, для чего они предназначены?
  • Что вы знаете о RandomAccessFile?
  • Какие есть режимы доступа к файлу есть у RandomAccessFile ?
  • Какие подклассы базового класса OutputStream ви знаєте, для чего они предназначены?
  • Для чего используется PushbackInputStream?
  • Для чего используется SequenceInputStream?
  • Какие подклассы базового класса Reader ви знаєте, для чего они предназначены?
  • Какие подклассы базового класса Writer ви знаєте, для чего они предназначены?
  • Что такое абсолютный путь и относительный путь?
  • В каких пакетах лежат классы-потоки?
  • Что вы знаете о классах-надстройках?
  • Какой класс-надстройка позволяет читать данные из входного байтового потока в формате примитивных типов данных?
  • Какой класс-надстройка позволяет ускорить чтение/запись за счет использования буфера?
  • Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
  • В чем отличие класса PrintWriter от PrintStream?
  • Какой класс предназначен для работы с элементами файловой системы?
  • Какой символ является разделителем при указании пути в файловой системе?
  • Какие методы класса File ви знаєте?
  • Что вы знаете об интерфейсе FileFilter?
  • Какие классы позволяют архивировать объекты?

  • На каком объекте происходит синхронизация при вызове static synchronized метода?
  • Для чего используется ключевое слово volatile, synchronized, transient, native?
  • Что значит приоритет потока?
  • Что такое потоки –демоны в джава?
  • Что значит усыпить поток?
  • В каких состояниях может быть поток в джава? Как вообще работает поток?
  • Чем отличаются два интерфейса для реализации задач Runnable и Callable?
  • Различия между CyclicBarrier и CountDownLatch?
  • Что такое состояние гонки (race condition)?
  • Как остановить нить?
  • Что происходит, когда в нити появляется исключение?
  • Что такое ThreadLocal переменная?
  • Что такое FutureTask?
  • Различие между interrupted и isInterrupted?
  • Почему методы wait и notify вызываются в синхронизированном блоке?
  • Что такое пул нитей?
  • Различия между livelock и deadlock?
  • Как проверить, удерживает ли нить lock?
  • Как получить дамп нити?
  • Какой JVM параметр используется для контроля размера стека нити?
  • Различия между synchronized и ReentrantLock?
  • Что такое Semaphore?
  • Что будет, если очередь пула нитей уже заполнена, а вы подадите задачу?
  • Различия между методами submit() и execute() у пула нитей?
  • Что такое блокирующий метод?
  • Что такое ReadWriteLock?
  • Что такое double checked locking Синглтона?
  • Что такое фреймворк Fork/Join?
  • Сила - это река, из которой могут пить многие, и обучение джедая - не единственная возможность зачерпнуть из неё». - Люк Скайуокер Все подборки книг остались позади. Что из них читать, что нет - решать только вам. Сейчас у вас осталась одна-единственная цель: устроиться на работу и построить карьеру, не наступая на грабли. Последняя статья разделена на разделы: - До работы - Собеседование - Во время работы В этой части очень много моего личного мнения, поэтому прошу не вырывать фразы из контекста и относиться к ней как к откровенному разговору со старым приятелем:).

    До работы

    Ниже - десяток самых популярных клише, которые возникают, когда душа тянется к программированию, но человеку мешают те или иные обстоятельства. Моя задача - попробовать остановить вашу мнительность и настроить вас на позитивный образ мышления. Если вы читаете эту статью - вы дальше, чем вы думаете! Ментально вы уже там, где нужно, а если прочитали уже некоторые книги, то полпути уже пройдено. Поэтому перестаньте сомневаться, - это удел слабых. Только вперед! Уже лучше? Тогда поехали! «У меня нет образования» Когда я совсем зеленый поступал в академию одной из крупных аутсорсинговых фирм, интервьюеры мне мягко намекнули, что диплом их вообще не интересует, поэтому вопросы были конкретные - по ООП и по базовой Java. Конечно, вы встретите вакансии, где наличие тех. образования будет четким требованием. Я лишь хочу сказать, что его отсутствие - это не препятствие в наши дни. Во многих зарубежных конторах просят BS/MS Computer Science или, внимание, relevant experience. Не убедительно? Возможно, вас воодушевит тот факт, что технического образование нет у меня;), но это абсолютно не помешало получить в опыт в крупных компаниях. Спросите меня сейчас, как я поступил бы, если бы можно было перемотать пленку назад? Конечно пошел бы в КПИ/НАУ, но не особо горевал бы, не поступив. Перестаньте париться по этому поводу. Пройдет время - можно и в 40 получить корочку, если вам захочется, - а пока сфокусируйтесь на том, чтобы стать junior разработчиком здесь и сейчас. «Там будут люди умнее меня» Всегда будут люди умнее, смышленее, гибче, талантливее, чем вы, и любая работа - не исключение. Этот факт абсолютно не дает вам права отходить от цели. Возможно, где-то на другом конце Земного шара сидит маленький мальчик из Японии, который умножает и делит числа быстрее вас, а какая-то бабушка из Чехии печатает на клавиатуре мобильного телефона быстрее любого тинейджера. Но вы же не задумываетесь об этом, верно? Так почему тогда вас должны волновать люди, с которыми вы будете работать, когда устроитесь? В чем-то ваши будущие коллеги будут вас превосходить, в чем-то будут вам проигрывать. Это нормально! Вычеркиваем. «Мне кажется, я не смогу» Ну, во-первых, никто не сказал, что будет легко, но это совершенно не означает, что ваша цель неосуществима. Вам ничего не мешает просто-напросто попробовать, даже если вы сейчас работаете бухгалтером или продавцом-консультантом. Приходите после рабочего дня и садитесь за учебу. Если через время вы видите какой-то прогресс - это знак, что вы движетесь в правильном направлении. Не останавливайтесь! Если вам это хоть немножко интересно и вам это дается, тогда я не знаю ни одного пункта, который мог бы переубедить меня в том, что вы не достойны этого. «Меня накрывает лень» Лень - это всего лишь отсутствие мотивации. Если вы замечаете, что большую часть свободного времени вместо того, чтобы учиться и не отбиваться от курса вы, тупо занимаетесь фигней - я спешу вас уведомить о том, что, скорее всего, работа программиста - это не ваше. По крайней мере, не сейчас. Некоторые называют лень грехом, болезнью, холерой современного века вместе с ожирением. Оставьте это дело карьерным истеричкам. На мой взгляд, всё вокруг в этой жизни пропитано иллюзией борьбы и конкуренции: кто выше, кто сильнее, кто богаче. У кого машина покруче, у кого в коллективе зарплата больше, кто в спортзале жмет штангу потяжелее, кто из девушек раньше вышел замуж и завел детей - от этого тошнит, как от вонючего фаст-фуда. Люди перестали жить и радоваться жизни, следуя своей мечте, променяв свою зону комфорта на выбор между Pepsi и Coca-Cola. Для меня лень - это хорошо, это просто замечательно. Это обыкновенная защитная функция вашего организма экономить силы и время на бесполезные для него вещи. Человек создан быть свободным, поэтому если вы ленитесь - перестаньте стараться поднимать вашу пятую точку с дивана - возможно, она сейчас на своем месте:). «Я иду туда из-за денег» Если собрать разработчиков и сказать: отныне ваша зарплата будет 3-4к гривен для любого уровня, а тестировщики как будут получать те же рейты, так и останутся, то вопрос будет в другом: не то, скольких бомбанет, а то, сколько программистов после этой новости останутся именно программистами. Много людей лезут в IТ из-за бабла. Зарплата в переводе с баксов, сыры и дорогая зеркалка. Сколько я ни работал с людьми, всегда проскальзывали разговоры по этому поводу. Я не говорю, что это плохо, я лишь хочу, чтобы вы не пытались себя уговаривать, что вы из чисто духовных целей идете, чтобы изменить мир к лучшему. Прежде чем устроиться джуниором, я знал, какие зарплаты у сеньоров, техлидов - да даже у миддла, - и эти мысли только воодушевляли: я в свое время до работы программистом о таких цифрах мог только мечтать. Называйте эти вещи своими именами и перестаньте этого стыдиться. «Мне кажется, это не мое» А чье тогда? Вы знаете, это легко проверить. Откройте первый том Хортсманна и начните читать, писать код из примеров. Если вам не нудно и вы не топчетесь на одной и той же главе вторую неделю - отбросьте сомнения. Изучение технических специальностей - штука последовательная. Нельзя перейти к B, не зная А, но у вас всегда будет шанс вернуться на главу назад и укрепить фундамент. Дерзайте. «Таких, как я, много» Всегда есть конкурс на место. Я не спорю, к примеру, сейчас тестировщиков без опыта эта цифра - 300-400, а то и больше на одно место. Да, это горькая правда, но, с другой стороны, я даже с такими показателями не могу найти достаточно серьезного пункта. Да хоть 100500 на место!! У вас всегда есть возможность наработать опыт на своих проектах: постройте какой-то сервис, десткоп-программу, используйте весь стек, который знаете - и вы уже набиваете шишки, а остальные, кроме рассылки своего резюме, больше ничего не делают. «На мое резюме никто не отвечает» В продолжение вышестоящего пункта. Скорее всего, для будущих айтишников без опыта уметь написать красивое резюме - это хорошо, но когда на одну вакансию очень много людей, многие резюме друг на друга очень похожи: ты, конечно, можешь прислать фотку с декольте (если девушка) или написать много технологий, которые сам знаешь только из википедии. И в том, и в другом случае HR’у будет попросту по барабану: если в вакансии проекта должен быть человек, который, к примеру, знает AWS, то будут искать в резюме именно AWS. Возьмите во внимание еще такой немаловажный момент, как рекомендации коллег. Это - боль любого человека, который не имеет подобных знакомых, потому как львиную долю junior’ов забирают именно оттуда (если человек по рекомендацияем - не идиот, конечно). Обычно на позицию junior берут, подчеркиваю, адекватного активного человека, который готов учиться, да даже за еду. И если такой кандидат провалится, то скорее следующим будете вы. Ну, а пока остальных собеседуют, у вас есть много направлений, где можно круто прокачаться: open source, задачки в интернете, а может, и фриланс. «Я не пройду собеседование/хочу в конкретную компанию» Да, скорее всего, первое собеседование будет провалом, но тот опыт, который вы получите, бесценен. С каждым последующим собеседованием вы будете уверенней и находчивей. Как сейчас помню свое первое... Боже, что за чушь я нес?! Как было стыдно уходить после него (я запомнил того упыря, который ухмылялся мне в лицо), но когда пришел домой и все обдумал, я понял, что это был прекрасный урок. После него все последующее подобные мероприятия были пропитаны легкостью и уверенностью. Никто не умер, ищут таких, как я, значит, я подойду. Верьте в себя! Если вы хотите конкретно в определенную компанию, то я думаю, что не открою вам популярный в нашей среде лайфхак, но все же: перед тем, как организовать встречу с этой конторой, пройдите перед этим интервью у конкурентов. Возможно, вам предложат то, от чего вы не откажетесь, или условия будут покруче. Знаю точно одно: вы не пожалеете. «Мне и на этой работе хорошо» Знаете, есть такое старое высказывание: Le mieux est I’enneini du bien («Лучшее - враг хорошего»). Возможно, ваша работа - не самое худшее место, ну да, начальник - козел, ну и что? Или, к примеру, третий год без премии, зато стабильная зарплата, тем более мне уже за 30. В какой-то мере оно, может, и так, только помните, что жизнь у вас одна, и ее не следует тратить на разочарования, на мнимый комфорт, когда вокруг столько всего интересного, и всей жизни не хватит, чтобы понять. Не бойтесь стать лучше, не бойтесь стать лучшим. Не слушайте никого, идите к цели настойчиво, если знаете, что это то, чем вы действительно хотите заниматься. Не бойтесь меняться!

    Собеседование

    По большому счету, вы можете найти это всё в интернете или поспрашивать у знакомых, но я считаю, что лишним не будет. Внизу пример собеседования на junior Java разработчика таким, каким был бы он сейчас, если бы интервьюером был я. Вопросы могут быть какими угодно, я лишь попробовал собрать что-то среднее по больнице. Представим, что вам повезло. Стандартная схема Шаг 1. Вам звонит рекрутер, и вы договариваетесь с ней об интервью, к примеру, завтра на 11:00. Шаг 2. Вы приходите раньше, так как 11:00 - скорее всего, время не для вас, а для разработчиков, у которых зарезервирована какая то комната, в которой вас будут пытать. Хорошим тоном любого рекрутера будет предупредить об этом. Шаг 3. На самом деле, начиная с шага 3, все пункты можно перемешивать, потому что собеседования могут проходить по-разному. К примеру, здесь вас могут спросить о базовых вещах, откуда вы родом, почему у нас, и так далее. Не исключено, что это может сделать сам HR, и конечно же, не исключено, что на английском. Право, это зависит от компании. Шаг 4. Вас приглашают в митинг-рум, где у вас будет разговор с одним, двумя, тремя людьми, один из которых будет либо сеньор, либо техлид, который в будущем будет работать с вами, среди остальных могут быть Scrum-мастер, другие разработчики либо HR’ы. Вас собеседуют какое-то время, затем жмут руку и отпускают. Шаг 5. Возможно, это будет на следующий день, а возможно, сразу же после шага 4 - у вас будет разговор с иностранным заказчиком (если такой имеется), а может, он сам и проведет интервью. Как видите, вариантов много. Где-то есть заказчики, где-то есть еще телефонное интервью. Это просто пример. Пример технического собеседования для Junior Java разработчика Мне очень жалко недоразработчиков, которые читают что-то умное с целью утопить/задавить/попонтоваться перед соискателем на интервью. Если вы видите, что перед вами такой человек, и чувствуете давление и напряжение с его стороны, незамедлительно посылайте его на три веселых, потому что после успешного прохождения с этим кретином придется работать. Не тратьте свои драгоценные нервы. Интервью, в первую очередь, должно проходить с целью узнать, что знает кандидат, а не то, чего он не знает. Естественно, если вам нужен человек, который знает что-то конкретное - спрашивайте его, не мучайте бесполезными вещами, которые не используете в проекте. Будьте людьми, в конце концов! Внизу приблизительные вопросы, которые могут попасться на интервью. По 5 вопросов для каждой технологии. OOP 1. Приведите пример полиморфизма из реальной жизни? В чем преимущества? Недостатки? Напишите простенький код. 2. Что такое интерфейс? Абстрактный класс? Зачем нужны интерфейсы, если можно тупо всё классами писать (немного провокации)?. То же самое - и про абстрактный класс. Что такое default методы в Java 8? 3. Постройте иерархию классов на конкретном примере воображаемой базы данных или программы (там список разных классов рабочих из базы данных) и взаимодействие между ними (aggregation, composition). 4. Чем composition отличиается от aggregation (is-a, has-a)? 5. Как можно обойти запрет на множественное наследование в Java? JDK/JRE 1. Чем JDK отличается от JRE? Что такое JVM? 2. Что такое classpath и для чего он нужен? Как, к примеру, загрузить другие классы в classpath? 3. Что вы знаете о classloader? 4. Расскажите о javadoc? Для чего он нужен? 5. Что такое JAR, WAR? Java Common 1. В чем отличие статических методов от не статических? Что такое final? 2. Что такое boxing-unboxing? byte b = 127, b++, какой результат и почему? 3. Что такое wrapper’ы, для чего это? 4. Что мне нужно сделать, чтобы создать свою аннотацию? Что такое overriding/overloading? 5. Почему класс String final? Что делает метод intern()? Data Structures 1. Расскажите о структуре Collections API в Java? Вы уже успели поработать с Stream API? 2. В чем отличие между ArrayList и LinkedList? Где лучше использовать ArrayList, а где LinkedList? 3. Расскажите как устроена HashMap? В чем особенности работы с TreeSet, HashSet? Имеете опыт с Guava коллекциями? 4. Массивы в Java, пример двумерного массива. 5. hashCode, equals на примере HashMap? Concurrency 1. Что такое процесс? Поток? Как создать поток? Что такое syncronized? Как понять этот или тот кусок кода thread-safe? 2. Что такое Thread.sleep, а также wait, notify, yield? 3. Приведите пример deadlock? 4. Коллекции при работе с многопоточностью. 5. ThreadLocal и Atomic операции SQL/JDBC 1. На конкретном примере достаньте из базы Users того, у которого salary больше, чем 5000. 2. Примеры INNER JOIN, OUTER JOIN, Order By, Group By. 3. Зачем нужен JDBC Driver? Примеры. 4. Расскажите всё, что знаете о ResultSet, парочка примеров. 5. Напишите простенькое DAO c применением RS. JPA/Hibernate 1. В чем недостатки и преимущества JPA? 2. Что такое EntityManager? Entity? 3. Критерии в JPA/Hibernate. 4. One-To-One, Many-To-Many в JPA/Hibernate 5. Как бы вы сделали JOIN в Hibernate? HQL? Spring 1. Что такое DI/IoC? Преимущества. 2. Что такое Application Context? Bean? 3. Как бывают типы IoC инициализации? 4. Singleton, Prototype в Spring? Annotation-based Spring? 5. Жизненный цикл бинов? Init-method, destroy-method? @PostConstruct, @PostDeploy? Maven 1. Основные фазы maven, жизненный цикл. 2. Как запускать maven с тестами, без тестов? Что такое archetype, mvn dependency? 3. Профайлы в maven, как создавать, как запускать. 4. Что такое snapshot в maven? Central/Remote репозитории? 5. Плагины в mvn, принцип работы, пару примеров. Algo 1. Понятие алгоритма, его скорость, Big-O-Notation. 2. Как найти средний елемент в LinkedList в один заход? 3. Напишите примитивный Stack? В чем разница между Stack и Queue? LIFO, FIFO? 4. Quick Sort, Merge Sort. 5. Напишите програмку, которая проверяет, является ли число палиндромом. Согласен, может, планка загнута чуть больше в сторону миддла, чем джуниора, но я думаю, что такая подготовочка вам точно не помешает. Старайтесь углубляться в каждый вопрос. Кстати, тут не указаны многие направления в Java, прошу учесть.

    Во время работы

    Здесь находятся маленькие рекомендации для тех junior/middle разработчиков, которые уже устроились. Эти простые советы могут пригодиться вам так же, как они помогли в свою очередь мне. Не будь упрямым Перестаньте доказывать свою точку зрения, даже если она соблазнительно близка к истине. Вы уже заметили, что находитесь в споре долго, а значит, по ту сторону баррикад - обычный осел, у которого в жизни только два мнения: его и неправильное. У нас невероятно много упрямых людей, которые стоят на своем до последнего, лишь бы их эго не пошатнулось. И это не только ваши коллеги, они просто повсюду - в маршрутке, в магазине, родственники, близкие друзья - от них не убежать и не скрыться. С ними нужно как-то взаимодействовать, даже если ты понимаешь, что человек несет открытую чушь. Более того, то же самое может случиться с вами. Согласен, простые вещи можно объяснить даже упрямому человеку, ну, а если речь идет об архитектурных вопросах в проекте или о личном мнении? Забудь про это барахло - будь гибче. Я очень уважаю людей, которые могут признать, что они ошиблись, у всех на глазах. Именно такое качество пригодится вам как младшему специалисту - с открытым человеком сложно вступать в конфронтацию, тем более когда он признает, что учится и имеет право ошибаться. Не опаздывай Не важно, это испытательный срок или просто пятница, на которую все забивают и приходят к 11. Важно другое: пунктуальность - это особенность профессионала, который зарабатывает себе лишние очки на ровном месте. А лишние баллы человеку без опыта не помешают, не правда ли? Старайтесь не опаздывать и уходить с работы, честно проработав 8 часов. Не злоупотребляй эстимейтами К сожалению, очень частая картина, в которую я в прошлом когда-то вляпался сам. Разработчик поставил себе 8-16 часов на выполнение задания и неожиданно справился за 3-4 часа. Остальные часы он тратит на свое личное время в виде настольного тенниса, как это было со мной, или просмотра youtube и прочей развлекаловки. С юридической точки зрения - вроде бы и договорились, но с человеческой вы лишаете себя очень важных вещей: 1.Вы стоите на месте, так как заполняете лишнее время ненужными вещами; 2. Вы не развиваетесь, так как не ставите руководство в известность о своем быстром прогрессе, никто и знать не знает, что вы справляетесь с заданиями быстрее, чем ожидали; 3. Вы начинаете постоянно завышать среднее количество времени на значения, это просто путь в никуда. Выделяй время на учебу Шанс отстать от паровоза нереально высокий, поэтому имей ввиду, что технологии и новые версии очень быстро развиваются. Подписывайся на Java евангелистов нашего дня, читай Java дайджесты и вообще интересуйся, учи новое. Это поможет тебе держать марку и развиваться. Помогай другим Не бойся помогать другим, даже если они такие же зеленые, как ты. Во-первых, ты здорово укрепишь свои знания, во-вторых, получишь уважение в глазах других, заодно помогут и тебе. В такой обстановке рождаются лучшие коллективы, а также очень быстрый технический и личностный рост. Занимайся спортом. Имей хобби Нет, серьезно. Мало того, что люди, занимающиеся спортом, выглядят и чувствуют себя лучше, так еще и работа мозга у них на высоте! Сколиоз, поясница, лишний вес, разные проблемы с внутренними органами - круглосуточные посиделки за компом даже за пределами работы способствуют этому. Если спортом заниматься не получается (в чем я сомневаюсь), используйте маленькие лайфхаки: работайте стоя время от времени, выходите на две остановки раньше и доходите до работы пешком. Да и вообще ходите больше пешком. Также есть риск перегореть, если программирование занимает гораздо больше вашего времени, чем 40 часов в неделю. На помощь придут личные увлечения - к примеру, фотография, музыка и т.д. Регулярно находите время для духовного. Балансируй в личной жизни Когда девушка/жена говорит: «ноутбук или я», нужно основательно призадуматься, какое место занимает в вашей жизни программирование. С другой стороны, начиная свой путь в IT, вам нужно доходчиво объяснить второй половинке, что сейчас вам нужно очень много учиться, чтобы добиться большего. Надеюсь, они поймут. Ну, а вы старайтесь балансировать и правильно распределять свое время. Выходи за пределы Будьте проактивными, если чувствуете, к примеру, что можете поделиться знаниями или у вас есть интересные темы, почему бы не организовать маленькие курсы внутри компании для других? Не бойтесь принимать участие в крупных open source проектах, если знаете, как можно помочь. Хотите написать игру, социальный проект или другую идею - делайте, делайте, делайте! Не стойте на месте, всегда ищите пути, где можно развиваться. Будь конкурентным Наблюдайте за новыми тенденциями, будьте в курсе трендов, которые происходят в Java сообществе. К примеру, не будет лишним, если вы изредка, время от времени, будете мониторить Java вакансии на DOU, но не для того, чтобы уйти от работы, а для того, чтобы знать, какие технологии остаются актуальными, а что потихоньку пропадает с рынка. Также старайтесь проходить курсы на Coursera, Udacity и т.д, изучайте новые горизонты. И даже английский: старайтесь смотреть любимые фильмы/сериалы в оригинале с субтитрами, чтобы подтянуть разговорный, скачайте пару-тройку интересных приложений для изучения языка (к примеру LinguaLeo), да и, в конце концов, сходите на курсы.

    Заключение

    Ну вот, мой маленький проект на DOU подходит в концу. Дорогие друзья, я искренне желаю вам устроиться на работу и надеюсь, что всё, что было описано мной за эти 7 статей, будет ценным пособием для вас, даже для тех, кто уже работает Java разработчиком. Будущие джуниоры, помните, что нет ничего невозможного, и если вы действительно поднажмете, у вас непременно всё получится. Я хочу, чтобы вы наконец определились, ваше это или не ваше, разработали подробный план обучения и хладнокровно ему следовали. Не расстраивайтесь, если взамен получаете тишину, - это всё временно, главное - верить и ни в коем случае не сбиваться с курса, а учиться, учиться и еще раз учиться. Огромную благодарность я хотел бы выразить команде DOU за редактирование большого количества материала и за предоставление мне главного эфирного времени по понедельникам. DOU - это классное комьюнити, которое уже перестало быть просто сайтом для украинских айтишников. Также я бы хотел сказать спасибо всем комментаторам, которые читали мои статьи по диагонали и вырывали фразы из контекста. Без вас статьи не выглядели бы так интересно:) Да прибудет с вами Сила!

    Мы собрали 10 каверзных примеров программ, которые выводят какую-либо информацию. Вы должны взглянуть на код и сказать, что же выведет программа. Не исключено, что программа даже не скомпилируется. В этом случае вам надо указать, что выведет компилятор.

    Такие вопросы любят задавать на собеседованиях, а потому не лишним будет освежить свои знания языка программирования Java. В спойлерах будут скрыты ответы - то, что выведет программа или компилятор. Постарайтесь подумать сами, прежде чем смотреть правильный ответ.

    Package com.instanceofjava; public class B { B b = new B(); public int show(){ return (true ? null: 0); } public static void main(String args) { B b = new B(); b.show(); } }

    • Каждый раз, когда мы создаем объект какого-либо класса, первым вызывается конструктор и выделяется память для всех нестатических переменных.
    • Здесь B b = new B(); объекту класса B присваивается новый объект того же класса.
    • Запись B b = new B(); приводит к рекурсивному исполнению конструктора, что создает бесконечные объекты. Именно поэтому во время выполнения этого кода будет возбуждено исключение java.lang.StackOverFlowError в потоке "main" .
    • Распространенной причиной появления такого рода исключений является плохая рекурсия. Обычно это происходит из-за неправильного условия завершения.

    Что выведет следующая программа?

    package com.instanceofjava; public class A{ public static void show(){ System.out.println("Static method called"); } public static void main(String args) { A obj = null; obj.show(); } }
    • Мы можем вызвать статические методы, используя переменную, ссылающуюся на null . Дело в том, что статические методы находятся на уровне класса. Именно поэтому мы можем вызывать статические функции как при помощи самого класса, так и при помощи переменной, равной null .

    Что выведет следующая программа?

    package com.instanceofjava; public class A{ static int a = 1111; static { a = a-- - --a; } { a = a++ + ++a; } public static void main(String args) { System.out.println(a); } }

    Что выведет следующая программа?

    package com.instanceofjava; public class A{ int GetValue() { return (true ? null: 0); } public static void main(String args) { A obj = new A(); obj.GetValue(); } }

    Что выведет следующая программа?

    package com.instanceofjava; public class A{ public static void main(String args) { Integer i1 = 128; Integer i2 = 128; System.out.println(i1 == i2); Integer i3 = 127; Integer i4 = 127; System.out.println(i3 == i4); } }

    Что выведет следующая программа?

    package com.instanceofjava; class A { void method(int i) { } } class B extends A { @Override void method(Integer i) { } }
    • Какая строчка программы вызовет ошибку compile time error ?
    package com.instanceofjava; class A { public static void main(String args) { Integer i = new Integer(null); String s = new String(null); } }

    Что выведет следующая программа?

    package com.instanceofjava; class A { public static void main(String args) { String s = "ONE"+3+2+"TWO"+"THREE"+5+4+"FOUR"+"FIVE"+5; System.out.println(s); } }

    Что выведет следующая программа?

    package com.instanceofjava; class A { static int method1(int i) { return method2(i *= 11); } static int method2(int i) { return method3(i /= 11); } static int method3(int i) { return method4(i -= 11); } static int method4(int i) { return i += 11; } public static void main(String args) { System.out.println(method1(11)); } }

    Что выведет следующая программа?

    package com.instanceofjava; class A { public static void main(String args) { System.out.println(null); } }

    Что происходит при написании System.out.println(null); ?

    Происходит, разумеется, ошибка компиляции. У метода println есть несколько вариаций. Он может принимать String , Object или char . При передаче в эту функцию аргумента null компилятор не может определиться, к какому из трех методов обращаться.

    Перегруженные методы:

    • public void prinltln(String str) {
    • public void prinltln(char ch) {
    • public void prinltln(Object ch) {

    Для компилятора вызов System.out.println(null) является неоднозначным, поскольку для вывода null ‘a могут более-менее подойти два метода: println(String) и println(char) . Но компилятор не знает, к какому конкретно методу обратиться. Чтобы компиляция прошла успешно, следует написать:

    • System.out.println((String)null);
    • System.out.println((char)null);
    • System.out.println((Object)null);

    Но здесь нужно быть внимательным. Вызов System.out.println((char)null); приведет к исключению runtime exception .

    Расскажу быстренько о себе. Мне 25 лет, родился в Крыму, г. Феодосия. Учился в техникуме городском, потом поступил в Харьков, получил диплом бакалавра и в 2014 году вернулся обратно домой. В 2014 поступил на заочное обучение на магистра (все специальности были кое-как связанны с программированием), и в 2015-м году поступил в армию на контрактную службу сроком на 3 года. После двух лет службы в армии я понял, что надо что-то менять в своей жизни... И вот мне попадается JavaRush в декабре 2017 года, и я начинаю упорно учить Java. Летом я попадаю на курсы Topjava к Григорию, начинаю проходить каждое его занятие, и к середине сентября должны были закончатся трехмесячные курсы. В общем, в начале сентября я переезжаю в Москву с женой для поиска работы Java программистом и на сегодняшний день прошел примерно 10 собеседований. Я вам напишу то, что постоянно спрашивают и вопросы, на которых я сыпался.

      Что такое JDK,JRE,JVM и компилятор. This is must have. Если вам зададут на собеседовании этот вопрос и вы не ответите на него, скорее всего, дальше ничего спрашивать не будут. Маленькое видео с youtube

      Объектно ориентированное программирование (ООП). Тут главное рассказать, что такое полиморфизм. Могут попросить перевести это слово, потом нужно рассказать его определение соответственно. Можно рассказывать все своими словами. Потом приводите свои примеры.

      Множественное наследование в Java. В Java запрещено множественное наследование классов, но разрешено множественное наследование интерфейсов. О наследовании

      Методы класса Object (желательно каждый метод посмотреть прямо в самом коде и обратить внимание на Equals и hashCode). Я называл так: getClass, finallize (прочитайте о нем, мало ли зададут вопрос, но запомните: как по мне - ЭТО КОСТЫЛЬ), wait (достаточно знать, что там 3 перегруженных метода) notify, notifyAll, equals и hashcode (обязательно!!! знать 4 правила equals и обязательно знать закон между equals и hashCode).

      JVM изнутри. Stack и Heap память.

      Что за ключевое слово new и как оно работает. Материал не нашел, но у меня спрашивали о нем, а точнее, когда мы пишем к примеру

      A a = new A ()
      что происходит перед равно и после равно?

      Работа Garbage Collection - не очень часто спрашивали, но когда спрашивали начинали копать, насколько я знаю данную тему. Отличная статья на

      Порядок инициализации полей классов родителя и потомка

      Коллекции: приходилось рассказывать абсолютно всю иерархию и работу каждой коллекции.

      Вопрос, чем отличается List от Set. Самое главное - сказать, что из себя представляет интерфейс List. Если вы ответите, что Set - коллекция с уникальными объектами, этого будет недостаточно.

      HashMap, HashSet - начальный размер; capacity, loadfactory, null допускается или нет? Как вычисляется ячейка для объекта при работе с Hash коллекцией? Отличие HashMap от TreeMap (недостаточно сказать, что TreeMap - отсортированная коллекция, по алгоритму красно-черное дерево). Знать алгоритмы вставки, удаления, поиска o каждой коллекции. Queue, Deque, Stack - редко задавали мне вопросы о них. Нужно знать, где интерфейс, а где классы в коллекциях.

      Обратите внимание на то, что у Collections есть родитель Iterable

      Java 8. Абсолютно по максимуму должны выжать из себя все что знаете о "нововведениях", выпущенных 4 года назад : вот вам источник Новое в Java 8

      У меня спрашивали о consumers, function и т.п., потом спрашивали о функциональных интерфейсах, потом спрашивали, как создать свою аннотацию, что означает например @SomeAnnotation (name = .... count =....), а именно, что тут name, count и как они работают при создании своей аннотации.

      Generics . Все о дженериках. Спрашивают везде.

      Потоки . Thread, Runnable, чем отличаются, как запустить поток. Все о синхронизации. Мьютексы, мониторы, класс Lock. Deadlock когда возникает, приведи те примеры.

      Иерархия исключений checked/unchecked, написать свой класс исключения.

      Final , finallize(опять), immutable , finally . Когда не отработает блок finally.

      Как запретить наследования классов (приватные конструкторы, финал класс...).

      IO / NIO потоки.

      ПАТТЕРНЫ . Выучите хотя бы 5 штук основных (mvc, factory, decorator, singleton, наблюдатель).

      Spring ioc, di, ioc - container. Вот вам ссылка на практическое понимание, мне очень помогло... SPRING . Я тут по спрингу прошел до 16 главы, писав вручную весь код. Советую и вам поступить так же.

    Для тех, кто впервые слышит слово Java Core - это фундаментальные основы языка. С этими знаниями уже смело можно идти на стажировку/интернатуру. Приведенные вопросы помогут вам освежить знания перед собеседованием, или почерпнуть для себя что-то новое. Для получения практических навыков занимайтесь на JavaRush .

      Как создать неизменяемый объект в Java? Перечислите все преимущества

      Неизменяемый класс – это класс, состояние которого не может быть изменено после создания. Здесь состоянием объекта по существу считаются значения, хранимые в экземпляре класса, будь то примитивные типы или ссылочные типы.

      Для того чтобы сделать класс неизменяемым, необходимо выполнить следующие условия:

      1. Не предоставляйте сеттеры или методы, которые изменяют поля или объекты, ссылающиеся на поля. Сеттеры подразумевают изменение состояния объекта а это то, чего мы хотим тут избежать.
      2. Сделайте все поля final и private . Поля, обозначенные private , будут недоступными снаружи класса, а обозначение их final гарантирует, что вы не измените их даже случайно.
      3. Не разрешайте субклассам переопределять методы. Самый простой способ это сделать – объявить класс как final . Финализированные классы в Java не могут быть переопределены.
      4. Всегда помните, что ваши экземпляры переменных могут быть либо изменяемыми, либо неизменяемыми. Определите их и возвращайте новые объекты со скопированным содержимым для всех изменяемых объектов (ссылочные типы). Неизменяемые переменные (примитивные типы) могут быть безопасно возвращены без дополнительных усилий.

      Также, вам необходимо помнить последующие преимущества неизменяемых классов. Возможно они понадобятся вас на собеседовании. Неизменяемые классы:

      • легко конструировать, тестировать и использовать
      • автоматически потокобезопасны и не имеют проблем синхронизации
      • не требуют конструктора копирования
      • позволяют выполнить «ленивую инициализацию» хэшкода и кэшировать возвращаемое значение
      • не требуют защищенного копирования, когда используются как поле
      • делают хорошие Map ключи и Set элементы (эти объекты не должны менять состояние, когда находятся в коллекции)
      • делают свой класс постоянным, единожды создав его, а он не нуждается в повторной проверке
      • всегда имеют «атомарность по отношению к сбою» (failure atomicity, термин применил Джошуа Блох): если неизменяемый объект бросает исключение, он никогда не останется в нежелательном или неопределенном состоянии.

      Посмотрите на пример, написанный в этом посте .

      Java спецификация гласит, что все в Java передается по значению. Нет такого понятия, как «передача по ссылке» в Java. Эти условия связаны с вызовом методов и передачей переменных, как параметров метода. Хорошо, примитивные типы всегда передаются по значению без какой-либо путаницы. Но, концепция должна быть понятна в контексте параметра метода сложных типов.


      В приведенном примере, биты адреса первого экземпляра копируются другой ссылочной переменной, в результате чего обе ссылки указывают на один участок памяти, где хранится объект. Помните, что присвоив второй ссылке null, вы не присвоите null первой ссылке. Но изменение состояния объекта с одной ссылающейся переменной, будет отображено и в другой ссылке.

      Какое применение блока finally ? Гарантирует этот блок выполнение своего кода? Когда finally блок не вызывается?

      Блок finally всегда вызывается, если блок try существует. Это гарантирует, что блок finally вызывается даже, если случается неожиданное исключение. Но finally является более полезным, чем просто для обработки исключений – этот блок позволяет выполнить чистку кода, случайно обошедшего через return , continue или break . Размещение очищающего кода в блок finally всегда является хорошей практикой, даже когда не ожидается никаких исключений.

      Если виртуальная машина завершает работу во время выполнения блока try или catch , тогда блок finally не будет выполнен. Аналогично, если нить, выполняя блок try или catch , будет прервана или убита, блок finally не будет выполнен, даже не смотря на то, что приложение продолжает работать.

      Почему существует два класса Date , один в java.util package а другой в java.sql ?

      java.util.Date представляет дату и время, а java.sql.Date представляет только дату. Дополнением к java.sql.Date является класс java.sql.Time , который представляет только время.

      Класс java.sql.Date является субклассом (расширением) класса java.util.Date . Итак, что изменилось в java.sql.Date:

      • toString() формирует другое представление строки: yyyy-mm-dd
      • статический метод valueOf(String) создает дату из строки с вышеуказанным представлением
      • исключены геттеры и сеттеры для часов, минут и секунд

      Класс java.sql.Date используется в JDBC и предназначен, чтобы не иметь составляющую времени, то есть часы, минуты, секунды и миллисекунды должны быть нулю… но это не является обязательным для класса.

      Разъясните интерфейсы-маркеры.

      Шаблон интерфейса-маркера – это шаблон проектирования в компьютерных науках, используемый языками программирования, которые предоставляют информацию об объектах во время выполнения . Это предоставляет способ ассоциации метаданных класса, где язык не имеет явной поддержки таких метаданных . В Java для этого используются интерфейсы без указания методов.

      Хорошим примером применения интерфейса-маркера в Java является интерфейс Serializable . Класс реализует этот интерфейс для указания, что его не transient данные могут быть записаны в поток байтов или на файловую систему.

      Главной проблемой интерфейса-маркера является то, что интерфейс определяет соглашение для реализующих его классов, и это соглашение наследуется всеми субклассами. Это значит, что вы не сможете «де-реализовать» маркер. В приведенном примере, если вы создадите субкласс, который вы бы не хотели сериализовать (возможно потому, что он находится в преходящем (transient) состоянии), вы должны прибегнуть к явному бросанию NotSerializableException .

      Почему метод main() объявлен как public static void ?

      Почему public? Метод main имеет модификатор доступа public , поэтому он может быть доступен везде и для любого объекта, который захочет использовать этот метод для запуска приложения. Тут я не говорю, что JDK/JRE имеют подобный повод, поскольку java.exe или javaw.exe (для windows) используют Java Native Interface (JNI) вызов для запуска метода, поэтому они могут вызвать его в любом случае, независимо от модификатора доступа.

      Почему static? Давайте предположим, что у нас метод main не статический. Теперь, для вызова любого метода вам необходим экземпляр класса. Верно? Java разрешает иметь перегруженные конструкторы, это мы все знаем. Тогда который из них должен быть использован, и откуда возьмутся параметры для перегруженного конструктора?

      Почему void? Нет применения для возвращаемого значения в виртуальной машине, которая фактически вызывает этот метод. Единственное, что приложение захочет сообщить вызвавшему процессу – это нормальное или ненормальное завершение. Это уже возможно используя System.exit(int) . Не нулевое значение подразумевает ненормальное завершение, иначе все в порядке.

      В чем разница между созданием строки как new() и литералом (при помощи двойных кавычек)?

      Когда мы создаем строку используя new() , она создается в хипе и также добавляется в пул строк, в то же время строка, созданная при помощи литерала, создается только в пуле строк.

      Вам необходимо ознакомиться с понятием пула строк глубже, чтобы ответить на этот или подобные вопросы. Мой совет – как следует выучите класс String и пул строк .

      Как работает метод substring() класса String ?

      Как и в других языках программирования, строки в Java являются последовательностью символов. Этот класс больше похож на служебный класс для работы с этой последовательностью. Последовательность символов обеспечивается следующей переменной:

      /** The value is used for character storage. */ /** Значение используется для хранения символов */ private final char value ; Для доступа к этому массиву в различных сценариях используются следующие переменные /** The offset is the first index of the storage that is used. */ /** Смещение – это первый индекс используемого хранилища. */ private final int offset; /** The count is the number of characters in the String. */ /** Счет – это количество символов в строке. */ private final int count;

      Каждый раз, когда мы создаем подстроку от существующего экземпляра строки, метод substring() только устанавливает новые значения переменных offset и count . Внутренний массив символов не изменяется. Это возможный источник утечки памяти, если метод substring() использовать неосторожно:

      Первоначальное значение value не изменяется. Поэтому если вы создадите строку длиной 10000 символов и создадите 100 подстрок с 5-10 символами в каждой, все 101 объекты будут содержать один и тот же символьный массив длиной 10000 символов. Это без сомнения расточительство памяти.

      Этого можно избежать, изменив код следующим образом:

      заменить original.substring(beginIndex) на new String(original.substring(beginIndex)) , где original – исходная строка.

      Объясните работу HashMap . Как решена проблема дубликатов?

      Большинство из вас наверняка согласится, что HashMap наиболее любимая тема для дискуссий на интервью в настоящее время. Если кто-нибудь попросит меня рассказать «Как работает HashMap ?», я просто отвечу: «По принципу хэширования». Так просто, как это есть.

      Итак, хеширование по сути является способом назначить уникальный код для любой переменной/объекта после применения любой формулы/алгоритма к своим свойствам.

      Определение карты (Map) таково: «Объект, который привязывает ключи к значениям». Очень просто, верно? Итак, HashMap содержит собственный внутренний класс Entry , который имеет вид:

      static class Entry implements Map. Entry { final K key; V value; Entry next; final int hash; …//More code goes here }

      Когда кто-либо пытается поместить пару ключ-значение в HashMap , происходит следующее:

      • В первую очередь, объект ключа проверяется на null . Если ключ null , значение сохраняется в позицию table . Потому что хэшкод для null всегда 0.
      • Затем, следующим шагом вычисляется хэш значение вызывая у переменной-ключа свой метод hashCode() . Этот хэш используется для вычисления индекса в массиве для хранение объекта Entry . Разработчики JDK прекрасно понимали, что метод hashCode() может быть плохо написан и может возвращать очень большое или очень маленькое значение. Для решения этой проблемы они ввели другой hash() метод, и передают хэшкод объекта этому методу для приведения этого значения к диапазону размера индекса массива.
      • Теперь вызывается метод indexFor(hash, table.length) для вычисления точной позиции для хранения объекта Entry .
      • Теперь главная часть. Как мы знаем, два неодинаковых объекта могут иметь одинаковое значение хэшкода, как два разных объекта будет храниться в одинаковом расположении в архиве [называется корзиной]?

      Ответ – LinkedList . Если вы помните, класс Entry имеет свойство “next”. Это свойство всегда указывает на следующий объект в цепи. Такое поведение очень похоже на LinkedList .

      Итак, в случае совпадений хэшкодов, объекты Entry хранятся в форме LinkedList . Когда объект Entry необходимо разместить на конкретном индексе, HashMap проверяет, существует ли на этом месте другой объект Entry ? Если там нет записи, наш объект сохранится в этом месте.

      Если на нашем индексе уже находится другой объект, проверяется его поле next . Если оно равно null , наш объект становится следующим узлом в LinkedList . Если next не равно null , эта процедура повторяется, пока не будет найдено поле next равное null .

      Что будет, если мы добавим другое значение ключа, равное добавленному ранее? Логично, что оно должно заменить старое значение. Как это происходит? После определения индекса позиции для объекта Entry , пробегая по LinkedList , расположенному на нашем индексе, HashMap вызывает метод equals() для значения ключа для каждого объекта Entry . Все эти объекты Entry в LinkedList имеют одинаковое значение хэшкода, но метод equals() будет проверять на настоящее равенство. Если ключ. equals(k) будет true , тогда оба будут восприниматься как одинаковый объект. Это вызовет замену только объекта-значение внутри объекта Entry .

      Таким образом HashMap обеспечивает уникальность ключей.

      Различия между интерфейсами и абстрактными классами?

      Это очень распространенный вопрос, если вы проходите собеседование на программиста уровня junior. Наиболее значимые различия приведены ниже:

      • В интерфейсах Java переменные априори final . Абстрактные классы могут содержать не final переменные.
      • Интерфейс в Java безоговорочно не может иметь реализации. Абстрактный класс может иметь экземпляры методов, которые реализуют базовое поведение.
      • Составляющие интерфейса должны быть public . Абстрактный класс может иметь модификаторы доступа на любой вкус.
      • Интерфейс должен быть реализован ключевым словом implements . Абстрактный класс должен быть расширен при помощи ключевого слова extends .
      • В Java класс может реализовывать множество интерфейсов, но может унаследоваться только от одного абстрактного класса.
      • Интерфейс полностью абстрактный и не может иметь экземпляров. Абстрактный класс также не может иметь экземпляров класса, но может быть вызван, если существует метод main() .
      • Абстрактный класс слегка быстрее интерфейса, потому что интерфейс предполагает поиск перед вызовом любого переопределенного метода в Java. В большинстве случаев это незначительное различие, но если вы пишите критичное по времени приложение, вам необходимо учесть и этот факт.
    1. Когда вы переопределяете методы hashCode() и equals() ?

      Методы hashCode() и equals() определены у класса Object , который является родительским классом для всех объектов Java. По этой причине, все объекты Java наследуют базовую реализацию этих методов.

      Метод hashCode() используется для получения уникального значения integer для данного объекта. Это значение используется для определения расположения корзины, когда объект необходимо хранить в структуре данных наподобие HashTable . По умолчанию метод hashCode() возвращает целочисленное представление адреса памяти, где хранится объект.

      Метод equals() , как предполагает название, используется для простой эквивалентности объектов. Базовая реализация метода заключается в проверке ссылок двух объектов для проверки их эквивалентности.

      Обратите внимание, что обычно необходимо переопределять метод hashCode() всякий раз, когда переопределен метод equals() . Это необходимо для поддержки общего соглашения метода hashCode , в котором говорится что равные объекты должны иметь равные хэшкоды.

      Метод equals() должен определять равенство отношений (он должен быть возвратным, симметричным и транзитивным). В дополнение, он должен быть устойчивым (если объект не изменялся, метод должен возвращать то же самое значение). Кроме того, o.equals(null) всегда должно возвращать false .

      hashCode() должен быть также устойчивым (если объект не изменялся по условиям метода equals() , он должен продолжать возвращать то же самое значение.

      Отношение между двумя методами такое: всегда, если a.equals(b) , тогда a.hashCode() должно быть таким же, как и b.hashCode() .

    Удачи в обучении!! Автор статьи Lokesh Gupta Оригинал статьи Ссылки на остальные части: