Java Questions
Java Questions
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
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
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). Применение иерархии классов делает управляемыми большие потоки
информации.
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
Три метода выводят сообщения обо всех методах, встретившихся по пути "полета"
исключения:
- printstackTrace() - выводит сообщения в стандартный вывод, как правило, это консоль;
- printStackTrace(PrintStream stream) - выводит сообщения в байтовый поток stream;
- printStackTrace(PrintWriter stream) - выводит сообщения в символьный поток stream.
9. Автоупаковка (autoboxing)
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.
16.Сериализация
процесс перевода какой-либо структуры данных в последовательность битов.
Обратной к операции сериализации является операция десериализации (структуризации)
— восстановление начального состояния структуры данных из битовой
последовательности.
Сериализация используется для передачи объектов по сети и для сохранения их в
файлы. Например, нужно создать распределённое приложение, разные части которого
должны обмениваться данными со сложной структурой. В таком случае для типов данных,
которые предполагается передавать, пишется код, который осуществляет сериализацию и
десериализацию. Объект заполняется нужными данными, затем вызывается код
сериализации, в результате получается, например,XML-документ.
Маршалинг, по смыслу похож на сериализацию, в информатике — процесс
преобразования представления объекта в памяти в формат данных, пригодный для
хранения или передачи. Обычно применяется, когда данные необходимо передавать
между различными частями одной программы или от одной программы к другой.
17.XML парсеры.
SAX парсер читает xml документ и реагирует на появившиеся события, при этом в
отличии от DOM он не сохраняет документ в памяти. DOM парсер сохраняет дерево
документа в памяти и позволяет работать с ним. SAX очень полезен, когда документ
достаточно большой.
DOM читает всю XML-структуру и сохраняет дерево объектов в памяти. Это
требует гораздо больше ресурсов процессора и объёмов памяти. По этой причине SAX
API является предпочтительными для серверных приложений и фильтров данных,
которым не требуют большой объем памяти для представления данных.
18.ConcurrentModificationException.
ConcurrentModificationException не всегда является следствием неверной
синхронизации работы с коллекциями. ConcurrentModificationException возникает при
изменении коллекции любыми средствами, отличными от итератора, при проходе по
коллекции с помощью итератора. Изменение такое, как продемонстрировано выше может
происходить и в одно-тредной среде. Не лишне также добавить, что исключение может
возникать не только при удалении, но и при добавлении элемента, а также что
модификация контейнера может возникать и в многотредной среде.
19.Принципы SOLID.
Single responsibility principle Принцип единственной обязанности
На каждый класс должна быть возложена одна-единственная обязанность.
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 и после выполнения этой операции.
тут мы говорим, аннотацию можно использовать только для параметров метода и для
локальных переменных.
как вы видите на месте где обычно пишут class или interface у нас написано @interface.
Структура практически та же, что и у интерфейсов, только пишется @interface.
- @interface - указывает на то, что это аннотация
- default - говорит про то, что метод по умолчанию будет возвращать определённое значение.
Аннотация готова теперь ею можно пользоваться, также аннотацию можно сконфигурировать.
Последний пункт надо понимать как то, что допустимы только одномерные массивы.
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() использовать ==.
10. Как правильно сравнить значения строк двух различных объектов типа
String и StringBuffer?
Привести их к одному типу и сравнить.
JAVA8
1. Что такое StringJoiner?
StringJoiner используется, чтобы создать последовательность символов, разделенных
разделителем, может (но это не обязательно) начинаться с префикса и заканчиваться
суффиксом. Пример:
34. Как получить вторую субботу текущего месяца используя time API?
Следующий код демонстрирует это.
Concurrency
1. Deadlock
Предположим, что один поток уже захватил монитор на некотором объекте x и для
продолжения работы ему нужно захватить монитор на объекте y. В другом же потоке
ситуация ровно обратная – он уже захватил монитор на объекте y и ему нужен монитор
объекта x. В результате оба потока будут ждать, пока нужный монитор освободится. Как
вы сами прекрасно понимаете, ждать они будут до бесконечности. Эта ситуация и
называется взаимной блокировкой – deadlock.
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.
10.Deamon threads.
Такие потоки иногда ещё называются “службами”, которые обычно запускаются с
наименьшим приоритетом и обеспечивают основные услуги для программы или
программ, когда деятельность компьютера понижается. Примером такого потока может
служить сборщик мусора. Этот поток, предусмотрен JVM, сканирует программы на
наличие переменных, к которым больше никогда не придется обращаться, и освобождает
их ресурсы, возвращая их системе. Поток может стать daemon потоком, передав булево
значение true в метод setDaemon(). Если принято значение false, то поток становится
обычным пользовательским потоком. Тем не менее, это необходимо сделать до того как
поток запустится.
2. Joins
http://www.sitepoint.com/understanding-sql-joins-mysql-database/
2.2. Что такое LEFT JOIN, RIGHT JOIN? Чем они отличаются?
Проиллюстрируем каждый тип примерами. Модель данных:
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
● 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.
13. Представление
это заранее определенный запрос, результаты выполнения которого сохранены в
базе данных, имеют вид обычной таблицы и проявляющие себя подобно таблице, но не
требующие дополнительного места для хранения.
Следствия
С точки зрения теоремы 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-команд:
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;
}
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/
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 в том, что эта модель позволяет отделить объекты от
реализации механизмов, которые он использует. В результате мы получаем большую
гибкость как при разработке приложений, так и при их тестировании.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class
>
</listener>
Для того, чтобы 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>
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..
14. @Repeteable
@Repeatable - возможность использовать одну и ту же аннотацию несколько раз в
одном месте (from Spring 4.0), example - @Scheduled
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
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.
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
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
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 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. Виды тестирования.
По объекту тестирования:
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.
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, который представляет собой интерфейс для
создания компонентов системы (например, для оконного интерфейса он может создавать
окна и кнопки). Затем пишутся классы, реализующие этот интерфейс.
Назначение - предоставляет интерфейс для создания семейств взаимосвязанных или
взаимозависимых объектов, не специфицирует их конкретных классов.
Плюсы:
● изолирует конкретные классы;
● упрощает замену семейств продуктов;
● гарантирует сочетаемость продуктов.
Минусы:
● сложно добавить поддержку нового вида продуктов.
Применимость:
● Система не должна зависеть от того, как создаются, компонуются и
представляются входящие в нее объекты.
● Входящие в семейство взаимосвязанные объекты должны использоваться
вместе и вам необходимо обеспечить выполнение этого ограничения.
● Система должна конфигурироваться одним из семейств составляющих ее
объектов.
● Требуется предоставить библиотеку объектов, раскрывая только их
интерфейсы, но не реализацию.
Плюсы:
Минусы:
5. Proxy
структурный шаблон проектирования, который предоставляет объект, который
контролирует доступ к другому объекту, перехватывая все вызовы (выполняет функцию
контейнера).
6. Bridge
структурный шаблон проектирования, используемый в проектировании
программного обеспечения чтобы «разделять абстракцию и реализацию так, чтобы они
могли изменяться независимо». Шаблон bridge (от англ. — мост) использует
инкапсуляцию, агрегирование и может использовать наследование для того, чтобы
разделить ответственность между классами.
7.Facade
структурный шаблон проектирования, позволяющий скрыть сложность системы
путем сведения всех возможных внешних вызовов к одному объекту, делегирующему их
соответствующим объектам системы.
8.Command
поведенческий шаблон проектирования, используемый при
объектно-ориентированном программировании, представляющий действие. Объект
команды заключает в себе само действие и его параметры.
9. State
поведенческий шаблон проектирования. Используется в тех случаях, когда во
время выполнения программы объект должен менять свое поведение в зависимости от
своего состояния.
10. Strategy
поведенческий шаблон проектирования, предназначенный для определения
семейства алгоритмов, инкапсуляции каждого из них и обеспечения их
взаимозаменяемости. Это позволяет выбирать алгоритм путем определения
соответствующего класса. Шаблон Strategy позволяет менять выбранный алгоритм
независимо от объектов-клиентов, которые его используют.
12. Observer
поведенческий шаблон проектирования. Также известен как «подчинённые»
(Dependents), «издатель-подписчик» (Publisher-Subscriber). Создает механизм у класса,
который позволяет получать оповещения от других классов об изменении их состояния,
тем самым наблюдая за ними
13. Wrapper
структурный шаблон проектирования, предназначенный для организации
использования функций объекта, недоступного для модификации, через специально
созданный интерфейс.
14. Visitor
поведенческий шаблон проектирования, описывающий операцию, которая
выполняется над объектами других классов. Назначение - не изменяя основного класса,
добавить в него новые операции.
2. Maven profiles.
Мавен изначально создавался принимая во внимание портируемость. Но,
довольно часто, приложение приходится запускать в разном окружении: например для
разработки используется одна база данных, в рабочем сервере используется другая. при
этом могут понадобиться разные настройки, разные зависимости и плагины. Для этих
целей в maven используются профайлы.
Давайте определим два профайла: один для разработки, другой для
производственного сервера. Для разработки вполне подойдёт база hsqldb которая хранит
все данные в памяти. На производственном сервере же используется база данных
postgres которая сохраняет все данные на диск. В профайлах для каждой конфигурации
определены свои проперти database.url и зависимости для разных jdbc драйверов.
<project>
<modelVersion>4.0.0</modelVersion>
<groupId>com.mycompany.app</groupId>
<artifactId>my-app</artifactId>
<version>1.0</version>
</project>
В выше приведенном примере я продемонстрировал подключение библиотеки JUnit 4.11 к
проекту, теперь при сборке проекта эта библиотека упакуется в мой *.jar или *.war архив, а
также теперь мы в наших классах можем обращаться к объектам библиотеки JUnit.
2) compile – компиляция;
Maven имеет также стандартный жизненный цикл для чистки (cleaning) и для
генерации его страницы (site). Если бы ‘clean’ было частью обычного жизненного
цикла, проект подвергался бы чистке при каждом построении, что нежелательно.
---------------
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
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