Вы находитесь на странице: 1из 81

Java Common questions

Java Common questions 1


1. Инкапсуляция (encapsulation) 8
2. Полиморфизм (polymorphism) 8
3. Наследование (inheritance) 9
4. Difference between HashMap and TreeMap. 9
5.Immutable 9
6. Итератор 10
7. Методы Object: 10
8. Exceptions: 10
8.1 Опишите иерархию исключений. 11
8.2. Какие виды исключений в Java вы знаете, чем они отличаются? 12
8.3.Что такое checked и unchecked Exception? 13
8.4. Как создать свой unchecked Exception? 13
8.5. Какие есть Unchecked exception? 13
8.6. Что такое Error? 13
8.7. Опишите работу блока try-catch-finally. 14
8.9. Возможно ли использование блока try-finally (без catch)? 14
8.10. Всегда ли выполняется блок finally? 14
9. Автоупаковка (autoboxing) 14
10. Cпособы хранения объектов в памяти: 15
11. Что означает ключевое слово final? 15
12. Какое начальное количество корзин в HashMap 15
13. Отличия абстрактного класса от интерфейса 15
14. HashCode 15
15.Rules for method overriding: 16
16.Сериализация 16
17.XML парсеры. 17
18.ConcurrentModificationException. 17
19.Принципы SOLID. 17
20.Java Naming and Directory Interface (JNDI) 18
21. Coupling 18
22. Cohesion 18
23. Агрегация. 18
24. JMM 18
25. Инициализация класса 19
26. Garbage collector 19
27. Назвать разные реализации gc 19
28. DRY principle 19
29. KIss PRINCIPLE 19
30. Что такое рефлексия? 20
31. Что произойдет со сборщиком мусора (GC), если во время выполнения метода
finalize() некоторого объекта произойдет исключение? 20
32. Что такое интернационализация, локализация? 20
33. Что такое Аннотации в Java? 20
34. Какие функции выполняет Аннотации? 20
35. Какие встроенные аннотации в Java вы знаете? 21
36. Что делают аннотации @Retention, @Documented, @Target и @Inherited? 21
37. Что делают аннотации @Override, @Deprecated, @SafeVarargs и
@SuppressWarnings? 21
38. Какой жизненный цикл аннотации можно указать с помощью @Retention? 22
39. К каким элементам можно применять аннотацию, как это указать? 22
40. Как создать свою Аннотацию? 22
41. Атрибуты каких типов допустимы в аннотациях? 23
42. Что такое JMX? 23
43. Какие выгоды предлагает JMX? 23
44. Что еще умеет JMX кроме дистанционного управления? 23
45. Что такое MBean? 24
46. Какие типы MBeans существуют? 24
47. Что такое MBean Server? 24
48. Какие механизмы обеспечивают безопасность в технологии Java? 25
49. Назовите несколько видов проверок которые выполняет верификатор байт-кода
Java? 25
50. Что вы знаете о "диспетчере защиты" в Java? 25
51. Что такое JAAS? 25
52. Что такое Рефакторинг? 26
53. String 26
1. Какие есть особенности класса String? что делает метод intern(). 26
2. Можно ли наследовать строковый тип, почему? 26
3. Почему строка является популярным ключом в HashMap в Java? 26
4. Дайте определение понятию конкатенация строк. 27
5. Как перевернуть строку? 27
6. Как сравнить значение двух строк? 27
7. Как обрезать пробелы в начале и конце строки? 28
8. Дайте определение понятию "пул строк". 28
9. Можно ли синхронизировать доступ к строке? 29
10. Как правильно сравнить значения строк двух различных объектов типа String и
StringBuffer? 29
11. Почему строка неизменная и финализированная в Java? 29
12. Напишите метод удаления данного символа из строки. 30

JAVA8 30
1. Что такое StringJoiner? 30
2. Что такое default методы? 30
3. Что такое static методы? 31
4. Как вызывать default-метод интерфейса в классе? 31
5. Как вызывать static-метод интерфейса в классе? 31
6. Что такое потоки(stream) в Java 8? 31
7. Для чего нужен метод collect Java 8? 32
8. В чем разница между коллекцией(Collection) и потоком(Stream)? 32
9. Для чего предназначен метод forEach в потоках(stream)? 32
10. Как вывести на экран 10 случайных чисел, используя forEach? 32
Погуглить как это делает SplittableRandom. 33
11. Для чего предназначен метод map в потоках(stream)? 33
12. Как можно вывести на экран уникальные квадраты чисел используя метод map? 33
13. Какова цель метода filter в потоках(stream)? 33
14. Как вывести на экран количество пустых строк с помощью метода filter? 33
15. Для чего предназначен метод limit в потоках(stream)? 33
16. Для чего предназначен метод sorted в потоках(stream)? 34
17. Как вывести на экран 10 случайных чисел в отсортированном порядке в Java 8? 34
18. Параллельная обработка в Java 8? 34
19. Как найти максимальное число в списке Java 8? 34
20. Как найти минимальное число в списке Java 8? 34
21. Как получить сумму всех чисел в списке, используя Java 8? 34
22. Как получить среднее значение всех чисел, в списке, используя Java 8? 35
23. Что такое Optional? 35
24. Что такое Nashorn? 35
25. Что такое jjs в Java 8? 35
26. Что такое LocalDateTime в Java 8? 35
27. Что такое ZonedDateTime в Java 8? 36
28. Как получить текущую дату с использованием time API из Java 8? 36
29. Как добавить 1 неделю к текущей дате с использованием time API? 36
30. Как добавить 1 месяц к текущей дате с использованием time API? 36
31. Как добавить 1 год к текущей дате с использованием time API? 36
32. Как добавить 10 лет к текущей дате с использованием time API? 36
33. Как получить следующий вторник используя time API? 37
34. Как получить вторую субботу текущего месяца используя time API? 37
35. Как получить текущею дату в миллисекундах используя time API? 37
36. Как получить текущую дату по местному времени в миллисекундах используя time
API? 37
37. Какой класс появился в Java 8 для декодирования данных? 37
38. Какой класс появился в Java 8 для кодирования данных? 37
39. Как создать Base64 декодировщик? 38
40. Как создать Base64 кодировщик? 38

Concurrency 38
1. Deadlock 38
2. Какие способы синхронизации потоков в java вам известны? 38
3. synchronized 38
4. volatile 38
5. Livelock 39
6.Difference between Thread.yield() and Thread.sleep(). 39
7.Difference between ConcurrentHashMap and Collections.synchronizedMap. 40
8.Invoke run instead of start in thread. 40
9. What to use - Thread or Runnable? 40
10.Daemon threads. 40
11. What do we understand by thread starvation? 41
12. Can a synchronized block cause thread starvation? 41
13. What do we understand by the term race condition? 41
14. What do we understand by fair locks? 41

SQL / JDBC / Databases 42


1. GROUP BY 42
2. Joins 42
3. Difference between UNION and UNION ALL. 43
4. Statements. 43
5. HAVING 43
6. Что такое транзакция? 44
7. Уровни изоляции транзакций 45
8.ACID principles. 46
9. Разница между InnoDB и MyISAM. 46
10. Что такое нормализация? 47
11. Индекс (англ. index) 47
12. Реляционная база данных. 47
13. Представление 47
14. Нормальная форма 47
15. CAP теорема 47
16. Что такое DDL? 48
17. Что такое DML? 48
18. Что такое TCL? 48
19. Что такое DCL? 49
20. Какой общий синтаксис команды SELECT? 49
21. Про NULL в SQL. 49
22. Если вы собираетесь соединить несколько таблиц в запросе (например, n таблиц),
сколько условий соединения вам нужно использовать? 50
23. Какое практическое применение временных таблиц? 50
24. Как оператор GROUP BY обрабатывает значение NULL? Ли это общем трактовке
таких значений? 50
25. В чем разница между COUNT (*) и COUNT (столбец)? 50
26. В чем разница между операторами DISTINCT и GROUP BY? 50
27. Есть таблица table1 с колонками id и datetime написать запрос который вернет
максимальное значение id и значение даты для этого id. 51
28. Для чего нужны операторы UNION, INTERSECT, EXCEPT? 51
29. Что лучше использовать соединение или подзапросы? 51

Hibernate 51
1. FetchType 52
2. Уровни кэша 52
3. Какие бывают id generator классы в Hibernate? 53
4. Какие преимущества от использования Hibernate? 53
5. Какие типы менеджмента транзакций поддерживаются в Hibernate? 53
6. Какие существуют стратегии загрузки объектов в Hibernate? 54
7. Какие существуют типы стратегий кэша? 54
8.Detached Entity. 54
9.DetachedCriteria. 54
10.Hibernate 54
11.Связи в БД. 55
12. LazyInitException overcome 55
13. Hibernate Session 55
14. Типы Propagation 55
15. В каких статусах могут находится объекты в Hibernate 56
16. FlushModes 56
17. Типы локов 56
18. Как можно настроить кэш второго уровня 57
1. Dependency injection (DI) 57
2. Какие IoC контейнеры вы знаете? 58
3. Что такое AOP? Как это относиться к IoC? 58
4. В чем роль ApplicationContext в Spring? 58
5. Как добавить поддержку Spring в web-приложение 58
6. Добавление диспетчера Spring MVC 58
7. Какие существуют scopes в spring? 59
8. Explain Bean lifecycle in Spring framework? 59
9. Lazily loading beans 59
10.Bean inheritance 59
11.How @Transactional works from inside? 60
12. Использование @Transactional аннотации
http://www.springbyexample.com.ua/2012/08/faq-transactional.html 60
13. How to inject static method in class with xml? 60
14. @Repeteable 60
15. Autowired vs Inject vs Resource 60

JSP, SERVLETS 60
1. Какие скоупы переменных существуют в JSP 61
2. Методы HttpServlet 61
3. Чем статический include отличается от динамического? (вопрос по JSP). 61
4. Спецификация JSP различает три типа скриптовых элементов: 61
5. Сервлетный фильтр 61
6.Обновить сессию. 61
6. Контейнер сервлетов 62

Веб-сервисы 62
1. SOAP 62
2. REST 62
3. Difference between wsdl and xsd. 63
4. Разница между PUT и POST в REST. 63
5. Rest methods 63

EJB 63
1. Типы бинов 63

JAVASCRIPT 63
1. Типы данных: 63
2. Замыкание (англ. closure) 63
3. Наследование в js 64
4. This in js 64
5. Event propagation 64
6. Что вернет выражение +new Date()? Чем отличается от Date.now(). 64
7. Отличия == и === 64
8. Сколько потоков в js? 64
9. Можно ли отправлять ajax-запрос на другой домен. 65
10. Call & apply 65

Git 65
1. Difference between svn and git. 65
2. Как перенести коммит из одной ветки в другую? 66
3. Rebase: 66

Testing 66
1.Difference between stub and mock 66
2. Виды тестирования. 67
3. BeforeClass vs before. 67
4.Testing web mvc spring. 68
5. Mocks 68

Algorithms 68
1. Основные алгоритмы сортировки массивов: 68

Паттерны проектирования 69
1. Abstract factory 69
2. Factory method (also Virtual constructor) 70
3. Adapter 70
4. Decorator (also Wrapper) 70
5. Proxy 70
6. Bridge 71
7.Facade 71
8.Command 71
9. State 71
10. Strategy 71
11. Chain of responsibility 72
12. Observer 72
13. Wrapper 72
14. Visitor 72
15. Template method 72
16. Builder 72
17. Различия шаблонов: 72
18. Типы шаблонов проектирования 73

Build tools (Maven, ant) 73


1. Maven dependency scopes. 73
2. Maven profiles. 74
3. Что же такое dependency и для чего они нужны (MAVEN)? 74
4. Жизненный цикл проекта (MAVEN) 75

https://github.com/forcelate/forcelate-skeletons/wiki - Q&A

1. Инкапсуляция (encapsulation)
это механизм, который объединяет данные и код, манипулирующий этими
данными, а также защищает и то, и другое от внешнего вмешательства или
неправильного использования. В объектно-ориентированном программировании код и
данные могут быть объединены вместе; в этом случае говорят, что создаётся так
называемый "чёрный ящик".
______________________________________________________________
| │ Class │ Package │ Subclass │ Subclass │ World |
| │ │ │(same pkg)│(diff pkg)│ |
|────────────────────────────────────────────────|
|public │ + │ + │ + │ + │ + |
|────────────────────────────────────────────────|
|protected │ + │ + │ + │ + │ |
|────────────────────────────────────────────────|
|no modifier│ + │ + │ + │ │ |
|────────────────────────────────────────────────|
|private │ + │ │ │ │ |
|___________|_______|_________|__________|__________|________|
+ : accessible blank : not accessible

2. Полиморфизм (polymorphism)
(от греческого polymorphos) - это свойство, которое позволяет одно и то же имя
использовать для решения двух или более схожих, но технически разных задач. Целью
полиморфизма, применительно к объектно-ориентированному программированию,
является использование одного имени для задания общих для класса действий.
Выполнение каждого конкретного действия будет определяться типом данных.В более
общем смысле, концепцией полиморфизма является идея "один интерфейс, множество
методов". Это означает, что можно создать общий интерфейс для группы близких по
смыслу действий. Преимуществом полиморфизма является то, что он помогает снижать
сложность программ, разрешая использование того же интерфейса для задания единого
класса действий.
Пример с Shape, Triangle, Rectangle etc
Как java определяет какой метод вызывать?
Что происходит, когда вызывается метод, принадлежащий объекту king?
1. Компилятор проверяет объявленный тип объекта и имя метода, нумерует все методы с
именем speech в классе AerusTargarien и все открытые методы speech в суперклассах
AerusTargarien. Теперь компилятору известны возможные кандидаты при вызове метода.
2. Компилятор определяет типы передаваемых в метод аргументов. Если найден
единственный метод, сигнатура которого совпадает с аргументами, происходит вызов.
Этот процесс называется разрешением перегрузки (overloading resolution). Т.е. при вызове
king.speech("Homo homini lupus est")компилятор выбирает метод speech(String quotation), а
не speech().
Если компилятор находит несколько методов с подходящими параметрами (или ни
одного), выдается сообщение об ошибке.
Теперь компилятор знает имя и типы параметров метода,подлежащего вызову.
В случае, если вызываемый метод является private, static, final или конструктором,
используется статическое связывание (early binding). В остальных случаях метод,
подлежащий вызову, определяется по фактическому типу объекта, через который
происходит вызов. Т.е. во время выполнения программы используется динамическое
связывание (late binding).
4. Виртуальная машина заранее создает таблицу методов для каждого класса.
По факту при вызове:
1. Определяется фактический тип переменной king. В данном случае это
AerysTargaryen.
2. Виртуальная машина определяет класс, к которому принадлежит метод
speech()
3. Происходит вызов метода.

3. Наследование (inheritance)
это процесс, посредством которого один объект может приобретать свойства
другого. Точнее, объект может наследовать основные свойства другого объекта и
добавлять к ним черты, характерные только для него. Наследование является важным,
поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical
classification). Применение иерархии классов делает управляемыми большие потоки
информации.

4. Difference between HashMap and TreeMap.


TreeMap is an example of a NavigableMap -> SortedMap, which means that the order of
the keys can be sorted, and when iterating over the keys, you can expect that they will be in
order.
HashMap on the other hand, makes no such guarantee. Therefore, when iterating over the keys
of a HashMap, you can't be sure what order they will be in.
HashMap will be more efficient in general, so use it whenever you don't care about the order of
the keys.To sum, the biggest difference between HashMap and TreeMap is that TreeMap
implements NavigableMap<K,V>, which provide the feature of ordered iteration. Besides, both
HashMap and TreeMap are members of Java Collection framework.
HashMap in Java 8 changes LinkedList to TreeMap if on the same hash there are
too many elements.

5.Immutable
называется объект, состояние[en] которого не может быть изменено после создания.
Immutable objects - String, Integer и BigDecimal. Создание immutable объектa: класс final;
поля private final; никаких сеттеров; если поле mutable - возвращать копию объекта

6. Итератор
(от англ. iterator) — объект, абстрагирующий за единым интерфейсом доступ к
элементам коллекции[1]. Итератор иногда также называют курсором, особенно если речь
идет о базе данных. Для List - ListIterator

7. Методы Object:
public final native Class getClass()
public native int hashCode()
public boolean equals(Object obj)
protected native Object clone() throws CloneNotSupportedException
public String toString()
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout) throws InterruptedException
public final void wait(long timeout, int nanos) throws InterruptedException
public final void wait() throws InterruptedException
protected void finalize() throws Throwable - (deprecated) данный метод вызывается
при уничтожении объекта автоматическим сборщиком мусора (garbage collector). В
классе Object он ничего не делает, однако в классе-наследнике позволяет описать
все действия, необходимые для корректного удаления объекта, такие как закрытие
соединений с БД, сетевых соединений, снятие блокировок на файлы и т.д. В
обычном режиме напрямую этот метод вызывать не нужно, он отработает
автоматически. Если необходимо, можно обратиться к нему явным образом.
В методе finalize() нужно описывать только дополнительные действия, связанные с
логикой работы программы. Все необходимое для удаления объекта JVM сделает
сама.

8. Exceptions:
Исключения (Exceptions) являются результатом проблем в программе, которые в
принципе решаемы и предсказуемы. Например, произошло деление на ноль в целых
числах.
Ошибки (Errors) представляют собой более серьёзные проблемы, которые,
согласно спецификации Java, не следует пытаться обрабатывать в собственной
программе, поскольку они связаны с проблемами уровня JVM. Например, исключения
такого рода возникают, если закончилась память, доступная виртуальной машине.
Программа дополнительную память всё равно не сможет обеспечить для JVM.
В Java все исключения делятся на три типа: контролируемые исключения (checked)
и неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors) и
исключения времени выполнения (RuntimeExceptions, потомок класса Exception).
Контролируемые исключения представляют собой ошибки, которые можно и нужно
обрабатывать в программе, к этому типу относятся все потомки класса Exception (но не
RuntimeException).
Примеры Error: AnnotationFormatError, AssertionError, AWTError,
CoderMalfunctionError, FactoryConfigurationError, FactoryConfigurationError, IOError,
LinkageError, ServiceConfigurationError, ThreadDeath, TransformerFactoryConfigurationError,
VirtualMachineError
Примеры RuntimeException: NullPointerException, ClassCastException

8.1 Опишите иерархию исключений.


Все классы-исключения расширяют класс Throwable - непосредственное
расширение класса object.
У класса Throwable и у всех его расширений по традиции два конструктора:
- Throwable о - конструктор по умолчанию;
- Throwable (String message) - создаваемый объект будет содержать произвольное
сообщение message.

Записанное в конструкторе сообщение можно получить затем методом getMessage


(). Если объект создавался конструктором по умолчанию, то данный метод возвратит null.
Метод toString возвращает краткое описание события, именно он работал в предыдущих
листингах.

Три метода выводят сообщения обо всех методах, встретившихся по пути "полета"
исключения:
- printstackTrace() - выводит сообщения в стандартный вывод, как правило, это консоль;
- printStackTrace(PrintStream stream) - выводит сообщения в байтовый поток stream;
- printStackTrace(PrintWriter stream) - выводит сообщения в символьный поток stream.

У класса Throwable два непосредственных наследника - классы Error и Exception.


Они не добавляют новых методов, а служат для разделения классов-исключений на два
больших семейства - семейство классов-ошибок (error) и семейство собственно
классов-исключений (exception).
Классы-ошибки, расширяющие класс Error, свидетельствуют о возникновении
сложных ситуаций в виртуальной машине Java. Их обработка требует глубокого
понимания всех тонкостей работы JVM. Ее не рекомендуется выполнять в обычной
программе. Не советуют даже выбрасывать ошибки оператором throw. He следует делать
свои классы-исключения расширениями класса Error или какого-то его подкласса.
Имена классов-ошибок, по соглашению, заканчиваются словом Error.
Классы-исключения, расширяющие класс Exception, отмечают возникновение обычной
нештатной ситуации, которую можно и даже нужно обработать. Такие исключения следует
выбросить оператором throw. Классов-исключений очень много, более двухсот. Они
разбросаны буквально по всем пакетам J2SDK. В большинстве случаев вы способны
подобрать готовый класс-исключение для обработки исключительных ситуаций в своей
программе. При желании можно создать и свой класс-исключение, расширив класс
Exception или любой его подкласс.

Среди классов-исключений выделяется класс RuntimeException - прямое


расширение класса Exception. В нем и его подклассах отмечаются исключения, возникшие
при работе JVM, но не столь серьезные, как ошибки. Их можно обрабатывать и
выбрасывать, расширять своими классами, но лучше доверить это JVM, поскольку чаще
всего это просто ошибка в программе, которую надо исправить. Особенность исключений
данного класса в том, что их не надо отмечать в заголовке метода пометкой throws.

Имена классов-исключений, по соглашению, заканчиваются словом Exception.

8.2. Какие виды исключений в Java вы знаете, чем они отличаются?


Все исключительные ситуации можно разделить на две категории:
проверяемые(checked) и непроверяемые(unchecked).
Все исключения, порождаемые от Throwable, можно разбить на три группы. Они
определяются тремя базовыми типами:
● наследниками Throwable - классами Error Exception
● наследником Exception - RuntimeException.

Ошибки, порожденные от Exception (и не являющиеся наследниками


RuntimeException ), являются проверяемыми. Т.е. во время компиляции проверяется,
предусмотрена ли обработка возможных исключительных ситуаций. Как правило, это
ошибки, связанные с окружением программы (сетевым, файловым вводом-выводом и
др.), которые могут возникнуть вне зависимости от того, корректно написан код или нет.
Например, открытие сетевого соединения или файла может привести к возникновению
ошибки и компилятор требует от программиста предусмотреть некие действия для
обработки возможных проблем. Таким образом повышается надежность программы, ее
устойчивость при возможных сбоях.
Исключения, порожденные от RuntimeException, являются непроверяемыми и
компилятор не требует обязательной их обработки.
Как правило, это ошибки программы, которые при правильном кодировании возникать не
должны (например, IndexOutOfBoundsException- выход за границы массива,
java.lang.ArithmeticException- деление на ноль). Поэтому, чтобы не загромождать
программу, компилятор оставляет на усмотрение программиста обработку таких
исключений с помощью блоков try-catch.
Исключения, порожденные от Error, также не являются проверяемыми. Они
предназначены для того, чтобы уведомить приложение о возникновении фатальной
ситуации, которую программным способом устранить практически невозможно (хотя
формально обработчик допускается). Они могут свидетельствовать об ошибках
программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве
примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError
(нехватка памяти).
Методы, код которых может порождать проверяемые исключения, должны либо
сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово
throws с перечислением необрабатываемых проверяемых исключений. На
непроверяемые ошибки это правило не распространяется.
Переопределенный (overridden) метод не может расширять список возможных исключений
исходного метода.

8.3.Что такое checked и unchecked Exception?


Checked исключения, это те, которые должны обрабатываться блоком catch или
описываться в сигнатуре метода. Unchecked могут не обрабатываться и не быть
описанными.
Unchecked - унаследованные от RuntimeException,
Checked - унаследованные от Exception.
Пример unchecked исключения - NullPointerException, checked исключения - IOException.

8.4. Как создать свой unchecked Exception?


Наследоваться от RuntimeException.
8.5. Какие есть Unchecked exception?

8.6. Что такое Error?


Исключения, порожденные от Error, не являются проверяемыми. Они
предназначены для того, чтобы уведомить приложение о возникновении фатальной
ситуации, которую программным способом устранить практически невозможно (хотя
формально обработчик допускается). Они могут свидетельствовать об ошибках
программы, но, как правило, это неустранимые проблемы на уровне JVM. В качестве
примера можно привести StackOverflowError (переполнение стека), OutOfMemoryError
(нехватка памяти).
Методы, код которых может порождать проверяемые исключения, должны либо
сами их обрабатывать, либо в заголовке метода должно быть указано ключевое слово
throws с перечислением необрабатываемых проверяемых исключений. На
непроверяемые ошибки это правило не распространяется.

8.7. Опишите работу блока try-catch-finally.


Если срабатывает один из блоков catch, то остальные блоки в данной конструкции
try-catch выполняться не будут.
Свойством транзакционности исключения не обладают - действия, произведенные
в блоке try до возникновения исключения, не отменяются после его возникновения.

8.9. Возможно ли использование блока try-finally (без catch)?


try может быть в паре с finally, без catch.
Работает это точно так же - после выхода из блока try выполняется блок finally. Это
может быть полезно, например, в следующей ситуации. При выходе из метода вам надо
произвести какое-либо действие. А return в этом методе стоит в нескольких местах.
Писать одинаковый код перед каждым return нецелесообразно. Гораздо проще и
эффективнее поместить основной код в try, а код, выполняемый при выходе - в finally.
8.10. Всегда ли выполняется блок finally?

Не всегда например в следующих ситуациях:

- Существуют потоки-демоны - потоки предоставляющие некие сервисы, работая в


фоновом режиме во время выполнения программы, но при этом не являются ее
неотъемлемой частью.Таким образом когда все потоки не демоны завершаются,
программа завершает свою работу. В потоках демонах блок finally не выполняется, они
прерываются внезапно.
- System.exit(0)
- если в блоке finally произошло исключение и нет обработчика, то оставшийся код
в блоке finally может не выполнятся.

9. Автоупаковка (autoboxing)

это механизм не явной инициализации объектов классов-оберток (Byte, Short,


Character, Integer, Long, Float, Double).
значениями соответствующих им исходных примитивных типов (соотв. byte, short,
char, int, long, float, double), без явного использования конструктора класса.
Автоупаковка происходит при прямом присвоении примитива - классу-обертке (с
помощью оператора"="), либо при передаче примитива в параметры метода (типа
"класса-обертки"). Автоупаковке в "классы-обертки" могут быть подвергнуты как
переменные примитивных типов, так и константы времени компиляции(литералы и
final-примитивы). При этом литералы должны быть синтаксически корректными для
инициализации переменной исходного примитивного типа.
Unboxing - процесс, обратный автоупаковке, когда примитивному типу с помощью
оператора присваивания или путем передачи аргумента в метод присваивается значение
соответствующего класса-обертки.

10. Cпособы хранения объектов в памяти:


● Регистры процессора. В Java нет поддержки прямой работы с регистрами.
● Стек. Область RAM, где хранятся автоматические переменные с известным сроком
жизни.
● Куча. Область RAM, куда помещаются объекты, созданные с помощью оператора
new. Удалением их занимается "сборщик мусора".
● Постоянная память. Иногда значения констант встраиваются прямо в код и
хранятся в постоянной памяти ROM.
● Не-оперативная память. Данные располагаются вне программы и могут
существовать, когда программа не выполняется. Например сериализованные или
persistent (Hibernate) объекты.
11. Что означает ключевое слово final?
В случае класса — нельзя от него наследоваться.
В случае метода — нельзя его переопределять.
В случае переменной - нельзя изменить ссылку в памяти, которую использует
данная переменная.

12. Какое начальное количество корзин в HashMap


16

13. Отличия абстрактного класса от интерфейса


http://idev.by/android/22629/

1. Интерфейс описывает только поведение. У него нет состояния. А у


абстрактного класса состояние есть: он описывает и то, и другое.
2. Абстрактный класс связывает между собой и объединяет классы,
имеющие очень близкую связь. В то же время, один и тот же
интерфейс могут реализовать классы, у которых вообще нет ничего
общего.
3. Классы могут реализовывать сколько угодно интерфейсов, но
наследоваться можно только от одного класса.
4. Общие различия класса и интерфейса сюда же (наличие
конструктора в классе), Интерфейсы могут содержать только
константы, а АК - любые переменные;

14. HashCode
● для одного и того-же объекта, хеш-код всегда будет одинаковым
● если объекты одинаковые, то и хеш-коды одинаковые (но не наоборот,
см. правило 3).
● если хеш-коды равны, то входные объекты не всегда равны (коллизия);
● если хеш-коды разные, то и объекты гарантированно разные;
Эквивалентность и хеш-код тесно связаны между собой, поскольку хеш-код
вычисляется на основании содержимого объекта (значения полей) и если у
двух объектов одного и того же класса содержимое одинаковое, то и хеш-коды
должны быть одинаковые. Создавая пользовательский класс, нужно
переопределять методы hashCode() и equals(), чтобы они корректно работали
и учитывали данные объекта. Кроме того, если оставить реализацию из Object,
то при использовании java.util.HashMap возникнут проблемы, поскольку
HashMap активно используют hashCode() и equals() в своей работе.
1. Рефлексивность: для любых не-null объектов x, x.equals(x) должен
возвращать true.
2. Симметричность: для любых не-null объектов x и y, x.equals(y) должен
возвращать true, если и только если y.equals(x) возвращает true.
3. Транзитивность: для любых не-null объектов x, y, и z, если x.equals(y)
возвращает true и y.equals(z) возвращает true, тогда x.equals(z) должен
возвращать true.
4. Постоянство: повторный вызов метода equals() должен возвращать одно и
тоже значение до тех пор, пока какое-либо значение свойств объекта не
будет изменено. То есть, если два объекта равны, то они будут равны пока
их свойства остаются неизменными.
5. Для любых не-null объектов x, x.equals(null) должно возвращать false.

15.Rules for method overriding:


● The argument list should be exactly the same as that of the overridden method.
● The return type should be the same or a subtype of the return type declared in the
original overridden method in the superclass.
● The access level cannot be more restrictive than the overridden method's access level.
For example: if the superclass method is declared public then the overriding method in
the sub class cannot be either private or protected.
● Instance methods can be overridden only if they are inherited by the subclass.
● A method declared final cannot be overridden.
● A method declared static cannot be overridden but can be re-declared.
● If a method cannot be inherited, then it cannot be overridden.
● A subclass within the same package as the instance's superclass can override any
superclass method that is not declared private or final.
● A subclass in a different package can only override the non-final methods declared
public or protected.
● An overriding method can throw any unchecked2 exceptions, regardless of whether the
overridden method throws exceptions or not. However the overriding method should not
throw checked exceptions that are new or broader than the ones declared by the
overridden method. The overriding method can throw narrower or fewer exceptions than
the overridden method.
● Constructors cannot be overridden.

16.Сериализация
процесс перевода какой-либо структуры данных в последовательность битов.
Обратной к операции сериализации является операция десериализации (структуризации)
— восстановление начального состояния структуры данных из битовой
последовательности.
Сериализация используется для передачи объектов по сети и для сохранения их в
файлы. Например, нужно создать распределённое приложение, разные части которого
должны обмениваться данными со сложной структурой. В таком случае для типов данных,
которые предполагается передавать, пишется код, который осуществляет сериализацию и
десериализацию. Объект заполняется нужными данными, затем вызывается код
сериализации, в результате получается, например,XML-документ.
Маршалинг, по смыслу похож на сериализацию, в информатике — процесс
преобразования представления объекта в памяти в формат данных, пригодный для
хранения или передачи. Обычно применяется, когда данные необходимо передавать
между различными частями одной программы или от одной программы к другой.

17.XML парсеры.
SAX парсер читает xml документ и реагирует на появившиеся события, при этом в
отличии от DOM он не сохраняет документ в памяти. DOM парсер сохраняет дерево
документа в памяти и позволяет работать с ним. SAX очень полезен, когда документ
достаточно большой.
DOM читает всю XML-структуру и сохраняет дерево объектов в памяти. Это
требует гораздо больше ресурсов процессора и объёмов памяти. По этой причине SAX
API является предпочтительными для серверных приложений и фильтров данных,
которым не требуют большой объем памяти для представления данных.

18.ConcurrentModificationException.
ConcurrentModificationException не всегда является следствием неверной
синхронизации работы с коллекциями. ConcurrentModificationException возникает при
изменении коллекции любыми средствами, отличными от итератора, при проходе по
коллекции с помощью итератора. Изменение такое, как продемонстрировано выше может
происходить и в одно-тредной среде. Не лишне также добавить, что исключение может
возникать не только при удалении, но и при добавлении элемента, а также что
модификация контейнера может возникать и в многотредной среде.

19.Принципы SOLID.
Single responsibility principle Принцип единственной обязанности
На каждый класс должна быть возложена одна-единственная обязанность.

Open/closed principle Принцип открытости/закрытости


Программные сущности должны быть открыты для расширения, но закрыты для
изменения.

Liskov substitution principle Принцип подстановки Барбары Лисков


Объекты в программе могут быть заменены их наследниками без изменения свойств
программы. См. также контрактное программирование.

Interface segregation principle Принцип разделения интерфейса


Много специализированных интерфейсов лучше, чем один универсальный.

Dependency inversion principle Принцип инверсии зависимостей


Зависимости внутри системы строятся на основе абстракций. Модули верхнего уровня
не зависят от модулей нижнего уровня. Абстракции не должны зависеть от деталей.
Детали должны зависеть от абстракций.

20.Java Naming and Directory Interface (JNDI)


это Java API, организованный в виде службы каталогов, который позволяет
Java-клиентам открывать и просматривать данные и объекты по их именам.
API предоставляет:
● механизм ассоциации (связывания) объекта с именем;
● интерфейс просмотра директорий для выполнения общих запросов;
● интерфейс событий, который позволяет определить клиентам, когда элементы
директории были изменены;
● LDAP-расширение для поддержки дополнительных возможностей LDAP-сервисов.

21. Coupling
Elements are coupled if a change in one forces a change in the other. For example, if
two classes inherit from a common parent, then a change in one class might require a change in
the other. Think of a combo audio system: It’s tightly coupled because if we want to change from
analog to digital radio, we must rebuild the whole system. If we assemble a system from
separates, it would have low coupling and we could just swap out the receiver. “Loosely”
coupled features (i.e., those with low coupling) are easier to maintain.
Свя́занность (англ. coupling) или зави́симость (англ. dependency) — характеристика
взаимосвязи модуля с другими модулями. Это степень, в которой каждый программный
модуль полагается на другие модули.

22. Cohesion
An element’s cohesion is a measure of whether its responsibilities form a meaningful
unit. For example, a class that parses both dates and URLs is not coherent, because they’re
unrelated concepts. Think of a machine that washes both clothes and dishes—it’s unlikely to do
both well.2 At the other extreme, a class that parses only the punctuation in a URL is unlikely to
be coherent, because it doesn’t represent a whole concept. To get anything done, the
programmer will have to find other parsers for protocol, host, resource, and so on. Features with
“high” coherence are easier to maintain.
Свя́зность или сцепле́ние (англ. cohesion) — характеристика внутренней
взаимосвязи между частями одного модуля (сравни со связанностью).

23. Агрегация.
В объектно-ориентированном программировании под агрегированием
подразумевают методику создания нового класса из уже существующих классов путём
включения, называемого также делегированием. Об агрегировании также часто говорят
как об «отношении принадлежности» по принципу «у машины есть корпус, колёса и
двигатель». Aggregation is a relationship between two classes that is best
described as a "has-a" and "whole/part" relationship.

24. JMM
https://habrahabr.ru/post/133981/
● Atomicity - пока идёт запись значения одним потоком, другой поток может
увидеть какое-то промежуточное состояние. За примером далеко ходить не
нужно — записи тех же long и double, если они не объявлены как volatile, не
обязаны быть атомарными и на многих платформах записываются в две
операции: старшие и младшие 32 бита отдельно.
● Visibility - Важно лишь то, при каких условиях один поток видит изменения,
выполненные другим потоком. Важно отметить, что, в отличие от того же
C++, «из воздуха» (out-of-thin-air) значения никогда не берутся: для любой
переменной справедливо, что значение, наблюдаемое потоком, либо было
ранее ей присвоено, либо является значением по умолчанию.
● Reordering - Одним из примечательных эффектов может оказаться то, что
действия, выполненные одним потоком, другой поток увидит в другом
порядке.
● Happens-before
○ Пусть есть поток X и поток Y (не обязательно отличающийся от
потока X). И пусть есть операции A (выполняющаяся в потоке X) и
B(выполняющаяся в потоке Y).
○ В таком случае, A happens-before B означает, что все изменения,
выполненные потоком X до момента операции A и изменения,
которые повлекла эта операция, видны потоку Y в момент
выполнения операции B и после выполнения этой операции.

25. Инициализация класса


Согласно JLS порядок инициализации объекта следующий:
1. Инициализация static полей во время загрузки класса
2. Инициализация суперкласса
3. Инициализация полей в порядке очередности перед вызовом любого конструктора
класса
4. Конструктор класса
● Константа инициализируется в начале запуска

26. Garbage collector


http://ggenikus.github.io/blog/2014/05/04/gc/

27. Назвать разные реализации gc

28. DRY principle


don't repeat yourself (DRY)
29. KIss PRINCIPLE
KISS is an acronym for "Keep it simple, Stupid"

30. Что такое рефлексия?


Рефлексия используется для получения или модификации информации о типах во время
выполнения программы. Этот механизм позволяет получить сведения о классах, интерфейсах,
полях, методах, конструкторах во время исполнения программы. При этом не нужно знать
имена классов, методов или интерфейсов. Также этот механизм позволяет создавать новые
объекты, выполнять методы и получать и устанавливать значения полей.

31. Что произойдет со сборщиком мусора (GC), если во время


выполнения метода finalize() некоторого объекта произойдет
исключение?
Во время старта JVM запускается поток finalizer, который работает в фоне. Этот поток имеет
метод runFinalizer, который игнорирует все исключения методов finalize объектов перед
сборкой мусора.
То есть если во время выполнения метода finalize возникнет исключительная ситуация, его
выполнение будет остановлено и это никак не скажется на работоспособности самого
сборщика мусора (garbage collector).

32. Что такое интернационализация, локализация?


Интернационализация (internationalization, а для краткости - i18n) - такой способ создания
приложений, при котором их можно легко адаптировать для разных аудиторий, говорящих на
разных языках.
Локализацияlocalization а для краткости - l10n) - адаптация интерфейса приложения под
несколько языков. Добавление нового языка может внести определенные сложности в
локализацию интерфейса.

33. Что такое Аннотации в Java?


Аннотации - это своего рода метатеги, которые добавляются к коду и применяются к
объявлению пакетов, классов, конструкторов, методов, полей, параметров и локальных
переменных. Аннотации всегда обладают некоторой информацией и связывают эти
"дополнительные данные" и все перечисленные конструкции языка.
Фактически аннотации представляют собой их дополнительные модификаторы, применение
которых не влечет за собой изменений ранее созданного кода.

34. Какие функции выполняет Аннотации?


Аннотация выполняет следующие функции:
- дает необходимую информацию для компилятора;
- дает информацию различным инструментам для генерации другого кода, конфигураций и т.
д.;
- может использоваться во время работы кода;

Самая часто встречаемая аннотация, которую встречал любой программист, даже


начинающий это @Override.

35. Какие встроенные аннотации в Java вы знаете?

В языке Java SE определено несколько встроенных аннотаций, большинство из их являются


специализированными. Четыре типа @Retention, @Documented, @Target и @Inherited - из
пакета java.lang.annotation.
Из оставшиеся выделяются - @Override, @Deprecated, @SafeVarargs и @SuppressWarnings -
из пакета java.lang. Широкое использование аннотаций в различных технологиях и
фреймворках обуславливается возможностью сокращения кода и снижения его связанности.

36. Что делают аннотации @Retention, @Documented, @Target и


@Inherited?
Эти аннотации, имеют следующее значение:
- @Retention - эта аннотация предназначена для применения только в качестве аннотации к
другим аннотациям, позволяет указать жизненный цикл аннотации: будет она присутствовать
только в исходном коде, в скомпилированном файле, или она будет также видна и в процессе
выполнения. Выбор нужного типа зависит от того, как вы хотите использовать аннотацию.
- @Documented - это маркер-интерфейс, который сообщает инструменту, что аннотация
должна быть документирована.
- @Target - эта аннотация задает тип объявления, к которым может быть применима
аннотация. Принимает один аргумент, который должен быть константой из перечисления
ElementType, это может быть поле, метод, тип и т.д. Например, чтобы указать, что аннотация
применима только к полям и локальным переменным: @Targer({ ElementType.FIELD,
ElementTyle.LOCAL_VARIABLE } )
- @Inherited - это аннотация-маркер, которая может применяться в другом объявление
аннотации, она касается только тех аннотаций, что будут использованы в объявлениях
классов. Эта аннотация позволяет аннотации супер класса быть унаследованной в подклассе.

37. Что делают аннотации @Override, @Deprecated, @SafeVarargs и


@SuppressWarnings?
Эти аннотации предназначены для:
- @Override - аннотация-маркер, которая может применяться только к методам. Метод,
аннотированный как @Override, должен переопределять метод супер класса.
- @Deprecated - указывает, что объявление устарело и должно быть заменено более новой
формой.
- @SafeVarargs - аннотация-маркер, применяется к методам и конструкторам. Она указывает,
что никакие небезопасные действия, связанные с параметром переменного количества
аргументов, недопустимы. Применяется только к методам и конструкторам с переменным
количеством аргументов, которые объявлены как static или final.
- @SuppressWarnings - эта аннотация указывает, что одно или более предупреждений,
которые могут быть выданы компилятором следует подавить.

38. Какой жизненный цикл аннотации можно указать с помощью


@Retention?
Существует 3 возможные варианты чтобы указать где аннотация будет жить. Они
инкапсулированы в перечисление java.lang.annotation.RetentionPolicy. Это SOURSE, CLASS,
RUNTIME.
- SOURCE - содержаться только в исходном файле и отбрасываются при компиляции.
- CLASS - сохраняются в файле, однако они недоступны JVM во время выполнения.
- RUNTIME - сохраняются в файле во время компиляции и остаются доступными JVM во
время выполнения.

39. К каким элементам можно применять аннотацию, как это указать?


Для того чтобы ограничить использование аннотации её нужно проаннотировать. Для этого
существует аннотация @Target.
- @Target(ElementType.PACKAGE) - только для пакетов;
- @Target(ElementType.TYPE) - только для классов;
- @Target(ElementType.CONSTRUCTOR) - только для конструкторов;
- @Target(ElementType.METHOD) - только для методов;
- @Target(ElementType.FIELD) - только для атрибутов(переменных) класса;
- @Target(ElementType.PARAMATER) - только для параметров метода;
- @Target(ElementType.LOCAL_VARIABLE) - только для локальных переменных.
В случае если вы хотите, что бы ваша аннотация использовалась больше чем для одного типа
параметров, то можно указать @Target следующим образом:

тут мы говорим, аннотацию можно использовать только для параметров метода и для
локальных переменных.

40. Как создать свою Аннотацию?


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

как вы видите на месте где обычно пишут class или interface у нас написано @interface.
Структура практически та же, что и у интерфейсов, только пишется @interface.
- @interface - указывает на то, что это аннотация
- default - говорит про то, что метод по умолчанию будет возвращать определённое значение.
Аннотация готова теперь ею можно пользоваться, также аннотацию можно сконфигурировать.

41. Атрибуты каких типов допустимы в аннотациях?


Атрибуты могут иметь только следующие типы:
примитивы
- String
- Class или «any parameterized invocation of Class»
- enum
- annotation
- массив элементов любого из вышеперечисленных типов

Последний пункт надо понимать как то, что допустимы только одномерные массивы.

42. Что такое JMX?


Управленческие расширения Java (Java Management Extensions, JMX) - API при помощи
которого можно контролировать работу приложений и управлять различными параметрами
удаленно в реальном времени. Причем управлять можно фактически чем угодно - лишь бы
это было написано на Java. Это может быть микро-устройство типа считывателя отпечатка
или система, включающая тысячи машин, каждая из которых предоставляет определенные
сервисы. Данные ресурсы представляются MBean-объектами (управляемый Java Bean). JMX
вошла в поставку Java начиная с версии 5.

43. Какие выгоды предлагает JMX?


Вот как эти выгоды описывает Sun
● Простота реализации. Архитектура JMX основана на понятии "сервера управляемых
объектов" который выступает как управляющий агент и может быть запущен на многих
устройствах/компьютерах, которые поддерживают JAVA.
● Масштабируемость. Службы агентов JXM являются независимыми и могут быть
встроены наподобие plug-in’ов в агента JMX. Компонентно-основанаая система
позволяет создавать масштабируемые решения от крохотных устройств до очень
крупных систем.
● Возможность расширять концепцию в будущем. JMX позволяет создавать гибкие
решения. Например, JMX позволяет создавать удобные решения, которые могут
находить различные сервисы.
● Концентрация на управлении. JMX предоставляет сервися, разработанные для работы
в распределенных средах и его API спроектировано для решений, которые управляют
приложениями, сетями, сервисами и т.д.

44. Что еще умеет JMX кроме дистанционного управления?


JMX делает гораздо больше, чем просто предоставляет рабочую оболочку для
дистанционного управления. Она обеспечивает дополнительные услуги (services), способные
занять ключевое место в процессе разработки. Приведу лишь краткое описание:
● Event notification: Интерфейсы оповещают исполнителей и слушателей о событиях типа
изменения атрибута, что позволяет MBean-компонентам общаться с другими
MBean-компонентами или удалённым "командным пунктом" и докладывать об
изменениях своего состояния
● Monitor service: Monitor MBeans может посылать уведомления о событиях
зарегистрированным слушателям. Слушателем может выступать другой MBean или
управляющее приложение. В качестве основных атрибутов, для которых используется
данное свойство, являются counter, gauge или string.
● Timer service: Timer MBean будет посылать уведомления зарегистрированным
слушателям, с учётом определённого числа или временного промежутка.
● M-let service: М-let service может создавать и регистрировать экземпляры
MBean-серверов. Список MBean-компонентов и имён из классов определяются в
m-let-файле с помощью MLET -меток. URL указывает на месторасположения
m-let-файла.

45. Что такое MBean?


MBeans - это Java-объекты, которые реализуют определенный интерфейс. Интерфейс
включает:

1. некие величины, которые могут быть доступны;


2. операции, которые могут быть вызваны;
3. извещения, которые могут быть посланы;
4. конструкторы.

46. Какие типы MBeans существуют?


Существует 4 типа MBeans:
- Standard MBeans. Самые простые бины. Их управляющий интерфейс определяется набором
методов
- Dynamic MBeans. Они реализуют специализированный интерфейс, который делают
доступным во время исполнения.
- Open MBeans. Это Dynamic MBeans, которые используют только основные типы данных для
универсального управления.
- Model MBeans. Это Dynamic MBeans, которые полностью конфигурируемы и могут показать
свое описание во время исполнения (нечто вроде Reflection)

47. Что такое MBean Server?


MBean Server - это реестр объектов, которые используются для управления. Любой объект
зарегистрированный на сервере становится доступным для приложений. Надо отметить, что
сервер публикует только интерфейсы и не дает прямых ссылок на объекты. Любые ресурсы,
которыми вы хотите управлять должны быть зарегистрированы на сервере как MBean. Сервер
предоставляет стандартный интерфейс для доступа к MBean. Интересно, что регистрировать
MBean может любой другой MBean, сам агент или удаленное приложение через
распределенные сервисы. Когда вы регистрируете MBean вы должны дать ему уникальное
имя, которое будет использовано для обращения к данному объекту.
48. Какие механизмы обеспечивают безопасность в технологии Java?
В технологии Java безопасность обеспечивают следующие три механизма:
- структурные функциональные возможности языка (например, проверка границ массивов,
запрет на преобразования непроверенных типов, отсутствие указателей и т.д.).
- средства контроля доступа, определяющие действия, которые разрешается или запрещается
выполнять в коде (например, может ли код получать доступ к файлам, передавать данные по
сети и т.д.).
- механизм цифровой подписи, предоставляющий авторам возможность применять
стандартные алгоритмы для аутентификации своих программ, а пользователям - точно
определять, кто создал код и изменился ли он с момента его подписания.

49. Назовите несколько видов проверок которые выполняет


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

50. Что вы знаете о "диспетчере защиты" в Java?


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

51. Что такое JAAS?


JAAS (Java Authentication and Authorization Service - служба аутентификации и авторизации
Java ) - служба JAAS, по существу, представляет собой встраиваемый прикладной интерфейс
API, отделяющий прикладные программы на Java от конкретной технологии, применяемой для
реализации средств аутентификации. Помимо прочего, эта служба поддерживает механизмы
регистрации в UNIX и NT, механизм аутентификации Kerberos и механизмы аутентификации
по сертификатам.
После аутентификации за пользователем может быть закреплен определенный набор
полномочий. Входит в состав платформы Java начиная с версии Java SE 1.4.

52. Что такое Рефакторинг?


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

53. String
1. Какие есть особенности класса String? что делает метод intern().

- Внутреннее состояние класса String нельзя изменить после его создания, т.е. этот класс
неизменяемый (immutable) поэтому когда вы пишете String str = "One" + "Two"; создается
три! объекта класса String.
- От него нельзя унаследоваться, потому что класс String объявлен как final: public final
class String
- Метод hashCode класса String переписан и возвращает:
s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]
- У класса String есть метод public String intern(), который возвращает строку в
каноническом ее представлении из внутреннего пула строк, поддерживаемого JVM, он
нужен чтобы вместо String.equals() использовать ==.

Понятно, что оператор сравнения ссылок выполняется гораздо быстрее, чем


посимвольное сравнение строк.
Используют в основном, где приходится сравнивать много строк, например в каких нибудь
XML парсерах.
А вообще по увеличению производительности ещё вопрос. Ибо метод intern() тогда
должен выполняться быстрее чем equals(), каждый раз когда вы вызываете метод intern()
просматривается пул строк на наличие такой строки и если такая уже есть в пуле, то
возвращается ссылка на нее.Сравниваются они через equals().

2. Можно ли наследовать строковый тип, почему?


Классы объявлены final, поэтому наследоваться не получится.

3. Почему строка является популярным ключом в HashMap в Java?


Поскольку строки неизменны, их хэшкод кэшируется в момент создания, и не требует
повторного пересчета. Это делает строки отличным кандидатом для ключа в Map и они
обрабатываются быстрее, чем другие объекты-ключи HashMap. Вот почему строки
преимущественно используются в качестве ключей HashMap.
4. Дайте определение понятию конкатенация строк.
Конкатенация - операция объединения строк. Результатом является объединения второй
строки с окончанием первой. Операция конкатенации могут быть выполнены так:

5. Как перевернуть строку?


Один из способов как это можно сделать:

6. Как сравнить значение двух строк?


Строка в Java - это отдельный объект, который может не совпадать с другим объектом,
хотя на экране результат выводимой строки может выглядеть одинаково. Оператор == (а
также !=) работает с ссылками объекта String. Если две переменные String указывают на
один и тот же объект в памяти, сравнение вернет результат true. В противном случае
результат будет false, несмотря на то что текст может содержать в точности такие же
символы.
Для сравнения посимвольно на эквивалентность необходимо использовать метод equals().
7. Как обрезать пробелы в начале и конце строки?
Небольшой пример:

8. Дайте определение понятию "пул строк".


Пул строк - это набор строк, который хранится в памяти Java heap. Мы знаем, что String
это специальный класс в Java, и мы можем создавать объекты этого класса, используя
оператор new точно так же, как и создавать объекты, предоставляя значение строки в
двойных кавычках.
Диаграмма ниже объясняет, как пул строк размещается в памяти Java heap и что
происходит, когда мы используем различные способы создания строк.
Пул строк возможен исключительно благодаря неизменяемости строк в Java и реализации
идеи интернирования строк.
Пул строк помогает экономить большой объем памяти, но с другой стороны создание
строки занимает больше времени.
Когда мы используем двойные кавычки для создания строки, сначала ищется строка в
пуле с таким же значением, если находится, то просто возвращается ссылка, иначе
создается новая строка в пуле, а затем возвращается ссылка.
Тем не менее, когда мы используем оператор new, мы принуждаем класс String создать
новый объект строки, а затем мы можем использовать метод intern() для того, чтобы
поместить строку в пул, или получить из пула ссылку на другой объект String с таким же
значением.

9. Можно ли синхронизировать доступ к строке?


String сам по себе потокобезопасный класс. Если мы мы работаем с изменяемыми
строками, то нужно использовать StringBuffer.

10. Как правильно сравнить значения строк двух различных объектов типа
String и StringBuffer?
Привести их к одному типу и сравнить.

11. Почему строка неизменная и финализированная в Java?


Есть несколько преимуществ в неизменности строк:
- Строковый пул возможен только потому, что строка неизменна в Java, таким образом
виртуальная машина сохраняет много места в памяти(heap space), поскольку разные
строковые переменные указывают на одну переменную в пуле. Если бы строка не была
неизмененяемой, тогда бы интернирование строк не было бы возможным, потому что
если какая-либо переменная изменит значение, это отразится также и на остальных
переменных, ссылающихся на эту строку.
- Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности
приложения. Например, имя пользователя базы данных и пароль передаются строкой для
получения соединения с базой данных и в программировании сокетов реквизиты хоста и
порта передаются строкой. Так как строка неизменяемая, её значение не может быть
изменено, в противном случае любой хакер может изменить значение ссылки и вызвать
проблемы в безопасности приложения.
- Строки используются в Java classloader и неизменность обеспечивает правильность
загрузки класса при помощи Classloader. К примеру, задумайтесь об экземпляре класса,
когда вы пытаетесь загрузить java.sql.Connection класс, но значение ссылки изменено на
myhacked.Connection класс, который может осуществить нежелательные вещи с вашей
базой данных.
- Поскольку строка неизменная, её hashcode кэшируется в момент создания и нет
необходимости рассчитывать его снова. Это делает строку отличным кандидатом для
ключа в Map и его обработка будет быстрее, чем других ключей HashMap. Это причина,
почему строка наиболее часто используемый объект, используемый в качестве ключа
HashMap.

12. Напишите метод удаления данного символа из строки.


Мы можем использовать метод replaceAll для замены всех вхождений в строку другой
строкой. Обратите внимание на то, что метод получает в качестве аргумента строку,
поэтому мы используем класс Character для создания строки из символа, и используем её
для замены всех символов на пустую строку.

JAVA8
1. Что такое StringJoiner?
StringJoiner используется, чтобы создать последовательность символов, разделенных
разделителем, может (но это не обязательно) начинаться с префикса и заканчиваться
суффиксом. Пример:

2. Что такое default методы?


Начиная с Java 8 мы можем использовать в интерфейсах стандартные методы (default
methods) и статические методы (static methods).
Default метод - это метод в интерфейсе с по умолчанию реализованной логикой, который
не требуется обязательно
определять в реализации этого интерфейса.
3. Что такое static методы?
Static-методы в интерфейсе - это по существу то же самое, что static-методы в
абстрактном классе.
- Статические методы в интерфейсе являются частью интерфейса, мы не можем
использовать его для объектов класса реализации.
- Статические методы в интерфейсе хороши для обеспечения вспомогательных методов,
например, проверки на null, сортировки коллекций и т.д.
- Статические методы в интерфейсе помогают обеспечивать безопасность, не позволяя
классам, которые реализуют интерфейс, переопределить их.
- Мы не можем определить статические методы для методов класса Object, потому что
получим ошибку компиляции.

4. Как вызывать default-метод интерфейса в классе?


Используя ключевое слово super вместе с именем интерфейса.

5. Как вызывать static-метод интерфейса в классе?


Используя имя интерфейса.

6. Что такое потоки(stream) в Java 8?


java.util.stream - введен для поддержки распараллеливания вычислений в потоках.
Предоставляет возможность обрабатывать последовательность элементов исполняя одну
или несколько операций, которые могут выполняться либо последовательно либо
паралельно. Потоки делятся на последовательные и параллельные. Самая большая
польза от этого - в работе с коллекциями.
Операции над потоком относятся либо к промежуточным, либо к терминальным. Все
промежуточные операции возвращают поток, так что мы можем объединять несколько
промежуточных операций без использования точки с запятой. Терминальные операции
возвращают void или непотоковый результат.

7. Для чего нужен метод collect Java 8?


Большинство операций класса Stream, которые модифицируют набор данных,
возвращают этот набор в виде потока. Однако бывают ситуации, когда хотелось бы
получить данные не в виде потока, а в виде обычной коллекции, например, ArrayList или
HashSet. И для этого у класса Stream определен метод collect. Метод принимает в
качестве параметра функцию преобразования к коллекции:
<R,A> R collect(Collector<? super T,A,R> collector)
Параметр R представляет тип результата метода, параметр Т - тип элемента в потоке, а
параметр А - тип промежуточных накапливаемых данных. В итоге параметр collector
представляет функцию преобразования потока в коллекцию.

8. В чем разница между коллекцией(Collection) и потоком(Stream)?


Разница между коллекцией(Collection) данных и потоком(Stream) из новой JDK8 в том что
коллекции позволяют работать с элементами по-отдельности, тогда как поток(Stream) не
позволяет. Например, с использованием коллекций, вы можете добавлять элементы,
удалять, и вставлять в середину. Поток(Stream) не позволяет манипулировать отдельными
элементами из набора данных, но вместо этого позволяет выполнять функции над
данными как одним целом.

9. Для чего предназначен метод forEach в потоках(stream)?


Метод void forEach(Consumer<? super T> action) - для каждого элемента выполняется
действие action. forEach является терминальной операцией, используется для перебора
каждого элемента потока.
forEach не гарантирует последовательности вывода элементов в параллельном stream-е,
для этого используется метод forEachOrdered - он это гарантирует.

10. Как вывести на экран 10 случайных чисел, используя forEach?


Следующий фрагмент кода показывает, как вывести 10 случайных чисел с помощью
forEach.
Погуглить как это делает SplittableRandom.

11. Для чего предназначен метод map в потоках(stream)?


Метод <R> Stream<R> map(Function<? super T,? extends R> mapper) - преобразует
элементы типа T в элементы типа R и возвращает поток с элементами R. map является
промежуточной операцией, метод используется для преобразования элементов в другой
объект при помощи переданной функции.

12. Как можно вывести на экран уникальные квадраты чисел используя


метод map?
Следующий фрагмент кода демонстрирует это, используя метод map.

13. Какова цель метода filter в потоках(stream)?


Метод Stream<T> filter(Predicate<? super T> predicate) - фильтрует элементы в
соответствии с условием в предикате. filter является промежуточной операцией,
используется для фильтрации массива через функцию.
На самом деле filter, не выполняет фильтрацию, вместо этого он создается новый поток,
который по завершению формирования, содержит элементы исходного потока, которые
соответствуют заданному предикату.

14. Как вывести на экран количество пустых строк с помощью метода


filter?
Следующий фрагмент кода демонстрирует это с помощью метода filter.

15. Для чего предназначен метод limit в потоках(stream)?


Метод Stream<T> limit(long maxSize) - оставляет в потоке только maxSize элементов. limit
является промежуточной операцией, используется для выборки первых maxSize
элементов потока. Этот метод также возвращает модифицированный поток, в котором не
более maxSize элементов.
16. Для чего предназначен метод sorted в потоках(stream)?
Метод Stream<T> sorted()/Stream<T> sorted(Comparator<? super T> comparator) -
возвращает отсортированный поток. sorted является промежуточной операцией, метод
используется для сортировки потока используя естественный порядок сравнения его
элементов. Существует также второй метод sorted(), принимающий либо экземпляр
Comparable, либо соответствующее ему лямбда-выражение.

17. Как вывести на экран 10 случайных чисел в отсортированном


порядке в Java 8?
Следующий фрагмент кода демонстрирует это:

18. Параллельная обработка в Java 8?


Чтобы сделать обычный последовательный поток параллельным, надо вызвать у объекта
Stream метод parallel. Кроме того, можно также использовать метод parallelStream()
интерфейса Collection для создания параллельного потока из коллекции.
В то же время если рабочая машина не является многоядерной, то поток будет
выполняться как последовательный.
Следующий фрагмент кода, выводит количество пустых строк с помощью метода
parallelStream.

19. Как найти максимальное число в списке Java 8?


Следующий код выводит наибольшее число которое присутствует в списке.

20. Как найти минимальное число в списке Java 8?


Следующий код выводит минимальное число которое присутствует в списке.

21. Как получить сумму всех чисел в списке, используя Java 8?


Следующий код выведет сумму всех чисел.
22. Как получить среднее значение всех чисел, в списке, используя
Java 8?
Следующий код выведет среднее значение всех чисел.

23. Что такое Optional?


Optional - это контейнер объекта, он может содержать значение или некоторый тип Т, или
просто быть null. Он предоставляет много полезных методов избавляющие от добавления
повторяющихся if null/notNull проверок, что позволяет нам сфокусироваться на том, что мы
хотим сделать.
Метод isPresent() возвращает true если экземпляр Optional содержит не null значение и
false в противном случае. Метод orElseGet() содержит запасной механизм результата,
если Optional содержит null, принимая функции для генерации значения по умолчанию.
Метод map() преобразует текущее значение Optional и возвращает новый экземпляр
Optional. Метод orElse() похож на orElseGet(), но вместо функции он принимает значение
по умолчанию.

24. Что такое Nashorn?


Nashorn - это движок JavaScript, разрабатываемый полностью на Java компанией Oracle.
Он призван дать возможность встраивать код JavaScript в приложения Java. В сравнении
с Rhino, который поддерживается Mozilla Foundation, Nashorn обеспечивает от 2 до 10 раз
более высокую производительность, так как он непосредственно компилирует код в
памяти и передает байт-код виртуальной машине Java. Nashorn умеет компилировать код
JavaScript и генерировать классы Java, которые загружаются специальным загрузчиком.
Возможен вызов кода Java прямо из JavaScript.

25. Что такое jjs в Java 8?


Nashorn поставляется с cmd-утилитой jjs, которая позволяет исполнять JavaScript прямо в
консоли. jjs принимает список JavaScript файлов исходного кода и запускает их. Чтобы
запустить файл давайте передадим его как аргумент в jjs:
jjs fileName.js

26. Что такое LocalDateTime в Java 8?


LocalDateTime объединяет вместе LocaleDate и LocalTime и содержит дату и время, но без
часового пояса в календарной системе ISO-8601. Время хранится с точностью до
наносекунды, так что в LocalTime можно хранить, например, величину
"13:45.30.123456789". Есть множество удобных методов, таких как plusMinutes, plusHours,
isAfter, toSecondOfDay и т.д.

27. Что такое ZonedDateTime в Java 8?


ZonedDateTime - аналог java.util.Calendar. Это самый мощный класс с полной
информацией о временном контексте, включает временную зону. Он содержит дату и
время в календарной системе ISO-8601.

28. Как получить текущую дату с использованием time API из Java 8?


Следующий код выводит текущую дату.

29. Как добавить 1 неделю к текущей дате с использованием time API?


Следующий код добавляет 1 неделю к текущей дате.

30. Как добавить 1 месяц к текущей дате с использованием time API?


Следующий код добавляет 1 месяц к текущей дате.

31. Как добавить 1 год к текущей дате с использованием time API?


Следующий код добавляет 1 год к текущей дате.

32. Как добавить 10 лет к текущей дате с использованием time API?


Следующий код добавляет 10 лет к текущей дате.
33. Как получить следующий вторник используя time API?
Следующий код возвращает следующий вторник.

34. Как получить вторую субботу текущего месяца используя time API?
Следующий код демонстрирует это.

35. Как получить текущею дату в миллисекундах используя time API?


Следующий код возвращает дату в миллисекундах.

36. Как получить текущую дату по местному времени в миллисекундах


используя time API?
Следующий код демонстрирует это.

37. Какой класс появился в Java 8 для декодирования данных?


В Java 8 для этого появился класс public static class Base64.Decoder - этот класс реализует
декодер для декодирования байт данных, используя схему кодирования Base64 как
указано в RFC 4648 и RFC 2045, класс безопасен для использования несколькими
параллельными потоками.

38. Какой класс появился в Java 8 для кодирования данных?


В Java 8 для этого появился класс public static class Base64.Encoder - этот класс реализует
кодер для кодирования байт данных, используя схему кодирования Base64 как указано в
RFC 4648 и RFC 2045, класс безопасен для использования несколькими параллельными
потоками.
39. Как создать Base64 декодировщик?
Используя метод getDecoder() класса Base64 он возвращает декодировщик
Base64.Decoder, который декодирует данные с помощью схемы кодирования base64.

40. Как создать Base64 кодировщик?


Используя метод getEncoder() класса Base64 он возвращает кодировщик Base64.Encoder,
который кодирует данные с помощью схемы кодирования base64.

Concurrency
1. Deadlock
Предположим, что один поток уже захватил монитор на некотором объекте x и для
продолжения работы ему нужно захватить монитор на объекте y. В другом же потоке
ситуация ровно обратная – он уже захватил монитор на объекте y и ему нужен монитор
объекта x. В результате оба потока будут ждать, пока нужный монитор освободится. Как
вы сами прекрасно понимаете, ждать они будут до бесконечности. Эта ситуация и
называется взаимной блокировкой – deadlock.

2. Какие способы синхронизации потоков в java вам известны?


● Системная синхронизация с использованием wait/notify. Поток, который ждет
выполнения каких-либо условий, вызывает у этого объекта метод wait,
предварительно захватив его монитор. На этом его работа приостанавливается.
Другой поток может вызвать на этом же самом объекте метод notify (опять же,
предварительно захватив монитор объекта), в результате чего, ждущий на объекте
поток "просыпается" и продолжает свое выполнение.
● Системная синхронизация с использованием join. Метод join, вызванный у
экземпляра класса Thread, позволяет текущему потоку остановиться до того
момента, как поток, связаный с этим экземпляром, закончит работу.
● Использование классов из пакета java.util.concurrent, который предоставляет набор
классов для организации межпоточного взаимодействия. Примеры таких классов -
Lock, семафор (Semaphore), etc. Концепция данного подхода заключается в
использовании атомарных операций и переменных.

3. synchronized
имеет два важных момента: это гарантия того, что только один поток выполняет
секцию кода в один момент времени (взаимоисключение или mutex), и также гарантия
того, что данные, изменённые одним потоком, будут видны всем другим потокам
(видимость изменений).
4. volatile
проще, нежели синхронизация и подходит только для контроля доступа к
одиночному экземпляру или переменной примитивного типа: int, boolean... Когда
переменная объявлена как volatile, любая запись её будет осуществляться прямо в
память, минуя кеш. Также как и считываться будет прямо из памяти, а не из
всевозможного кеша. Это значит, что все потоки будут "видеть" одно и то же значение
переменной одновременно.

5. Livelock
тип взаимной блокировки, при котором несколько потоков продолжают свою работу,
но попадают в зацикленность при попытке получения каких-либо ресурсов.
Фактической ошибки не возникает, но КПД системы падает до 0. Часто возникает в
результате попыток предотвращения deadlock'а.
Пример: Метод пытается выполнить какую-либо работу, используя 2 внешних
объекта. Сперва он получает блокировку по одному из объектов, а затем проверяет,
свободен ли второй объект. Если объект свободен - получает блокировку по нему и
выполняет работу, если занят - освобождает первый объект и ждёт, когда они оба
освободятся. 2 потока одновременно вызывают этот метод. Поток 1 блокирует первый
объект. Поток 2 блокирует второй объект. Оба проверяют, свободен ли второй ресурс -
обнаруживают, что он занят и освобождают занятый ресурс. Оба потока обнаруживают,
что оба ресурса свободны и начинают процесс блокировки сначала. Livelock.
Способы борьбы:
1) Так же, как и в случае с deadlock'ом - блокировать объекты всегда в одинаковом
порядке.
2) Метод может производить блокировку по своему внутреннему объекту и уже после
этого пытаться получить внешние ресурсы.

A livelock is a situation in which two or more threads block each other by responding to
an action that is caused by another thread. In contrast to a deadlock situation, where two or
more threads wait in one specific state, the threads that participate in a livelock change their
state in a way that prevents progress on their regular work. An example would be a situation in
which two threads try to acquire two locks, but release a lock they have acquired when they
cannot acquire the second lock. It may now happen that both threads concurrently try to acquire
the first thread. As only one thread succeeds, the second thread may succeed in acquiring the
second lock. Now both threads hold two different locks, but as both want to have both locks,
they release their lock and try again from the beginning. This situation may now happen again
and again.

6.Difference between Thread.yield() and Thread.sleep().


It depends on what Java version you are using, according to this:
In Java 5, Thread.yield() calls the Windows API Sleep(0). This has the special effect of clearing
the current thread's quantum (number of allocated time-slices of CPU) and putting it to the end
of the queue for its priority level. In other words, all runnable threads of the same priority (and
those of greater priority) will get a chance to run before the yielded thread is next given CPU
time. When it is eventually re-scheduled, it will come back with a full quantum, but doesn't "carry
over" any of the remaining quantum from the time of yielding. This behavior is a little different
from a non-zero sleep where the sleeping thread generally loses 1 quantum value (in effect, 1/3
of a 10 or 15ms tick).
In Java 6, this behavior was changed. The Hotspot VM now implements Thread.yield()
using the Windows SwitchToThread() API call. This call makes the current thread give up its
current time-slice, but not its entire quantum. This means that depending on the priorities of
other threads, the yielding thread can be scheduled back in one interrupt period later.
Thread.sleep() suspends the current thread for a specified time, no matter what Java version
you use.

7.Difference between ConcurrentHashMap and


Collections.synchronizedMap.
Both are synchronized version of HashMap, with difference in their core functionality and
their internal structure.
ConcurrentHashMap consist of internal segments which can be viewed as independent
HashMaps Conceptually. All such segments can be locked by separate threads in high
concurrent executions. So, multiple threads can get/put key-value pairs from
ConcurrentHashMap without blocking/waiting for each other. This is implemented for higher
throughput.
Whereas Collections.synchronizedMap(), we get a synchronized version of HashMap and it is
accessed in blocking manner. This means if multiple threads try to access synchronizedMap at
same time, they will be allowed to get/put key-value pairs one at a time in synchronized manner.

8.Invoke run instead of start in thread.


If you call the run method directly it will run the code on the current thread, not on a new
thread.

9. What to use - Thread or Runnable?


Implements Runnable is the preferred way to do it, IMO. You're not really specialising the
thread's behaviour. You're just giving it something to run. That means composition is the
philosophically"purer" way to go.
In practical terms, it means you can implement Runnable and extend from another class
as well.

10.Deamon threads.
Такие потоки иногда ещё называются “службами”, которые обычно запускаются с
наименьшим приоритетом и обеспечивают основные услуги для программы или
программ, когда деятельность компьютера понижается. Примером такого потока может
служить сборщик мусора. Этот поток, предусмотрен JVM, сканирует программы на
наличие переменных, к которым больше никогда не придется обращаться, и освобождает
их ресурсы, возвращая их системе. Поток может стать daemon потоком, передав булево
значение true в метод setDaemon(). Если принято значение false, то поток становится
обычным пользовательским потоком. Тем не менее, это необходимо сделать до того как
поток запустится.

11. What do we understand by thread starvation?


Threads with lower priority get less time for execution than threads with higher priority.
When the threads with lower priority performs a long enduring computations, it may happen
that these threads do not get enough time to finish their computations just in time. They
seem to “starve” away as threads with higher priority steal them their computation time.

12. Can a synchronized block cause thread starvation?


The order in which threads can enter a synchronized block is not defined. So in theory it
may happen that in case many threads are waiting for the entrance to a synchronized block,
some threads have to wait longer than other threads. Hence they do not get enough
computation time to finish their work in time.

13. What do we understand by the term race condition?


A race condition describes constellations in which the outcome of some multi-threaded
implementation depends on the exact timing behavior of the participating threads. In most
cases it is not desirable to have such a kind of behavior, hence the term race condition also
means that a bug due to missing thread synchronization leads to the differing outcome. A
simple example for a race condition is the incrementation of an integer variable by two
concurrent threads. As the operation consists of more than one single and atomic operation,
it may happen that both threads read and increment the same value. After this concurrent
incrementation the amount of the integer variable is not increased by two but only by one.

14. What do we understand by fair locks?


A fair lock takes the waiting time of the threads into account when choosing the next thread
that passes the barrier to some exclusive resource. An example implementation of a fair
lock is provided by the Java SDK:java.util.concurrent.locks.ReentrantLock. If the constructor with
the boolean flag set to true is used, the ReentrantLock grants access to the longest-waiting
thread.
SQL / JDBC / Databases
1. GROUP BY
для аггрегации результирующих строк по заданным признакам-атрибутам.

2. Joins
http://www.sitepoint.com/understanding-sql-joins-mysql-database/

2.1 Какие есть типы JOIN'ов? Кратко опишите каждый из типов.


(INNER)JOIN - внутреннее соединение. В результирующем наборе присутствуют
только записи, значения связанных полей в которых совпадают.
LEFT JOIN - левое внешнее соединение. В результирующем наборе присутствуют
все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет, поля
из Table2 будут пустыми.
RIGHT JOIN - правое внешнее соединение. В результирующем наборе
присутствуют все записи из Table2 и соответствующие им записи из Table1. Если
соответствия нет, поля из Table1 будут пустыми.
FULL JOIN - полное внешнее соединение. Комбинация двух предыдущих. В
результирующем наборе присутствуют все записи из Table1 и соответствующие им записи
из Table2. Если соответствия нет - поля из Table2 будут пустыми. Записи из Table2,
которым не нашлось пары в Table1, тоже будут присутствовать в результирующем наборе.
В этом случае поля из Table1 будут пустыми.
CROSS JOIN - Cartesian product. Результирующий набор содержит все варианты
комбинации строк из Table1 и Table2. Условие соединения при этом не указывается.

2.2. Что такое LEFT JOIN, RIGHT JOIN? Чем они отличаются?
Проиллюстрируем каждый тип примерами. Модель данных:

SELECT Table1.Field1, Table2.Field2 FROM Table1 LEFT JOIN Table2 ON Table1.Key1


= Table2.Key2
SELECT Table1.Field1, Table2.Field2 FROM Table1 RIGHT JOIN Table2 ON
Table1.Key1 = Table2.Key2

LEFT JOIN - левое внешнее соединение. В результирующем наборе присутствуют


все записи из Table1 и соответствующие им записи из Table2. Если соответствия нет, поля
из Table2 будут пустыми.
RIGHT JOIN - правое внешнее соединение. В результирующем наборе
присутствуют все записи из Table2 и соответствующие им записи из Table1. Если
соответствия нет, поля из Table1 будут пустыми.

3. Difference between UNION and UNION ALL.


UNION removes duplicate records (where all columns in the results are the same),
UNION ALL does not.
There is a performance hit when using UNION vs UNION ALL, since the database
server must do additional work to remove the duplicate rows, but usually you do not want the
duplicates (especially when developing reports).

4. Statements.

● Statement - is used for executing static SQL statements and it can't accept input
parameters. (slower than PreparedStatement)
● PreparedStatement - allows us to execute dynamic queries with parameter inputs
● CallableStatement - the interface used to execute SQL stored procedures
5. HAVING

необязательный (опциональный) параметр оператора SELECT для указания


условия на результат агрегатных функций (MAX, SUM, AVG, …).
HAVING <условия> аналогичен WHERE <условия> за исключением того, что строки
отбираются не по значениям столбцов, а строятся из значений столбцов, указанных в
GROUP BY, и значений агрегатных функций, вычисленных для каждой группы,
образованной GROUP BY.

5.1 Для чего используется слово HAVING?


Секция HAVING определяет условие, которое затем применяется к групам строк.
Следовательно, это предложение имеет тот же смысл для группы строк, что и
предложение WHERE в отношении соодержимого соответствующей таблицы. Синтаксис
предложения HAVING
HAVING condition
где condition содержит агрегатные функции или константы.
Важно понимать, что секции HAVING и WHERE взаимно дополняют друг друга. Сначала с
помощью ограничений WHERE формируется итоговая выборка, затем выполняется
разбивка на группы по значениям полей, заданных в GROUP BY. Далее по каждой группе
вычисляется групповая функция и в заключение накладывается условие HAVING.
Пример:

SELECT DeptNum, MAX(SALARY) FROM Employees GROUP BY DeptNum HAVING


MAX(SALARY) > 1000

В приведенном примере в результат попадут только отделы, максимальная зарплата в


которых превышает 1000.

6. Что такое транзакция?


Транза́кция (англ. transaction) — группа последовательных операций с базой
данных, которая представляет собой логическую единицу работы с данными. Транзакция
может быть выполнена либо целиком и успешно, соблюдая целостность данных и
независимо от параллельно идущих других транзакций, либо не выполнена вообще и
тогда она не должна произвести никакого эффекта. Транзакции обрабатываются
транзакционными системами, в процессе работы которых создаётся история транзакций.
7. Уровни изоляции транзакций
Уровень изолированности транзакций — значение, определяющее уровень, при
котором в транзакции допускаются несогласованные данные, то есть степень
изолированности одной транзакции от другой. Более высокий уровень изолированности
повышает точность данных, но при этом может снижаться количество параллельно
выполняемых транзакций. С другой стороны, более низкий уровень изолированности
позволяет выполнять больше параллельных транзакций, но снижает точность данных.
При параллельном выполнении транзакций возможны следующие проблемы:

● потерянное обновление (англ. lost update) — при одновременном


изменении одного блока данных разными транзакциями, одно из изменений
теряется;
● «грязное» чтение (англ. dirty read) — чтение данных, добавленных или
изменённых транзакцией, которая впоследствии не подтвердится (откатится);
● неповторяющееся чтение (англ. non-repeatable read) — при повторном
чтении в рамках одной транзакции, ранее прочитанные данные оказываются
изменёнными;
● фантомное чтение (англ. phantom reads) — Одна транзакция в ходе своего
выполнения несколько раз выбирает множество строк по одним и тем же
критериям. Другая транзакция в интервалах между этими выборками добавляет
или удаляет строки или изменяет столбцы некоторых строк, используемых в
критериях выборки первой транзакции, и успешно заканчивается. В результате
получится, что одни и те же выборки в первой транзакции дают разные
множества строк.
● Serializable (упорядочиваемость) Самый высокий уровень

изолированности; транзакции полностью изолируются друг от друга. Только на этом


уровне параллельные транзакции не подвержены эффекту "фантомного чтения".

● Repeatable read (повторяемость чтения) Уровень, при котором чтение


одной и той же строки или строк в транзакции дает одинаковый результат. (Пока
транзакция не завершена, никакие другие транзакции не могут модифицировать
эти данные.)
● Read committed (чтение фиксированных данных). Завершенное
чтение, при котором отсутствует черновое, «грязное» чтение (то есть чтение одним
пользователем данных, которые не были зафиксированы в БД командой COMMIT).
Тем не менее в процессе работы одной транзакции другая может быть успешно
завершена и сделанные ею изменения зафиксированы. В итоге первая транзакция
будет работать с другим набором данных. Это проблема неповторяемого чтения.

● Read uncommitted (чтение незафиксированных данных). Низший


уровень изоляции, соответствующий уровню 0. Он гарантирует только отсутствие
потерянных обновлений[2]. Если несколько транзакций одновременно пытались
изменять одну и ту же строку, то в окончательном варианте строка будет иметь
значение, определенное последней успешно выполненной транзакцией.

8.ACID principles. https://ru.wikipedia.org/wiki/ACID

● Atomicity - the term atomicity applies to the ability to group multiple database updates
into a single transaction that can be treated as an atomic update;
● Consistency - The term consistency applies to the various rules associated with the
data in the transactions. These rules may apply to relationships between the tables in
the update or to rules concerning the primary key for a table. These rules may be broken
during the transaction, but the inconsistent data will not be visible to other users. Once
the transaction is complete, the rules must be valid and the database must be in a
consistent state;
● Isolation - A given transaction should appear as though it is running alone in the
database. The work of other users must be coordinated with other transactions to
maintain this isolated view. The work of other transactions is invisible to the user in a
transaction;
● Durability - The work of a committed transaction is guaranteed to persist and remain in
the database even in the event of various system failures. A transaction is not
considered durable until it commits. A system failure entails a database recovery, which
includes a rollback procedure for all uncommitted transactions, ultimately leaving the
database in a consistent state.
9. Разница между InnoDB и MyISAM.

В среднем MyISAM работает быстрее InnoDB, но в InnoDB реализованы


блокировки на уровне строк, что увеличивает скорость работы в приложениях,
выполняющих и интенсивное чтение, и интенсивное добавление/изменение данных.
InnoDB, в отличие от MyISAM, поддерживает транзакции и внешние ключи.

Таблицы MyISAM можно копировать средствами самой файловой системы, в отличии от


InnoDB, попытка переместить файлы таблицы которой приведет к потере таблицы.

MyISAM поддерживает полнотекстовый поиск.

10. Что такое нормализация?


Нормализацией схемы базы данных называется процедура, производимая над
базой данных с целью удаления в ней избыточности.
Нормализация несет с собой немало преимуществ. Очевидно, что в
нормализованной базе данных уменьшается вероятность возникновения ошибок, она
занимает меньше места на жестком диске и т.д.

11. Индекс (англ. index)


объект базы данных, создаваемый с целью повышения производительности поиска
данных. Таблицы в базе данных могут иметь большое количество строк, которые хранятся
в произвольном порядке, и их поиск по заданному критерию путем последовательного
просмотра таблицы строка за строкой может занимать много времени. Индекс
формируется из значений одного или нескольких столбцов таблицы и указателей на
соответствующие строки таблицы и, таким образом, позволяет искать строки,
удовлетворяющие критерию поиска. Ускорение работы с использованием индексов
достигается в первую очередь за счёт того, что индекс имеет структуру,
оптимизированную под поиск — например,сбалансированного дерева.

12. Реляционная база данных.


Реляционная база данных — база данных, построенная на основе реляционной
модели. В реляционной базе данных каждый объект задается записью (строкой) в
двумерной таблице.

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

14. Нормальная форма


свойство отношения в реляционной модели данных, характеризующее его с точки
зрения избыточности, потенциально приводящей к логически ошибочным результатам
выборки или изменения данных. Нормальная форма определяется как совокупность
требований, которым должно удовлетворять отношение.
15. CAP теорема
Теорема CAP (известная также как теорема Брюера) — эвристическое утверждение о
том, что в любой реализации распределённых вычислений возможно обеспечить не более
двух из трёх следующих свойств:
● согласованность данных (англ. consistency) — во всех вычислительных узлах в
один момент времени данные не противоречат друг другу;
● доступность (англ. availability) — любой запрос к распределённой системе
завершается корректным откликом;
● устойчивость к разделению (англ. partition tolerance) — расщепление
распределённой системы на несколько изолированных секций не приводит к
некорректности отклика от каждой из секций.

Следствия
С точки зрения теоремы CAP, распределённые системы в зависимости от пары практически
поддерживаемых свойств из трёх возможных распадаются на три класса — CA, CP, AP.
В системе класса CA во всех узлах данные согласованы и обеспечена доступность, при этом
она жертвует устойчивостью к распаду на секции. Такие системы возможны на основе
технологического программного обеспечения, поддерживающего транзакционность в смысле
ACID, примерами таких систем могут быть решения на основе кластерных систем управления
[12]
базами данных или распределённая служба каталогов LDAP .
Система класса CP в каждый момент обеспечивает целостный результат и способна
функционировать в условиях распада, но достигает этого в ущерб доступности: может не
выдавать отклик на запрос. Устойчивость к распаду на секции требует обеспечения
дублирования изменений во всех узлах системы, в связи с этим отмечается практическая
целесообразность использования в таких системах распределённых пессимистических
блокировок для сохранения целостности.
В системе класса AP не гарантируется целостность, но при этом выполнены условия
доступности и устойчивости к распаду на секции. Хотя системы такого рода известны задолго
до формулировки принципа CAP (например, распределённые веб-кэши или DNS), рост
популярности решений с этим набором свойств связывается именно с распространением
теоремы CAP. Так, большинство NoSQL-систем принципиально не гарантируют целостности
данных, и ссылаются на теорему CAP как на мотив такого ограничения. Задачей при
построении AP-систем становится обеспечение некоторого практически целесообразного
уровня целостности данных, в этом смысле про AP-системы говорят как о «целостных в
конечном итоге» (англ. eventually consistent) или как о «слабо целостных» (англ. weak
consistent).
16. Что такое DDL?
DDL(Data Definition Language) - Команды определения структуры данных. В состав
DDL-группы входят команды, позволяющие определять внутреннюю структуру базы
данных. Перед тем, как сохранять данные в БД, необходимо создать в ней таблицы и,
возможно, некоторые другие сопутствующие объекты
Пример некоторых DDL-команд:

17. Что такое DML?


DML(Data Manipulation Language) - Команды манипулирования данными. DML-группа
содержит команды, позволяющие вносить, изменять, удалять и извлекать данные из
таблиц.
Примеры DML-команд:

18. Что такое TCL?


TCL(Transaction Control Language) - TCL-команды используются для управления
изменениями данных, производимыми DML-командами. С их помощью несколько
DML-команд могут быть объединены в единое логическое целое, называемое
транзакцией. При этом все команды на изменение данных в рамках одной транзакции
либо завершаются успешно, либо все могут быть отменены в случае возникновения
каких-либо проблем с выполнением любой из них.
TCL-команды:

19. Что такое DCL?


DCL(Data Control Language) - Команды управления доступом. DCL-команды управляют
доступом пользователей к БД и отдельным объектам:
20. Какой общий синтаксис команды SELECT?
В общем виде синтаксис команды SELECT выглядит следующим образом:

В квадратных скобках указаны необязательные элементы команды. Ключевые слова


SELECT и FROM должны присутствовать всегда.

21. Про NULL в SQL.


Необходимо отметить, что язык SQL, в отличие от языков программирования, имеет
встроенные средства поддержки факта отсутствия каких-либо данных. Осуществляется
это с помощью NULL-концепции. NULL не является каким-то фиксированным значением,
хранящимся в поле записи вместо реальных данных. Значение NULL не имеет
определенного типа. NULL — это индикатор, говорящий пользователю (и SQL) о том, что
данные в поле записи отсутствуют. Поэтому его нельзя использовать в операциях
сравнения. Для проверки факта наличия-отсутствия данных в SQL введены специальные
выражения.

22. Если вы собираетесь соединить несколько таблиц в запросе


(например, n таблиц), сколько условий соединения вам нужно
использовать?
Тогда нужно использовать n-1 условий соединения чтоб исключить декартовой
соединения, может быть и такое, что потребуется больше чем n-1 условий соединения, и
совсем другие условия соединения для дальнейшего сокращения результирующего
набора данных.

23. Какое практическое применение временных таблиц?


Временная таблица - это объект базы данных, который хранится и управляется системой
базы данных на временной основе. Они могут быть локальными или глобальными.
используется для сохранения результатов вызова хранимой процедуры, уменьшение
числа строк при соединениях, агрегирование данных из различных источников или замена
курсоров и параметризованных представлений.
24. Как оператор GROUP BY обрабатывает значение NULL? Ли это общем
трактовке таких значений?
При использовании GROUP BY все значения NULL считаются равными. Значение NULL -
это специальное значение, которое можно присвоить ячейке таблицы. Это значение
обычно применяется, когда информация в ячейке неизвестна или неприемлема.

25. В чем разница между COUNT (*) и COUNT (столбец)?


форма COUNT (столбец) подсчитывает количество значений в "столбец". При подсчете
количества значений столбца эта форма функции COUNT не принимает во внимание
значение NULL. функция COUNT (*) подсчитывает количество строк в таблице, не
игнорирует значение NULL, поскольку эта функция оперирует строками, а не столбцами.

26. В чем разница между операторами DISTINCT и GROUP BY?


DISTINCT - указывает, что для вычислений используются только уникальные значения
столбца. NULL считается как отдельное значение. Если нужно удалить только дубликаты
лучше использовать DISTINCT. GROUP BY группирует выбранный набор строк для
получения набора сводных строк по значениям одного или нескольких столбцов или
выражений. GROUP BY создает отдельную группу для всех возможных значений (включая
значение NULL). GROUP BY лучше использовать для определения групп выходных строк,
к которым могут применяться агрегатные функции (COUNT, MIN, MAX, AVG и SUM).

27. Есть таблица table1 с колонками id и datetime написать запрос


который вернет максимальное значение id и значение даты для этого
id.
Есть множество решений - самое простое - это получать max значение для id и потом
вывести значения:

28. Для чего нужны операторы UNION, INTERSECT, EXCEPT?


Оператор UNION - применяется для объединения результатов двух SQL-запросов в
единую таблицу, состоящую из похожих срок. Оба запроса Должны возвращать
одинаковое число столбцов и совместимые типы данных в соответствующих столбцах.
Оператор INTERSECT - используется для нахождения пересечения двух множеств.
Результатом его выполнения будет множество строк, которые присутствуют в обоих
множествах.
Оператор EXCEPT - используется для нахождения разности двух множеств. Результатом
выполнения является множество строк из множества 1, которые отсутствуют в множестве
2.
Приоритет выполнения операторов над множествами:
INTERSECT -> EXCEPT -> UNION

29. Что лучше использовать соединение или подзапросы?


Обычно лучше использовать JOIN, поскольку в большинстве случаев он понятен, и лучше
оптимизируется с помощью Database Engine. но не всегда. Соединение имеет
преимущество над подзапросов в случае, когда список выбора SELECT в запросе
содержит столбцы более чем одной таблицы.
Подзапросы лучшие тогда, когда нужно вычислять агрегатные значение и использовать их
во внешних запросах для сравнений.

Hibernate
1. FetchType
При проектировании доменов приложения, разрабатываемого с использованием
Hibernate, разработчику необходимо сделать выбор: инициализировать ли свойства
домена, соответствующие коллекциям связанных доменов, сразу (FetchType=EAGER)
или же делать это только при обращении к ним (FetchType=LAZY).

2. Уровни кэша
3 уровня - 1, 2 и уровня запросов
● Кеш первого уровня всегда привязан к объекту сессии. Hibernate всегда по
умолчанию использует этот кеш и его нельзя отключить.
● Если кеш первого уровня привязан к объекту сессии, то кеш второго уровня
привязан к объекту-фабрике сессий (Session Factory object). Что как бы
подразумевает, что видимость этого кеша гораздо шире кеша первого уровня. По
умолчанию кеш второго уровня отключен. Для включения необходимо добавить
следующие строки в Вашем конфигурационном файле JPA (persistence.xml):
<property name="hibernate.cache.provider_class"
value="net.sf.ehcache.hibernate.SingletonEhCacheProvider"/>
//или в более старых версиях
//<property name="hibernate.cache.provider_class"
value="org.hibernate.cache.EhCacheProvider"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/> Помимо
всего этого, вероятней всего, Вам также понадобится отдельно настроить и саму
реализацию кеша. В случае с EHCache это нужно сделать в файле ehcache.xml.
Ну и в завершение еще нужно указать самому хибернейту, что именно
кешировать. К счастью, это очень легко можно сделать с помощью аннотаций,
например так: @Entity
@Table(name = "shared_doc")
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class SharedDoc{
private Set<User> users;
}

● Кеш запросов похож на кеш второго уровня. Но в отличии от него — ключом к


данным кеша выступает не идентификатор объекта, а совокупность параметров
запроса. А сами данные — это идентификаторы объектов соответствующих
критериям запроса. Таким образом, этот кеш рационально использовать с кешем
второго уровня.

3. Какие бывают id generator классы в Hibernate?


● increment - генерирует идентификатор типа long, short или int, которые будет
уникальным только в том случае, если другой процесс не добавляет запись в эту
же таблицу в это же время.
● identity - генерирует идентификатор типа long, short или int. Поддерживается в
DB2, MySQL, MS SQL Server, Sybase и HypersonicSQL.
● sequence - использует последовательности в DB2, PostgreSQL, Oracle, SAP DB,
McKoi или генератор Interbase. Возвращает идентификатор типа long, short или int.
● hilo - использует алгоритм hi/lo для генерации идентификаторов типа long, short
или int. Алгоритм гарантирует генерацию идентификаторов, которые уникальны
только в данной базе данных.
● seqhilo - использует алгоритм hi/lo для генерации идентификаторов типа long, short
или int учитывая последовательность базы данных.
● uuid - использует для генерации идентификатора алгоритм 128-bit UUID.
Идентификатор будет уникальным в пределах сети. UUID представляется строкой
из 32 чисел.
● guid - использует сгенерированую БД строку GUID в MS SQL Server и MySQL.
● native - использует identity, sequence или hilo в завимисимости от типа БД, с
которой работает приложение
● assigned - позволяет приложению устанавливать идентификатор объекту, до
вызова метода save(). Используется по умолчанию, если тег <generator> не указан.
● select - получает первичный ключ, присвоенный триггером БД
● foreign - использует идентификатор другого, связанного с данным объекта.
Используется в <one-to-one> ассоциации первичных ключей.
● sequence-identity - специализированный генератор идентификатора. Используется
только с драйевром Oracle 10g дл JDK 1.4.

4. Какие преимущства от использования Hibernate?


Некоторые из них:
● прозрачный механизм связи БД и POJO;
● HQL;
● автоматическая генерация primary key;
● кэш: Session Level, Query и Second level;
● производительность: ленивая инициализация, выборка outer join.

5. Какие типы менеджмента транзакций поддерживаются в Hibernate?


Hibernate взаимодействует с БД через JDBC-соединение. Таким образом он поддерживает
управляемые и не управляемые транзакции.
Неуправляемые транзакции в web-контейнере:
org.springframework.orm.hibernate.HibernateTransactionManager
Управляемые транзакции на сервере приложений, использующий JTA:
JtaTransactionManager

6. Какие существуют стратегии загрузки объектов в Hibernate?


Существуют следующие типа fetch'a:
● Join fetching: hibernate получает ассоциированные объекты и коллекции одним
SELECT используя OUTER JOIN
● Select fetching: использует уточняющий SELECT чтобы получить
ассоциированные объекты и коллекции. Если вы не установите lazy fetching
определив lazy="false", уточняющий SELECT будет выполнен только когда вы
запрашиваете доступ к ассоциированным объектам
● Subselect fetching: поведение такое же, как у предыдущего типа, за тем
исключением, что будут загружены ассоциации для все других коллекций,
«родительским» для которых является сущность, которую вы загрузили первым
SELECT’ом.
● Batch fetching: оптимизированная стратегия вида select fetching. Получает группу
сущностей или коллекций в одном SELECT’е.

7. Какие существуют типы стратегий кэша?


● Read-only: эта стратегия используется когда данные вычитываются, но никогда не
обновляется. Самая простая и производительная стратегия
● Read/write: может быть использована, когда данные должны обновляться.
● Нестрогий read/write: эта стратегия не гарантирует, что две транзакции не
модифицируют одни и те же данные синхронно.
● Transactional: полноценное кэширование транзакций. Доступно только в JTA
окружении.
8.DetachedEntity.
Detached entity objects are objects in a special state in which they are not managed by
any EntityManager but still represent objects in the database. Compared to managed entity
objects, detached objects are limited in functionality:
● Many JPA methods do not accept detached objects (e.g. lock).
● Retrieval by navigation from detached objects is not supported, so only persistent fields
that have been loaded before detachment should be used.
● Changes to detached entity objects are not stored in the database unless modified
detached objects are merged back into an EntityManager to become managed again.
Detached objects are useful in situations in which an EntityManager is not available and for
transferring objects between different EntityManager instances.

9.DetachedCriteria.
Some applications need to create criteria queries in "detached mode", where the
Hibernate session is not available. This class may be instantiated anywhere, and then a Criteria
may be obtained by passing a session to getExecutableCriteria(). All methods have the same
semantics and behavior as the corresponding methods of the Criteria interface.

10.Hibernate
библиотека для языка программирования Java, предназначенная для решения
задач объектно-реляционного отображения (object-relational mapping — ORM). Данная
библиотека предоставляет легкий в использовании каркас (фреймворк) для отображения
объектно-ориентированной модели данных в традиционные реляционные базы данных.
Целью Hibernate является освобождение разработчика от значительного объёма
сравнительно низкоуровневого программирования по обеспечению хранения объектов в
реляционной базе данных. Разработчик может использовать Hibernate как в процессе
проектирования системы классов и таблиц «с нуля», так и для работы с уже
существующей базой данных.

11.Связи в БД.
OneToOne - in child table PK/FK is the same
http://www.mkyong.com/mysql/how-to-define-one-to-one-relationship-in-mysql/
OneToMany - child table has FK on first table
http://www.mkyong.com/hibernate/hibernate-one-to-many-relationship-example/
ManyToMany - third table with FK of the both tables
http://www.mkyong.com/hibernate/hibernate-many-to-many-example-join-table-extra-column-an
notation/
http://www.mkyong.com/hibernate/hibernate-many-to-many-relationship-example-annotation/

12. LazyInitException overcome


Many applications need to retrieve an object in one transaction, send it to the UI layer for
manipulation, then save the changes in a new transaction. Applications that use this kind of
approach in a high-concurrency environment usually use versioned data to ensure isolation for
the "long" unit of work.
Hibernate supports this model by providing for reattachment of detached instances using
the Session.update() or Session.merge() methods.
Or whichever object creating this problem, use HibernateTemplate.initialize(object
name)

13. Hibernate Session

14. Типы Propagation


Показывает как будет исполнятся вложенная транзакция относительно существующей
● Propagation.REQUIRED — выполняться в существующей транзакции, если она
есть, иначе создавать новую.
● Propagation.MANDATORY — выполняться в существующей транзакции, если она
есть, иначе генерировать исключение.
● Propagation.SUPPORTS — выполняться в существующей транзакции, если она
есть, иначе выполняться вне транзакции.
● Propagation.NOT_SUPPORTED — всегда выполняться вне транзакции. Если есть
существующая, то она будет остановлена.
● Propagation.REQUIRES_NEW — всегда выполняться в новой независимой
транзакции. Если есть существующая, то она будет остановлена до окончания
выполнения новой транзакции.
● Propagation.NESTED — если есть текущая транзакция, выполняться в новой, так
называемой, вложенной транзакции. Если вложенная транзакция будет отменена,
то это не повлияет на внешнюю транзакцию; если будет отменена внешняя
транзакция, то будет отменена и вложенная. Если текущей транзакции нет, то
просто создаётся новая.
● Propagation.NEVER — всегда выполнять вне транзакции, при наличии
существующей генерировать исключение.

15. В каких статусах могут находится объекты в Hibernate


● transient object - a new instance of a persistent class which is not associated with a
Session, has no representation in the database and no identifier value
● persistent object - has a representation in the database, an identifier value and is
associated with a Session. You can make a transient instance persistent by associating
it with a Session
● detached object - if we close the Hibernate Session
● removed object - при removed запись будет удалена после окончания транзакции
○ — при вызове merge на persistent операция игнорируется, при вызове merge
на removed по спеке JPA должен быть выкинут exception,
○ — при вызове refresh на persistent данные будет переписаны, при вызове на
removed по спеке JPA должен быть выкинут exception,
16. FlushModes
Represents a flushing strategy. The flush process synchronizes database state with session
state by detecting state changes and executing SQL statements.
ALWAYS - The Session is flushed before every query.
AUTO - The Session is sometimes flushed before query execution in order to ensure that
queries never return stale state.
COMMIT - The Session is flushed when Transaction.commit() is called.
MANUAL - The Session is only ever flushed when Session.flush() is explicitly called by the
application.
NEVER - Deprecated. use MANUAL instead.

17. Типы локов


У JPA есть шесть видов блокировок, перечислим их в порядке увеличения надежности (от
самого ненадежного и быстрого, до самого надежного и медленного):

1) NONE — без блокировки


2) OPTIMISTIC (или синоним READ, оставшийся от JPA 1) — оптимистическая блокировка,
3) OPTIMISTIC_FORCE_INCREMENT (или синоним WRITE, оставшийся от JPA 1) —
оптимистическая блокировка с принудительным увеличением поля версионности,
4) PESSIMISTIC_READ — пессимистичная блокировка на чтение,
5) PESSIMISTIC_WRITE — пессимистичная блокировка на запись (и чтение),
6) PESSIMISTIC_FORCE_INCREMENT — пессимистичная блокировка на запись (и
чтение) с принудительным увеличением поля версионности.

18. Как можно настроить кэш второго уровня


JPA говорит о пяти значениях shared-cache-mode из persistence.xml, который определяет
как будет использоваться second-level cache:
1) ALL — все Entity могут кэшироваться в кеше второго уровня,
2) NONE — кеширование отключено для всех Entity,
3) ENABLE_SELECTIVE — кэширование работает только для тех Entity, у которых
установлена аннотация Cacheable(true) или её xml эквивалент, для всех остальных
кэширование отключено,
4) DISABLE_SELECTIVE — кэширование работает для всех Entity, за исключением тех у
которых установлена аннотация Cacheable(false) или её xml эквивалент
5) UNSPECIFIED — кеширование не определенно, каждый провайдер JPA использует
свою значение по умолчанию для кэширования

SPRING
http://www.tutorialspoint.com/spring/spring_interview_questions.htm
1. Dependency injection (DI)
паттерн проектирования и архитектурная модель, так же известная как Inversion of
Control (IoC). DI описывает ситуацию, когда один объект реализует свой функционал через
другой объект. Например, соединение с базой данных передается конструктору объекта
через аргумент, вместо того чтобы конструктор сам устанавливал соединение. Термин
"dependency injection" немного неправильный, т.к. внедряются не зависимости, а
функциональность или ресурсы. Существуют три формы внедрения (но не типа)
зависимостей: сэттер, конструктор и внедрение путем интерфейса.
DI - это способ достижения слабой связанности. IoC предоставляет возможность
объекту получать ссылки на свои зависимости. Обычно это реализуется через
lookup-метод. Преимущество IoC в том, что эта модель позволяет отделить объекты от
реализации механизмов, которые он использует. В результате мы получаем большую
гибкость как при разработке приложений, так и при их тестировании.

2. Какие IoC контейнеры вы знаете?


Spring является IoC контейнером. Помимо него существуют HiveMind, Avalon,
PicoContainerи т.д. Варианты реализаций: DI, Factory Method, Service Locator.

3. Что такое AOP? Как это относиться к IoC?


Аспектно-ориентированное программирование (АОП) — парадигма программирования,
основанная на идее разделения функциональности для улучшения разбиения программы на
модули. AOP и Spring - взаимодополняющие технологии, которые позволяют решать сложные
проблемы путем разделения функционала на отдельные модули.

4. В чем роль ApplicationContext в Spring?


В то время, как BeanFactory используется в простых приложениях, Application Context -
это более сложный контейнер. Как и BeanFactory он может быть использован для загрузки и
связывания бинов, но еще он предоставляет:
1. возможность получения текстовых сообщений, в том числе поддержку
интернационализации;
2. общий механизм работы с ресурсами;
3. события для бинов, которые зарегестрированы как слушатели.
Из-за большей функциональности рекомендуется использование Application Context вместо
BeanFactory. Последний используется только в случаях нехватки ресурсов, например при
разработке для мобильных устройств. Существует 3 основных реализации Application context:
1. ClassPathXmlApplicationContext - получает информацию из xml-файла, находящегося в
classpath. Пример: ApplicationContext context = new
ClassPathXmlApplicationContext("bean.xml");
2. FileSystemXmlApplicationContext - получает информацию из xml-файла. Например:
ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml");
3. XmlWebApplicationContext - получает информацию из xml-файла за пределами
web-приложения.

5. Как добавить поддержку Spring в web-приложение


Достаточно просто указать ContextLoaderListener в web.xml файле приложения:

<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class
>
</listener>

6. Добавление диспетчера Spring MVC

Для того, чтобы Spring MVC мог обрабатывать HTTP запросы, нужно прописать
сервлет-диспетчер. Откройте web.xml и добавьте следующие строки в <web-app>
<servlet>
<servlet-name>action</servlet-name>
servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>action</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>

7. Какие существуют scopes в spring?


● singleton – Return a single bean instance per Spring IoC container
● prototype – Return a new bean instance each time when requested
● request – Return a single bean instance per HTTP request. *
● session – Return a single bean instance per HTTP session. *
● globalSession – Return a single bean instance per global HTTP session.

8. Explain Bean lifecycle in Spring framework?


Following is sequence of a bean lifecycle in Spring:
● Instantiate - First the spring container finds the bean's definition from the XML file and
instantiates the bean..
● Populate properties - Using the dependency injection, spring populates all of the
properties as specified in the bean definition..
● Set Bean Name - If the bean implements BeanNameAware interface, spring passes the
bean's id to setBeanName() method.
● Set Bean factory - If Bean implements BeanFactoryAware interface, spring passes the
beanfactory to setBeanFactory() method.
● Pre Initialization - Also called postprocess of bean. If there are any bean
BeanPostProcessors associated with the bean, Spring calls
postProcesserBeforeInitialization() method.
● Initialize beans - If the bean implements IntializingBean,its afterPropertySet() method is
called. If the bean has init method declaration, the specified initialization method is
called.
● Post Initialization - If there are any BeanPostProcessors associated with the bean, their
postProcessAfterInitialization() methods will be called.
● Ready to use - Now the bean is ready to use by the application.
● Destroy - If the bean implements DisposableBean , it will call the destroy() method .

9. Lazily loading beans


One of the differences between BeanFactory and ApplicationContext is their method of loading
beans. The beanfactory lazily loads beans. It creates the bean only when the getBean() method is
called. The ApplicationContext on the other hand preloads all singleton beans upon context start
up. The "default-lazy-init" attribute tells the application context if its needs to lazily load the beans. The
default value of the attribute is false. Which makes the ApplicationContext non lazily load the beans.

10.Bean inheritance
Spring beans support basic inheritance for inheriting constructors and
properties. A bean definition that is a base or template for other beans that should
never be instantiated can have the abstract attribute on the bean element set to
true. The abstract attribute defaults to false. ApplicationContext's will eagerly
instantiate beans which will result in errors while they are starting when abstract
beans not marked as abstract. The abstract attribute needs to be set to true if a
bean doesn't have required constructor and setter information or if the class
attribute is not set. BeanFactory's will not eagerly instantiate beans so when using a
BeanFactory it is not an issue, but for clarity it is still best to mark the bean as being
abstract. The attributes abstract, scope, lazy-init, depends-on, autowire, and
dependency-check are never inherited and are only taken from the current bean
definition. The examples only show only one level of inheritance, but Spring
supports as many levels of inheritance as logically make sense for your
configuration.
Collections can not only be inherited, but can also merge with the parent's
Collection. Spring supports collection merging for Lists, Sets, Maps, and Properties.
Use parent in xml for pointing out on parent class..

11.How @Transactional works from inside?


At a very high level, Spring creates proxies for classes that declare @Transactional on
the class itself or on members. The proxy is mostly invisible at runtime. It provides a way for
Spring to inject behaviors before, after, or around method calls into the object being proxied.
Transaction management is just one example of the behaviors that can be hooked in. Security
checks are another. And you can provide your own, too, for things like logging. So when you
annotate a method with @Transactional, Spring dynamically creates a proxy that implements
the same interface(s) as the class you're annotating. And when clients make calls into your
object, the calls are intercepted and the behaviors injected via the proxy mechanism.
Transactions in EJB work similarly, by the way.
As you observed, through, the proxy mechanism only works when calls come in from some
external object. When you make an internal call within the object, you're really making a call
through the "this" reference, which bypasses the proxy.
12. Использование @Transactional аннотации
http://www.springbyexample.com.ua/2012/08/faq-transactional.html
13. How to inject static method in class with xml?
With factory-method!
<bean id="preferences" class="java.util.prefs.Preferences"
factory-method="userNodeForPackage"> <constructor-arg type="java.lang.Class"
value="com.path.MyController" /> </bean>

14. @Repeteable
@Repeatable - возможность использовать одну и ту же аннотацию несколько раз в
одном месте (from Spring 4.0), example - @Scheduled

15. Autowired vs Inject vs Resource


http://blogs.sourceallies.com/2011/08/spring-injection-with-resource-and-autowired/

JSP, SERVLETS
1. Какие скоупы переменных существуют в JSP
● Page Scope - объекты доступны в пределах созданной страницы
● Request - объекты доступны при обработки запроса к страницы
● Session - объекты существуют в пределах сессии. A session is the time users spend
using the application, which ends when they close their browser, when they go to another Web
site, or when the application designer wants (after a logout, for instance).
● Application - объекты доступны с jsp, если находятся в одном запущенном
приложении

2. Методы HttpServlet
● doGet, if the servlet supports HTTP GET requests
● doPost, for HTTP POST requests
● doPut, for HTTP PUT requests
● doDelete, for HTTP DELETE requests
● init and destroy, to manage resources that are held for the life of the servlet
● getServletInfo, which the servlet uses to provide information about itself

3. Чем статический include отличается от динамического? (вопрос по


JSP).
В JSP static include это <%@ include file=”filename.jsp” %>, а <jsp:include
page=”filename.jsp” /> - это dynamic include. Разница между ними в том, что static include -
то же самое, что и копипаст, а вот при dynamic include response файла, который мы
вставляем будет добавлен в response файла в который мы вставляем в время
исполнения.
4. Спецификация JSP различает три типа скриптовых элементов:

● Объявления <%! одна или несколько деклараций %>


● Выражения <%= одно выражение %>
● Скриплеты <% скриплет %>

5. Сервлетный фильтр
в соответствии со спецификацией, это Java-код, пригодный для повторного
использования и позволяющий преобразовать содержание HTTP-запросов, HTTP-ответов
и информацию, содержащуюся в заголовках HTML. Сервлетный фильтр занимается
предварительной обработкой запроса, прежде чем тот попадает в сервлет, и/или
последующей обработкой ответа, исходящего из сервлета.

6.Обновить сессию.
The Servlet API doesn't allow you to change the session id on an existing session.
Typically, to protect against session fixation, you'll want to just create a new one and invalidate
the old one as well.
You can invalidate a session like this
request.getSession(false).invalidate();
and then create a new session with
getSession(true) (getSession() should work to)
Obviously, if you have an data in the session that you want to persist, you'll need to copy
it from the first session to the second session.
Note, for session fixation protection, it's commonly considered okay to just do this on the
authentication request. But a higher level of security involves a tossing the old session and
making a new session for each and every request.

6. Контейнер сервлетов
программа, управляющая жизненным циклом сервлетов.
Сервлет – класс, отвечающий за обработку запросов клиента и отправку ответов.
Основные методы сервлета: init() – запускается сразу после загрузки сервлета в память;
service() – вызывается для обработки каждого запроса; destroy() – выполняется перед
выгрузкой сервлета из памяти. Destroy is invoked when:
● when the container shuts down or the application shuts down;
● when the container decides that there is a shortage of memory;
● when this servlet hasn't got a request in a long time.

Веб-сервисы
1. SOAP
(от англ. Simple Object Access Protocol — простой протокол доступа к объектам;
вплоть до спецификации 1.2) — протокол обмена структурированными сообщениями в
распределённой вычислительной среде. Первоначально SOAP предназначался в
основном для реализации удалённого вызова процедур (RPC). Сейчас протокол
используется для обмена произвольными сообщениями в формате XML, а не только для
вызова процедур. WSDL (Web Services Description Language). Правила, по которым
составляются сообщения для веб-сервиса описываются так же с помощью xml и также
имеют четкую структуру.

2. REST
(сокр. от англ. Representational State Transfer — «передача репрезентативного
состояния») — в более употребительном узком смысле под REST понимается метод
взаимодействия компонентов распределённого приложения в сети Интернет, при котором
вызов удаленной процедуры представляет собой обычный HTTP-запрос (обычно GET или
POST; такой запрос называют REST-запрос), а необходимые данные передаются в
качестве параметров запроса. Этот способ является альтернативой более сложным
методам, таким как SOAP, CORBA и RPC.

3. Difference between wsdl and xsd.


XSD defines a schema which is a definition of how an XML document can be structured.
You can use it to check that a given XML document is valid and follows the rules you've laid out
in the schema.
WSDL is an XML document that describes a web service. It shows which operations are
available and how data should be structured to send to those operations.
WSDL documents have an associated XSD that show what is valid to put in a WSDL document.

4. Разница между PUT и POST в REST.


В частности, разные паттерны по-разному рассматривают POST и PUT. Однако,
PUT предназначен для создания, реплейса или апдейта, для POST это не определено
(The POST operation is very generic and no specific meaning can be attached to it).
http://stackoverflow.com/questions/630453/put-vs-post-in-rest

5. Rest methods

EJB
1. Типы бинов
● объектные (Entity Bean) — перенесены в спецификацию Java Persistence API
● сессионные (Session Beans), которые бывают
● stateless (без состояния)
● stateful (с поддержкой текущего состояния сессии)
● singleton (один объект на все приложение; начиная с версии 3.1)
● управляемые сообщениями (Message Driven Beans) — их логика является
реакцией на события в системе

JAVASCRIPT
1. Типы данных:

http://learn.javascript.ru/types-intro

2. Замыкание (англ. closure)


в программировании — функция, в теле которой присутствуют ссылки на переменные,
объявленные вне тела этой функции и не в качестве её параметров (а в окружающем
коде). Говря другим языком, замыкание — функция, которая ссылается на свободные
переменные в своём контексте. Замыкание — это особый вид функции. Она определена в
теле другой функции и создаётся каждый раз во время её выполнения. В записи это
выглядит как функция, находящаяся целиком в теле другой функции. При этом вложенная
внутренняя функция содержит ссылки на локальные переменные внешней функции.
Каждый раз при выполнении внешней функции происходит создание нового экземпляра
внутренней функции, с новыми ссылками на переменные внешней функции. Если вы
объявляете функцию внутри другой функции, первая получает доступ к переменным и
аргументам последней:

function outerFn(myArg) {
var myVar;
function innerFn() {
//имеет доступ к myVar и myArg
}
}

3. Наследование в js
http://javascript.ru/tutorial/object/inheritance

4. This in js
http://javascript.ru/tutorial/object/thiskeyword

5. Event propagation
http://novice2ninja.ru/ninja-book/chapter-5/event-propagation.html

6. Что вернет выражение +new Date()? Чем отличается от Date.now().


Ответ в том, что +new Date(); создаст экземпляр объекта Date и благодаря +
переведет его в числовой формат. Во втором случае вызовется статический метод
конструктора, который является более приоритетным, т.к. во-первых он не требует
создания экземпляра, а во-вторых является более понятным.
7. Отличия == и ===
http://habrahabr.ru/post/138272/

8. Сколько потоков в js?

В каждом окне выполняется только один главный поток, который занимается


выполнением JavaScript, отрисовкой и работой с DOM. Он выполняет команды
последовательно и блокируется при выводе модальных окон, таких как alert. Есть и другие
потоки, например для сетевых коммуникаций, поэтому скачивание файлов может
продолжаться пока основной поток ждёт реакции на alert. Но это скорее исключение, чем
правило.

9. Можно ли отправлять ajax-запрос на другой домен.


Начиная с jQuery версии 1.2 у Вас есть возможность загружать данные JSON
расположенные на другом домене. Для этого нужно использовать функцию JSONP в
качестве функции callback (обратного вызова), например, «myurl?callback=?». jQuery
автоматически заменяет знаки «?» на соответствующее имя метода, который необходимо
использовать, вызывая функцию, которую вы указали в callback. Если Вы устанавливаете
параметр dataType в ‘jsonp’, то Ваша функция автоматически будет прикреплена к запросу
AJAX.

10. Call & apply


In JavaScript, functions are objects. JavaScript functions have properties and methods.
call() and apply() are predefined JavaScript function methods. Both methods can be used to
invoke a function, and both methods must have the owner object as first parameter.

function myFunction(a, b) {
return a * b;
}
myObject = myFunction.call(myObject, 10, 2); // Will return 20
Or
function myFunction(a, b) {
return a * b;
}
myArray = [10, 2];
myObject = myFunction.apply(myObject, myArray); // Will also return 20

Both methods take an owner object as the first argument. The only difference is that
call() takes the function arguments separately, and apply() takes the function arguments in an
array.
In JavaScript strict mode, the first argument becomes the value of this in the invoked
function, even if the argument is not an object.
In "non-strict" mode, if the value of the first argument is null or undefined, it is replaced
with the global object.
With call() or apply() you can set the value of this, and invoke a function as a new
method of an existing object.

Git
1. Difference between svn and git.
● Git tracks content rather than files
● Branches are lightweight and merging is easy, and I mean really easy.
● It's distributed, basically every repository is a branch. It's much easier to develop
concurrently and collaboratively than with Subversion, in my opinion. It also makes
offline development possible.
● It doesn't impose any workflow, as seen on the above linked website, there are many
workflows possible with Git. A Subversion-style workflow is easily mimicked.
● Git repositories are much smaller in file size than Subversion repositories. There's only
one ".git" directory, as opposed to dozens of ".svn" repositories (note Subversion 1.7 and
higher now uses a single directory like Git.)
● The staging area is awesome, it allows you to see the changes you will commit, commit
partial changes and do various other stuff.
● Stashing is invaluable when you do "chaotic" development, or simply want to fix a bug
while you're still working on something else (on a different branch).
● You can rewrite history, which is great for preparing patch sets and fixing your mistakes
(beforeyou publish the commits)
● … and a lot more.

There are some disadvantages:

● There aren't many good GUIs for it yet. It's new and Subversion has been around
for a lot longer, so this is natural as there are a few interfaces in development.
Some good ones include TortoiseGitand GitHub for Mac.
● Partial checkouts/clones of repositories are not possible at the moment (I read that
it's in development). However, there is submodule support. Git 1.7+ supports sparse
checkouts.
● It might be harder to learn, even though I did not find this to be the case (about a
year ago). Git has recently improved its interface and is quite user friendly.
2. Как перенести коммит из одной ветки в другую?

В Git'е есть два способа включить изменения из одной ветки в другую: merge
(слияние) и rebase(перемещение).

3. Rebase:
http://habrahabr.ru/post/161009/

Testing
1.Difference between stub and mock

Thee biggest distinction is that a stub you have already written with predetermined
behavior. So you would have a class that implements the dependency (abstract class or
interface most likely) you are faking for testing purposes and the methods would just be stubbed
out with set responses. They wouldn't do anything fancy and you would have already written the
stubbed code for it outside of your test.
A mock is something that as part of your test you have to setup with your expectations. A
v
mock is not setup in a predetermined way so you have code that does it in your test. Mocks in a
way are determined at runtime since the code that sets the expectations has to run before they
do anything.
Tests written with mocks usually follow an initialize -> set expectations -> exercise ->
verify pattern to testing. While the pre-written stub would follow an initialize -> exercise -> verify.
The purpose of both is to eliminate testing all the dependencies of a class or function so your
tests are more focused and simpler in what they are trying to prove.

2. Виды тестирования.

По степени изолированности компонентов:

● Компонентное (модульное) тестирование (component/unit testing)


● Интеграционное тестирование (integration testing) - одна из фаз тестирования
программного обеспечения, при которой отдельные программные модули
объединяются и тестируются в группе.
● Системное тестирование (system/end-to-end testing)

По объекту тестирования:

● Функциональное тестирование (functional testing)


● Тестирование производительности (performance testing)
● Юзабилити-тестирование (usability testing)
● Тестирование интерфейса пользователя (UI testing)
● Тестирование безопасности (security testing)
● Тестирование локализации (localization testing)
● Тестирование совместимости (compatibility testing)

3. BeforeClass vs before.
The code marked @Before is executed before each test, while @BeforeClass runs
once before the entire test fixture. If your test class has ten tests, @Before code will be
executed ten times, but @BeforeClass will be executed only once.
In general, you use @BeforeClass when multiple tests need to share the same
computationally expensive setup code. Establishing a database connection falls into this
category. You can move code from @BeforeClass into @Before, but your test run may take
longer.

4.Testing web mvc spring.


@WebAppConfiguration
A class-level annotation that is used to declare that the ApplicationContext loaded
for an integration test should be a WebApplicationContext. The mere presence of
@WebAppConfiguration on a test class ensures that a WebApplicationContext will be
loaded for the test, using the default value of"file:src/main/webapp" for the path to the
root of the web application (i.e., the resource base path). The resource base path is used
behind the scenes to create a MockServletContext which serves as the ServletContext
for the test’s WebApplicationContext.

5. Mocks
In object-oriented programming, mock objects are simulated objects that mimic the
behavior of real objects in controlled ways. A programmer typically creates a mock object to test
the behavior of some other object, in much the same way that a car designer uses acrash test
dummy to simulate the dynamic behavior of a human in vehicle impacts.
In a unit test, mock objects can simulate the behavior of complex, real objects and are therefore
useful when a real object is impractical or impossible to incorporate into a unit test. If an actual
object has any of the following characteristics, it may be useful to use a mock object in its place:
● the object supplies non-deterministic results (e.g. the current time or the current
temperature);
● it has states that are difficult to create or reproduce (e.g. a network error);
● it is slow (e.g. a complete database, which would have to be initialized before the test);
● it does not yet exist or may change behavior;
● it would have to include information and methods exclusively for testing purposes (and
not for its actual task).
Algorithms
1. Основные алгоритмы сортировки массивов:
● сортировка выбором - поиск наименьшего или наибольшего элемента и
помещение его в начало или конец упорядоченного списка. Сложность алгоритма:
O(n2).
● сортировка пузырьком - для каждой пары индексов производится обмен, если
элементы расположены не по порядку. Сложность алгоритма: O(n2).
● сортировка вставками - Определяем, где текущий элемент должен находиться в
упорядоченном списке, и вставляем его туда. Сложность алгоритма: O(n2).
● сортировка слиянием - выстраиваем первую и вторую половину списка отдельно,
а затем объединяем упорядоченные списки. Сложность алгоритма: O(n log n).
Требуется O(n) дополнительной памяти.
● сортировка с помощью двочиного дерева - Сложность алгоритма: O(n log n).
Требуется O(n) дополнительной памяти.

● сортировка Шелла - сложность алгоритма: ; попытка улучшить


сортировку вставками.
● быстрая сортировка - в варианте с минимальными затратами памяти —

сложность алгоритма: — среднее время, — худший случай;


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

Паттерны проектирования
https://habrahabr.ru/post/210288/

1. Abstract factory
порождающий шаблон проектирования, позволяющий изменять поведение
системы, варьируя создаваемыми объектами, при этом сохраняя интерфейсы. Он
позволяет создавать целые группы взаимосвязанных объектов, которые, будучи
созданными одной фабрикой, реализуют общее поведение. Шаблон реализуется
созданием абстрактного класса Factory, который представляет собой интерфейс для
создания компонентов системы (например, для оконного интерфейса он может создавать
окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.
Назначение - предоставляет интерфейс для создания семейств взаимосвязанных или
взаимозависимых объектов, не специфицирует их конкретных классов.
Плюсы:
● изолирует конкретные классы;
● упрощает замену семейств продуктов;
● гарантирует сочетаемость продуктов.
Минусы:
● сложно добавить поддержку нового вида продуктов.
Применимость:
● Система не должна зависеть от того, как создаются, компонуются и
представляются входящие в нее объекты.
● Входящие в семейство взаимосвязанные объекты должны использоваться
вместе и вам необходимо обеспечить выполнение этого ограничения.
● Система должна конфигурироваться одним из семейств составляющих ее
объектов.
● Требуется предоставить библиотеку объектов, раскрывая только их
интерфейсы, но не реализацию.

2. Factory method (also Virtual constructor)


порождающий шаблон проектирования, предоставляющий подклассам интерфейс
для создания экземпляров некоторого класса. В момент создания наследники могут
определить, какой класс создавать. Иными словами, Фабрика делегирует создание
объектов наследникам родительского класса. Это позволяет использовать в коде
программы не специфические классы, а манипулировать абстрактными объектами на
более высоком уровне.

Плюсы:

● позволяет сделать код создания объектов более универсальным, не


привязываясь к конкретным классам (ConcreteProduct), а оперируя лишь общим
интерфейсом (Product);
● позволяет установить связь между параллельными иерархиями классов.

Минусы:

● необходимость создавать наследника Creator для каждого нового типа продукта


(ConcreteProduct).
3. Adapter
структурный шаблон проектирования, предназначенный для организации
использования функций объекта, недоступного для модификации, через специально
созданный интерфейс.

4. Decorator (also Wrapper)


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

5. Proxy
структурный шаблон проектирования, который предоставляет объект, который
контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию
контейнера).
6. Bridge
структурный шаблон проектирования, используемый в проектировании
программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они
могли изменяться независимо». Шаблон bridge (от англ. — мост) использует
инкапсуляцию, агрегирование и может использовать наследование для того, чтобы
разделить ответственность между классами.

7.Facade
структурный шаблон проектирования, позволяющий скрыть сложность системы
путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их
соответствующим объектам системы.

8.Command
поведенческий шаблон проектирования, используемый при
объектно-ориентированном программировании, представляющий действие. Объект
команды заключает в себе само действие и его параметры.
9. State
поведенческий шаблон проектирования. Используется в тех случаях, когда во
время выполнения программы объект должен менять свое поведение в зависимости от
своего состояния.

10. Strategy
поведенческий шаблон проектирования, предназначенный для определения
семейства алгоритмов, инкапсуляции каждого из них и обеспечения их
взаимозаменяемости. Это позволяет выбирать алгоритм путем определения
соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм
независимо от объектов-клиентов, которые его используют.

11. Chain of responsibility


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

12. Observer
поведенческий шаблон проектирования. Также известен как «подчинённые»
(Dependents), «издатель-подписчик» (Publisher-Subscriber). Создает механизм у класса,
который позволяет получать оповещения от других классов об изменении их состояния,
тем самым наблюдая за ними

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

14. Visitor
поведенческий шаблон проектирования, описывающий операцию, которая
выполняется над объектами других классов. Назначение - не изменяя основного класса,
добавить в него новые операции.

15. Template method


поведенческий шаблон проектирования, определяющий основу алгоритма и
позволяющий наследникам переопределять некоторые шаги алгоритма, не изменяя его
структуру в целом
16. Builder
oтделяет конструирование сложного объекта от его представления, так что в
результате одного и того же процесса конструирования могут получаться разные
представления.
17. Различия шаблонов:
● Адаптер обеспечивает отличающийся интерфейс к объекту.
● Прокси обеспечивает тот же самый интерфейс.
● Декоратор обеспечивает расширенный интерфейс.

Отличие адаптера от фасада:

● адаптер приводит один класс к другому


● фасад приводит всю систему к интерфейсу одного класса

18. Типы шаблонов проектирования


● Порождающие паттерны, предназначенные для создания новых объектов в
системе.
● Структурные паттерны, решающие задачи компоновки системы на основе классов
и объектов.
● Паттерны поведения, предназначенные для распределения обязанностей между
объектами в системе.

Build tools (Maven, ant)

1. Maven dependency scopes.


● compile: This dependency is needed for compilation of the main source
● test: This dependency is needed for compiling and running tests. It is not needed for
compiling the main source or running the final artifact.
● runtime: This dependency is needed for running the final artifact. It is not needed for
compiling the main source or compiling or running the tests.
● provided: This dependency is needed for compiling and/or running the artifact but is
not necessary to include in the package, because it is provided by the runtime
environment - for example, jsp-api.jar is provided by your web application container, so
you don't include it in your WEB-INF/lib (for the example of a webapp); or a plugin or
optional package that is a prerequisite for your application, but is not bundled with your
application.
● system: This dependency is required in some phase of your project's lifecycle, but is
system-specific. Use of this scope is discouraged: This is considered an "advanced" kind
of feature and should only be used when you truly understand all the ramifications of its
use, which can be extremely hard if not actually impossible to quantify. This scope by
definition renders your build non-portable. It may be necessarry in certain edge cases.
The system scope includes the <systemPath> element which points to the physical
location of this dependency on the local machine. It is thus used to refer to some artifact
expected to be present on the given local machine an not in a repository; and whose
path may vary machine-to-machine. The systemPath element can refer to environment
variables in its path: ${JAVA_HOME} for instance.
● tag <optional />

2. Maven profiles.
Мавен изначально создавался принимая во внимание портируемость. Но,
довольно часто, приложение приходится запускать в разном окружении: например для
разработки используется одна база данных, в рабочем сервере используется другая. при
этом могут понадобиться разные настройки, разные зависимости и плагины. Для этих
целей в maven используются профайлы.
Давайте определим два профайла: один для разработки, другой для
производственного сервера. Для разработки вполне подойдёт база hsqldb которая хранит
все данные в памяти. На производственном сервере же используется база данных
postgres которая сохраняет все данные на диск. В профайлах для каждой конфигурации
определены свои проперти database.url и зависимости для разных jdbc драйверов.

3. Что же такое dependency и для чего они нужны (MAVEN)?

Dependency – это зависимости от библиотек, а если точней, то это и есть библиотека,


которую вы бы хотели подключить к проекту.

Рассмотрим на базовом шаблоне:

<project>
<modelVersion>4.0.0</modelVersion>

<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>

<!-- зависимости от библиотек -->


<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
</dependencies>

</project>
В выше приведенном примере я продемонстрировал подключение библиотеки JUnit 4.11 к
проекту, теперь при сборке проекта эта библиотека упакуется в мой *.jar или *.war архив, а
также теперь мы в наших классах можем обращаться к объектам библиотеки JUnit.

<dependencies> – тут мы размещаем список dependency (библиотек), которые


используются в проекте;

<dependency> – библиотека используемая проектом;

<groupId> – идентификатор группы библиотеки;

<artifactId> – артефакт (библиотека);

<version> – версия библиотеки;

<scope> – этап использования.

4. Жизненный цикл проекта (MAVEN)


Жизненный цикл проекта — это список поименованных фаз, определяющий
порядок действий при его построении.

Maven использует по умолчанию следующий жизненный цикл:

1) archetype – создание темплейта и обработка ресурсов. На этой фазе


разрешаются и, при необходимости, скачиваются из интернета зависимости;

2) compile – компиляция;

3) обработка тестовых ресурсов (например — скачивается из интернета


JUnit-пакет);

4) компиляция тестов (тестирующие классы не передаются конечным


пользователям);
5) test – тестирование;

6) package – упаковка (обычно речь идёт о создании JAR– или WAR-файла);

7) install – инсталляция проекта в локальном Maven-репозитории (теперь он


доступен как модуль для других локальных проектов);

8) deploy – инсталляция в удаленном Maven-репозитории (теперь стабильная


версия проекта доступна широкому кругу разработчиков).

Maven имеет также стандартный жизненный цикл для чистки (cleaning) и для
генерации его страницы (site). Если бы ‘clean’ было частью обычного жизненного
цикла, проект подвергался бы чистке при каждом построении, что нежелательно.

Стандартные жизненные циклы могут быть существенно дополнены


Maven-плагинами и Maven-архетипами.

Maven-плагины позволяют вставлять в стандартный цикл новые шаги (например,


распределение на сервер приложений) или расширять существующие шаги.
Maven-архетипы представляют собой заготовки для различнейших программных
пакетов (если они отвечают стандартам Maven-структуры).

---------------

Authentication vs authoriztrion
Who controls transactions in hibernate
Controling Transactions for several databases and different services (hibernate)
Spring post construct a -> b -> c in chaing how to
Are scopes thread-safe? Which one (Spring)
Hibernate lifecycle
Spring component vs service vs controller
Hibernate - how to work with database? Hql, criteria etc

Отличия процесса от потока в джаве


Как индексы влияют на удаление и прочие операции в бд

Statefull, stateless http, ftp and other protocols are full/less


Immutable if fields are not final will this also be immutable
View can we insert, update, delete
Spring AOP dynamic proxy vs cglib
Blocking queue
Что такое функциональный интерфейс
Что такое байт-код, что внутри *.class - opcode, compilation
Размер int на 32 и 64 битных машинах)
Потеря точности чисел при приведении типов (диаграмам приведения типов нагуглить )
Java generics
CopyOnWrite -logic inside and examples of concurrent collections
Wait Notify
Для чего нужен Object
Разница db sessions vs hibernate session
Взять элемент по индексу в массиве [харда]
Основные принципы реста

Difference between autowired, inject, resource


{} - invoke, order of init of java class[constr, fields]
Hibernate map set,list why not array
Collections O(n) etc
io vs nio
Dynamic db configs (main and replica) change 1 on another
Difference between service, repository, component
Java 8 streams - подробнее
Permgen, changes in jdk8
Reverse single linked list - java
G1, Compact Strings, VarHandles
Какие gc вы знаете, разница

1. Цепочка http-запроса
2. Map object inside object hibernate
3. Web tests ,mvc
4. https in jee
5. Зачем придумали NoSql и разица с sql
6. Конструкторы, наследование их
7. масштабируемость
8. потокобезопасность сессии и сервлетов
9. реализация threadPool, как там перезапускаются(переиспользуются) потоки
10. Примеры паттернов проектирования в java
11. Сколько классов можно унаследовать друг от друга (или сколько рекомендованый
максимум)
12. serialization readResolve/write
13. gradleе
14. groovy
15. Приспособленец
16. Spring singleton [difference with GoF]
17. JMS topic vs queue
18. jdk8
18.1. lambda a
18.2. streams
18.3. Optional
18.4. interface’s default and static methods
18.5. method references
18.6. @Repeteable
18.7. Better type inference
18.8. extended annotation support
18.9. ParameterNames
18.10. Data/Time API
18.11. JS api
18.12. parallelSort()
18.13. Concurrency
19. References and their difference
20. Составной ключ в hibernate
21. jmx
22. java memory model
23. ThreadLocal
24. Agile
24.1. Kanban
25. DB
25.1. replication
25.2. triggers
25.3. stored procedures
25.4. Connection management
25.5. Batch
25.6. Fetch size
26. Красно-черное дерево подробно
27. Classloaders java
28. Singleton spring and usual lifecycle
29. 2 ways to create aspects
30. Servlets 2 requests in a row
31. Spring integration
31.1. Inside of it

1. Basics of Spring Framework


1.1. Introduction to Spring Framework
1.1.1. General
1.1.2. Conditions for Spring Framework creating
1.1.3. Spring possibilities usage
1.1.4. Versions, differences, support of the different JDK versions
1.1.5. Framework Architecture
1.1.6. Modules
1.1.7. Managed and Non-managed environment
1.2. Components model of the Spring
1.2.1. IoC and DI concept, Design to Interface
1.2.1.1. Problems and advantages
1.2.1.2. Service Locator vs Dependency Injection
1.2.1.3. IoC-container structure
1.2.2. Beans
1.2.2.1. IoC-container
1.2.2.2. BeanFactory
1.2.2.3. POJO, Bean Naming
1.2.2.4. Components declaration
1.2.2.5. Injections (setter, constructor)
1.2.2.6. Autowiring
1.2.2.7. Bean Scope
1.2.2.8. Properties, PropertyEditor
1.2.2.9. Components lifecycle
1.2.2.10. Init, destroy
1.2.2.11. Lifecycle interfaces
1.2.3. ApplicationContext
1.2.4. Spring’s events
1.2.5. Exercise: simple application development
2. Spring AOP
2.1. Basics
2.2. Advices
2.3. Spring’s AOP features
2.4. Example of AspectJ style
2.4.1. Advice’s parameters
2.4.2. Poincut’s descriptions
2.5. Exercise: AspectJ style
3. Data access
3.1. JNDI
3.2. DAO
3.3. JDBC support in Spring
3.3.1. JdbcTemplate
3.3.2. Spring for data access – advantages
3.3.3. Exercise: JDBC – bases application in conjunction with Spring for data access.
3.4. Spring ORM
3.4.1. Basics and architecture
3.4.2. JPA ( Hibernate asJPA provider )
3.4.3. Exercise: ORM based application in conjunction with Spring for data access
3.5. Spring Transactions
3.5.1. Basics and architecture
3.5.2. Transactions definitions, isolations, propagation
3.5.3. Programmatic style
3.5.4. Declarative style
3.5.5. Programmatic style vs. Declarative style
3.5.6. Exercise: Tx – declarative style application
4. Spring MVC
4.1. MVC template
4.2. Introduction to Spring Web MVC
4.3. Controllers
4.4. Views
4.5. L10n / i18n
4.6. Themes
4.7. Multipart
4.8. Convention over configuration
4.9. Annotations
4.10. Exercise: Simple MVC based application with i18n, and themes
5. Spring – Integration with EE *
5.1. Job scheduling
5.2. Using Spring with JMS
5.3. Using Spring with EJB

Вам также может понравиться