Вопросы на собеседовании или то что нужно знать на зубок. - Часть уже с ответами - часть стоит наверно дописать) Ксати если честно я все наизусть не помню - каждый раз перед собеседованием повторяю)
Java core
as
1. Что такое класс Object? Какие в нем есть методы?
2. Что такое метод equals(). Чем он отличается от операции ==.
3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
4. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
5. Для чего нужен метод hashCode()?
6. Какая связь между hashCode и equals?
7. Каким образом реализованы методы hashCode и equals в классе Object?
8. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
9. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
10. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
10+1. Что такое finalize? Зачем он нужен? Что Вы можете рассказать о сборщике мусора и алгоритмах его работы. -
11. Какие модификаторы доступа в Java вы знаете?
12. Какой из модификаторов более строгий: protected или package-private?
13. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
14. Что означает ключевое слово final?
15. Имеет ли смысл объявлять метод private final?
16. Какие особенности инициализации final переменных?
17. Что будет, если единственный конструктор класса объявлен как final?
18. Что означает ключевое поле static?
19. К каким конструкциям Java применим модификатор static?
20. Что будет, если в static блоке кода возникнет исключительная ситуация?
21. Можно ли перегрузить static метод?
22. Что такое статический класс, какие особенности его использования?
23. Какие особенности инициализации final static переменных?
24. Какие типы классов бывают в java (вложенные… и.т.д.)
25. Каким образом из вложенного класса получить доступ к полю внешнего класса.
26. Какие особенности создания вложенных классов: простых и статических.
27. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли каке-нибудь ограничения для такой переменной?
28. Какие вы знаете способы запустить некоторое действие в отдельном потоке?
29. Какие вы знаете способы прекратить выполнение потока?
30. Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
31. Для чего используется ключевое слово syhcronized?
32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
33. Что служит в качестве mutex, если метод объявлен synchronized?
34. Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта?
35. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
36. Объясните, что такое deadlock? Приведите пример кода, который демонстрирует deadlock.
37. Что такое volatile и transient? Для чего и в каких случаях можно было бы использовать default? -
38. Какие особенности использования метода wait? При каких условиях поток может выйти из режима ожидания?
39. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
40. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
41. Какие виды исключений в Java вы знаете, чем они отличаются?
42. Назовите несколько классов из вершины иерархии исключений в Java.
43. Что такое Error? В каком случае используется Error. Приведите пример Error’а.
44. Какая конструкция используется в Java для обработки исключений?
45. Возможно ли использование блока try-finally (без catch)?
46. Предположим, есть блок try-finally. В блоке try возникло исключение и выполнение переместилось в блок finally. В блоке finally тоже возникло исключение. Какое из двух исключений “выпадет” из блока try-finally? Что случится со вторым исключением?
47. Всегда ли исполняется блок finally?
48. Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?
49. Предположим, есть метод, который может выбросить IOException и FileNotFoundException в какой последовательности должны идти блоки catch? Сколько блоков catch будет выполнено?
50. Предположим вам необходимо создать свой собственный класс Exception. Какими мотивами вы будете руководствоваться при выборе типа исключения: checked/unchecked?
Вопросы по БД
Вопросы на понимание принципов построения СУБД.
1. Что такое первая нормальная форма и процесс нормализации? Какие бывают нормальные формы?
Таблица находится в первой нормальной форме, если каждый её атрибут атомарен. Под выражением «атрибут атомарен» понимается, что атрибут может содержать только одно значение. Таким образом, не существует 1NF таблицы, в полях которых могут храниться списки значений. Для приведения таблицы к 1NF обычно требуется разбить таблицу на несколько отдельных таблиц.
2. В чем смысл индекса СУБД, как они устроены, как хранятся? Как бы вы реализовали тот же функционал? Последний вопрос задают в случае, если нет четкого понимания индексов.
Индекс (англ. index) — объект базы данных, создаваемый с целью повышения производительности выполнения запросов. Таблицы в базе данных могут иметь большое количество строк, которые хранятся в произвольном порядке, и их поиск по заданному значению путем последовательного просмотра таблицы строка за строкой может занимать много времени. Индекс формируется из значений одного или нескольких столбцов таблицы и указателей на соответствующие строки таблицы и, таким образом, позволяет находить нужную строку по заданному значению. Ускорение работы с использованием индексов достигается в первую очередь за счёт того, что индекс имеет структуру, оптимизированную под поиск - например, балансированного дерева.
3. Нарисуйте отношение Многие-ко-многим. Например: таблицы Авторы и Книги. У одного автора может быть несколько книг, и книга может быть написана несколькими авторами. Составьте SQL запрос на выборку книг определенного автора.
-----------------------------------1. Что такое класс Object? Какие в нем есть методы?
Object это базовый класс для всех остальных объектов в Java. Каждый класс наследуется от Object. Соответственно все классы наследуют методы класса Object.
Методы класса Object:
Замечание: Для полноты обзора можно сказать, что существует ещё один метод private static native void registerNatives() .
-----------------------------------2. Что такое метод equals(). Чем он отличается от операции ==.
Метод equals() обозначает отношение эквивалентности объектов. Эквивалентным называется отношение, которое является симметричным, транзитивным и рефлексивным.
Также для любого ненулевого x, x.equals(null) должно вернуть false.
Отличия equals() от операции == в классе Object нет. Это видно, если взглянуть исходный код метода equals класса Object:
public boolean equals(Object obj) {
return (this == obj);
Однако, нужно не забывать, что, если объект ни на что не ссылается(null), то вызов метода equals этого объекта приведет к NullPointerException. Также нужно помнить, что при сравнении объектов оба они могут быть null и операция obj1 == obj2 в данном случае будет true, а вызов equals приведет к исключению NullPointerException.
Как мы видим, при помощи операции == сравниваются ссылки на объекты. Но мы можем переопределять метод equals, тем самым задавая логику сравнения двух объектов. Например, рассмотрим сравнение двух одинаковых чисел, созданных при помощи класса Integer:
System.out.println(a == b); // false т.к. это разные объекты с разными ссылками
System.out.println(a.equals(b)); // true, здесь уже задействована логика сравненияSyhi-подсветка кода
Если взглянуть внутрь метода equals класса Integer, то мы увидим:
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
Понятно, что тут уже нет сравнения ссылок, а сравниваются int значения.
-----------------------------------3. Если вы хотите переопределить equals(), какие условия должны удовлетворяться для переопределенного метода?
Эти условия приведены в пункте 2.
-----------------------------------4. Если equals() переопределен, есть ли какие-либо другие методы, которые следует переопределить?
Да, есть.Нужно переопределить метод hashCode(). Равные объекты должны возвращать одинаковые хэш коды. Например у класса Integer метод hashCode() переопределен следующим образом:
public int hashCode() {
return value;
}Syhi-подсветка кодаvalue это private значение, которое хранит объект класса Integer. Собственно это и есть число.
-----------------------------------5. Для чего нужен метод hashCode()?
Для начала вспомним, что такое хэш и хэширование. Теперь вспоминаем такие известные классы, как HashMap, HashSet, Hashtable, в основе которых лежит вычисление хэш-функции. Именно за счет хэша мы можем вставлять и получать данные за O(1), то есть за время пропорциональное вычислению хэш-функции.
Например, рассмотрим вставку элементов в HashMap:
public V put(K key, V value) {
...
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
...
addEntry(hash, key, value, i);
...
Как мы видим, i-е место вставки объекта вычисляется при помощи хэша. А для вычисления нам нужна хорошая хэш функция, чтобы давала равномерное распределение и поменьше коллизий.
То есть ответ на вопрос заключается в том, что существуют коллекции(HashMap, HashSet), которые используют хэш код, как основу при работе с объектами. А если хэш для равных объектов будет разным, то в HashMap будут два равных значения, что является ошибкой. Поэтому необходимо соответствующим образом переопределить метод hashCode().
----------------------------------6. Какая связь между hashCode и equals?
Когда объекты равны, то и hashCode должны быть равны. Но необязательно, чтобы два различных объекта возвращали различные хэш коды(такая ситуация называется коллизией).
----------------------------------7. Каким образом реализованы методы hashCode и equals в классе Object?
Реализация метода equals в классе Object сводится к проверке на равенство двух ссылок:
public boolean equals(Object obj) {
return (this == obj);
}
Реализация же метода hashCode класса Object сделана нативной, т.е. определенной не с помощью Java-кода:
public native int hashCode();
Он обычно возвращает адрес объекта в памяти.
----------------------------------8. Что будет, если переопределить equals не переопределяя hashCode? Какие могут возникнуть проблемы?
Они будут неправильно хранится в контейнерах, использующих хэш коды, таких как HashMap, HashSet.
----------------------------------9. Есть ли какие-либо рекомендации о том, какие поля следует использовать при подсчете hashCode?
Есть. Необходимо использовать уникальные, лучше примитивные поля, такие как id, uuid, например. Причем, если эти поля задействованы при вычислении hashCode, то нужно их задействовать при выполнении equals.
Общий совет: выбирать поля, которые с большой долью вероятности будут различаться.
----------------------------------10. Как вы думаете, будут ли какие-то проблемы, если у объекта, который используется в качестве ключа в hashMap изменится поле, которое участвует в определении hashCode?
Будут. Опять же будут проблемы связанные с хэш коллекциями. А именно, не сможем выбрать элемент из хэш-коллекции, его как будто и не будет.
----------------------------------11. Какие модификаторы доступа в Java вы знаете?
Java модификаторы доступа: public, private, protected и модификатор доступа по умолчанию - это когда модификатор не указывается.
-Можно ли объявить класс с модификатором protected? нет
----------------------------------12. Какой из модификаторов более строгий: protected или package-private?
Для начала надо разобраться, что такое package-private модификатор. Он ограничивает видимость до пределов пэкэджа, в котором лежит класс. И только до него! То есть, если класс лежит в пэкэдже "ru.myprog", то из пэкэджа "ru.myprog.base" он виден не будет(тоже самое для методов).
Protected модификатор, как все знают(кто хотя бы немного изучал ООП), раскрывает область видимости только для классов-наследников и для классов определенных в том же пэкэдже.
Из всего этого следует, что package-private модификатор более строгий.
-Объявляем класс с модификатором public, в котором создадим метод с default модификатором. Будет ли виден этот метод из других пэкэджей?
-Скомпилируется ли данная программа:
package ru.test;
class DefaultPackage {
void test(){;}
}
----
package ru.test;
public class Public extends DefaultPackage {
}
----
package ru.test.base;
import ru.test.Public;
public class Main {
public static void main(String[] args) {
Public pub = new Public();
pub.test();
}
}
-Возможно ли перегружать default методы?
Да.
---------------------------------- 13. Если у класса-родителя есть метод, объявленный как private, может ли наследник расширить его видимость? А если protected? А сузить видимость?
private методы никто, кроме самого класса не видит. Поэтому их наличие/отсутствие никак не отражается на классах-наследниках. Они с легкостью могут объявлять методы с такой же сигнатурой и любыми модификаторами. Но это очень плохой тон! Антипаттерн.
Также клас наследник может расширить видимость protected-метода. Такой класс называется "Паблик-Морозов":). Из-за того, что как известный советсткий пионер, раскрывают информацию кому ни попадя! :)
Сузить видимость класс-наследник не может. Это будет ошибка компиляции.
-------------------------14. Что означает ключевое слово final?
В случае класса - нельзя от него наследоваться.
В случае метода - нельзя его переопределять. Это используется, когда нужно явно указать "здесь не трогайте! оно так не задумано!". Обычно позволяет улучшить архитектуру системы. Но это нужно делать только если есть необходимость. Не надо все методы определять как final! Таких программистов называют "фаталисты". Раньше ещё было такое мнение, что final методы быстрее работают. Сейчас это абсолютная неправда. Работают они с такой же скоростью! Так что используйте их только при явной необходимости.
В члена класса final означает константу, которая после инициализации не поменяет своего значения. Но подумайте сами, что будет, если мы объявим, например, коллекцию как final:
Сработает ли следующий код?
public class Test {
final static List _list = new ArrayList();
public test() {
_list.add("Hello world!");
}
}
А этот ?
public class Test {
final List _list = new ArrayList();
public test() {
_list = new LinkedList();
}
}
-------------------------15. Имеет ли смысл объявлять метод private final?
Только если вы отъявленный фаталист, финалист и пессимист! :)
-------------------------16. Какие особенности инициализации final переменных?
Если они объявлена не как static, то они инициализируются в конструкторе, даже если не были объявлены не в нем. В этом случае код сгенерирует сам компилятор. Причем порядок их инициализации соответствует порядку их определения.
Если же она объявлена, как static, то либо при первом обращении к этой переменной, либо при первом создании объекта такого класса. То есть создание статических переменных происходит "по требованию" и только один раз. И это очень логично.
-------------------------17. Что будет, если единственный конструктор класса объявлен как final?
Ошибочка компиляции. Почему - потому что нельзя будет унаследовать
-------------------------18. Что означает ключевое поле static?
КОнстанту, это как бы переменная класа - она одна на все экземпляры этого класа.
19. К каким конструкциям Java применим модификатор static?
20. Что будет, если в static блоке кода возникнет исключительная ситуация?
21. Можно ли перегрузить static метод?
22. Что такое статический класс, какие особенности его использования?
23. Какие особенности инициализации final static переменных?
24. Какие типы классов бывают в java (вложенные… и.т.д.)
25. Каким образом из вложенного класса получить доступ к полю внешнего класса.
26. Какие особенности создания вложенных классов: простых и статических.
27. Каким образом можно обратиться к локальной переменной метода из анонимного класса, объявленного в теле этого метода? Есть ли каке-нибудь ограничения для такой переменной?
28. Какие вы знаете способы запустить некоторое действие в отдельном потоке?
29. Какие вы знаете способы прекратить выполнение потока?
30. Какие ключевые слова Java, связанные с многопоточностью Вы знаете?
31. Для чего используется ключевое слово syhcronized?
32. Есть некоторый метод, который исполняет операцию i++. Переменная i типа int. Предполагается, что код будет исполнятся в многопоточной среде. Следует ли синхронизировать блок?
33. Что служит в качестве mutex, если метод объявлен synchronized?
34. Можно ли вызвать в разных потоках два synchronized метода одного и того же объекта?
35. Что используется в качестве mutex, если метод объявлен static synchronized? Можно ли создавать новые экземпляры класса, пока выполняется static synchronized метод?
36. Объясните, что такое deadlock? Приведите пример кода, который демонстрирует deadlock.
37. Для чего используется ключевое слово volatile?
38. Какие особенности использования метода wait? При каких условиях поток может выйти из режима ожидания?
39. Предположим в методе run возник RuntimeException, который не был пойман. Что случится с потоком? Есть ли способ узнать о том, что Exception произошел (не заключая все тело run в блок try-catch)? Есть ли способ восстановить работу потока после того как это произошло?
40. Какие стандартные инструменты Java вы бы использовали для реализации пула потоков?
41. Какие виды исключений в Java вы знаете, чем они отличаются?
42. Назовите несколько классов из вершины иерархии исключений в Java.
43. Что такое Error? В каком случае используется Error. Приведите пример Error’а.
44. Какая конструкция используется в Java для обработки исключений?
45. Возможно ли использование блока try-finally (без catch)?
46. Предположим, есть блок try-finally. В блоке try возникло исключение и выполнение переместилось в блок finally. В блоке finally тоже возникло исключение. Какое из двух исключений “выпадет” из блока try-finally? Что случится со вторым исключением?
47. Всегда ли исполняется блок finally?
48. Могли бы вы придумать ситуацию, когда блок finally не будет выполнен?
49. Предположим, есть метод, который может выбросить IOException и FileNotFoundException в какой последовательности должны идти блоки catch? Сколько блоков catch будет выполнено?
50. Предположим вам необходимо создать свой собственный класс Exception. Какими мотивами вы будете руководствоваться при выборе типа исключения: checked/unchecked?