├── mcon.bat
├── mcon.sh
├── done.png
├── con4md.jar
├── .gitignore
├── examples
├── src
│ └── main
│ │ ├── java
│ │ └── xyz
│ │ │ └── enhorse
│ │ │ └── example
│ │ │ ├── Application.java
│ │ │ ├── oop
│ │ │ └── PolymorphicTicTock.java
│ │ │ └── concurrency
│ │ │ ├── VolatileBehaviour.java
│ │ │ └── WaitNotify.java
│ │ └── resources
│ │ ├── log4j.properties
│ │ └── google_checkstyle.xml
├── README.md
├── LICENSE
└── pom.xml
├── test.md
├── log.md
├── css.md
├── uml.md
├── serialization.md
├── html.md
├── xml.md
├── patterns.md
├── jdbc.md
├── jvm.md
├── web.md
├── db.md
├── io.md
└── sql.md
/mcon.bat:
--------------------------------------------------------------------------------
1 | @java -jar con4md.jar --marker="##" %*
--------------------------------------------------------------------------------
/mcon.sh:
--------------------------------------------------------------------------------
1 | java -jar con4md.jar --marker="##" $@
2 |
--------------------------------------------------------------------------------
/done.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VictoriaDemidova/java-interview/HEAD/done.png
--------------------------------------------------------------------------------
/con4md.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/VictoriaDemidova/java-interview/HEAD/con4md.jar
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # IntelliJ
2 | *.iml
3 | out/
4 | .idea/
5 |
6 | # System specific
7 | .DS_Store
8 |
9 | # Maven
10 | target/
--------------------------------------------------------------------------------
/examples/src/main/java/xyz/enhorse/example/Application.java:
--------------------------------------------------------------------------------
1 | package xyz.enhorse.example;
2 |
3 | public class Application {
4 |
5 | public static void main(String[] args) {
6 | System.out.println("Examples for Java Developer interview preparation materials!");
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/examples/src/main/resources/log4j.properties:
--------------------------------------------------------------------------------
1 | log4j.debug=false
2 | log4j.rootLogger=INFO, CONSOLE
3 | log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
4 | log4j.appender.CONSOLE.encoding=UTF-8
5 | log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
6 | log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%-5p][%-16.16t][%32.32c] - %m%n
7 | log4j.logger.xyz.enhorse=INFO
--------------------------------------------------------------------------------
/examples/README.md:
--------------------------------------------------------------------------------
1 | # Learning Java
2 | 1. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/javarush) for the course from [Java Rush](http://javarush.ru/)
3 | 2. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/m101j) for the course [M101J: MongoDB for Java Developers](https://university.mongodb.com/courses/M101J/about)
4 | 3. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/algo) for the course [Алгоритмы: теория и практика. Методы](https://stepic.org/course/217)
5 | 4. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/djwebservice) for the course [Разработка веб сервиса на Java (часть 1)](https://stepic.org/course/146)
6 | 5. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/hadoop) for the course [Hadoop. Система для обработки больших объемов данных](https://stepic.org/course/150)
--------------------------------------------------------------------------------
/examples/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2016 Pavel Kalinin
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/examples/src/main/java/xyz/enhorse/example/oop/PolymorphicTicTock.java:
--------------------------------------------------------------------------------
1 | package xyz.enhorse.example.oop;
2 |
3 | /**
4 | * @author Pavel Kalinin
5 | * 21.10.2016
6 | */
7 | public class PolymorphicTicTock {
8 |
9 | public static void main(String[] args) {
10 | final int times = 10;
11 |
12 | Commander commander = new Commander(TickTock.TICK);
13 | commander.run(times);
14 | }
15 |
16 |
17 | private enum TickTock {
18 | TICK("tick") {
19 | @Override
20 | TickTock opposite() {
21 | return TOCK;
22 | }
23 | },
24 | TOCK("tock") {
25 | @Override
26 | TickTock opposite() {
27 | return TICK;
28 | }
29 | };
30 |
31 | private String content;
32 |
33 |
34 | TickTock(final String content) {
35 | this.content = content;
36 | }
37 |
38 |
39 | void say() {
40 | System.out.println(content);
41 | }
42 |
43 |
44 | abstract TickTock opposite();
45 | }
46 |
47 | private static class Commander {
48 |
49 | private TickTock current;
50 |
51 |
52 | Commander(final TickTock current) {
53 | this.current = current;
54 | }
55 |
56 |
57 | void once() {
58 | current.say();
59 | current = current.opposite();
60 | }
61 |
62 |
63 | void run(final int times) {
64 | for (int i = 0; i < (times * 2); i++) {
65 | once();
66 | }
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/examples/src/main/java/xyz/enhorse/example/concurrency/VolatileBehaviour.java:
--------------------------------------------------------------------------------
1 | package xyz.enhorse.example.concurrency;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 |
6 | /**
7 | * @author enhorse
8 | * 17.01.2017
9 | */
10 | public class VolatileBehaviour {
11 |
12 | private static final Logger LOGGER = LoggerFactory.getLogger(VolatileBehaviour.class);
13 |
14 | //private static long MY_INT = 0;
15 | private static volatile long MY_INT = 0;
16 |
17 |
18 | public static void main(String[] args) {
19 | new ChangeListener().start();
20 | new ChangeMaker().start();
21 | }
22 |
23 |
24 | static class ChangeListener extends Thread {
25 |
26 | @Override
27 | public void run() {
28 | long local_value = MY_INT;
29 | while (local_value < 5) {
30 | if (local_value != MY_INT) {
31 | LOGGER.info("Got Change for MY_INT : " + MY_INT);
32 | local_value = MY_INT;
33 | }
34 | }
35 | }
36 | }
37 |
38 | static class ChangeMaker extends Thread {
39 |
40 | @Override
41 | public void run() {
42 |
43 | long local_value = MY_INT;
44 | while (MY_INT < 5) {
45 | LOGGER.info("Incrementing MY_INT to " + (local_value + 1));
46 | MY_INT = ++local_value;
47 | try {
48 | Thread.sleep(500);
49 | } catch (InterruptedException e) {
50 | e.printStackTrace();
51 | }
52 | }
53 | }
54 | }
55 |
56 | }
57 |
--------------------------------------------------------------------------------
/examples/src/main/java/xyz/enhorse/example/concurrency/WaitNotify.java:
--------------------------------------------------------------------------------
1 | package xyz.enhorse.example.concurrency;
2 |
3 | /**
4 | * @author Pavel Kalinin
5 | * 21.10.2016
6 | */
7 | public class WaitNotify {
8 |
9 | private static final Object lock = new Object();
10 | private static volatile boolean isTick = true;
11 |
12 |
13 | public static void main(String[] args) {
14 | int concurrency = 333;
15 |
16 | for (int i = 0; i < concurrency; i++) {
17 | new Tick(i).start();
18 | }
19 |
20 | for (int i = 0; i < concurrency; i++) {
21 | new Tock(i).start();
22 | }
23 | }
24 |
25 |
26 | private static class Tick extends Thread {
27 |
28 | private final int number;
29 |
30 |
31 | Tick(int number) {
32 | this.number = number;
33 | }
34 |
35 |
36 | @Override
37 | public void run() {
38 | synchronized (lock) { //use monitor of lock
39 | try {
40 | while (!isTick) {
41 | lock.wait(); //wait for our turn
42 | }
43 | System.out.printf("Tick[%03d]\n", number);
44 | isTick = false;
45 | lock.notifyAll(); //tell about that we made our job
46 | } catch (InterruptedException e) {
47 | e.printStackTrace();
48 | }
49 | }
50 | }
51 | }
52 |
53 | private static class Tock extends Thread {
54 |
55 | private final int number;
56 |
57 |
58 | Tock(int number) {
59 | this.number = number;
60 | }
61 |
62 |
63 | @Override
64 | public void run() {
65 | synchronized (lock) {
66 | try {
67 | while (isTick) {
68 | lock.wait();
69 | }
70 | System.out.printf(" Tock[%03d]\n", number);
71 | isTick = true;
72 | lock.notifyAll();
73 | } catch (InterruptedException e) {
74 | e.printStackTrace();
75 | }
76 | }
77 | }
78 | }
79 | }
80 |
--------------------------------------------------------------------------------
/examples/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 4.0.0
6 |
7 | xyz.enhorse
8 | example
9 | 1.0-SNAPSHOT
10 |
11 | jar
12 |
13 |
14 | xyz.enhorse.example.Application
15 |
16 | 1.8
17 | UTF-8
18 | UTF-8
19 |
20 | 3.6.0
21 | 3.0.0
22 | 2.17
23 | 2.5
24 | 1.5.0
25 |
26 | false
27 | src/main/resources/google_checkstyle.xml
28 |
29 | 4.12
30 | 2.5.0
31 | 1.7.22
32 |
33 |
34 |
35 | Examples
36 |
37 |
38 | Examples for Java Developer interview preparation materials
39 |
40 | https://github.com/enhorse/
41 |
42 |
43 |
44 | Pavel Kalinin
45 | go2amd@gmail.com
46 | fairy stable
47 | https://enhorse.xyz
48 |
49 | build maintainer
50 | release manager
51 |
52 |
53 |
54 |
55 |
56 |
57 | MIT License
58 | LICENSE
59 | repo
60 |
61 |
62 |
63 |
64 |
65 |
66 | org.slf4j
67 | slf4j-log4j12
68 | ${log4j.version}
69 |
70 |
71 |
72 | junit
73 | junit
74 | ${junit.version}
75 | test
76 |
77 |
78 | org.mockito
79 | mockito-core
80 | ${mockito.version}
81 | test
82 |
83 |
84 |
85 |
86 |
87 |
88 | org.apache.maven.plugins
89 | maven-compiler-plugin
90 | ${maven.compiler.version}
91 |
92 | ${java.version}
93 | ${java.version}
94 |
95 |
96 |
97 | org.apache.maven.plugins
98 | maven-assembly-plugin
99 | ${maven.assembly.version}
100 |
101 |
102 | jar-with-dependencies
103 |
104 |
105 |
106 | ${start-class}
107 |
108 |
109 |
110 |
111 |
112 | package
113 |
114 | single
115 |
116 |
117 |
118 |
119 |
120 | org.apache.maven.plugins
121 | maven-checkstyle-plugin
122 | ${maven.checkstyle.version}
123 |
124 | true
125 |
126 |
127 |
128 | checkstyle
129 | validate
130 |
131 | check
132 |
133 |
134 | ${checkstyle.config}
135 | true
136 | true
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 | org.apache.maven.plugins
148 | maven-jxr-plugin
149 | ${maven.jxr.version}
150 |
151 |
152 |
153 |
154 |
--------------------------------------------------------------------------------
/test.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # Тестирование
4 | + [Что такое _«модульное тестирование»_?](#Что-такое-модульное-тестирование)
5 | + [Что такое _«интеграционное тестирование»_?](#Что-такое-интеграционное-тестирование)
6 | + [Чем интеграционное тестирование отличается от модульного?](#Чем-интеграционное-тестирование-отличается-от-модульного)
7 | + [Какие существуют виды тестовых объектов?](#Какие-существуют-виды-тестовых-объектов)
8 | + [Чем _stub_ отличается от _mock_?](#Чем-stub-отличается-от-mock)
9 | + [Что такое _«фикстуры»_?](#Что-такое-фикстуры)
10 | + [Какие аннотации фикстур существуют в JUnit?](#Какие-аннотации-фикстур-существуют-в-junit)
11 | + [Для чего в JUnit используется аннотация `@Ignore`?](#Для-чего-в-junit-используется-аннотация-ignore)
12 |
13 | ## Что такое _«модульное тестирование»_?
14 | __Модульное/компонентное тестирование (unit testing)__ - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
15 |
16 | Модульные тесты можно условно поделить на две группы:
17 |
18 | + _тесты состояния (state based)_, проверяющие что вызываемый метод объекта отработал корректно, проверяя состояние тестируемого объекта после вызова метода.
19 |
20 | + _тесты взаимодействия (interaction tests)_, в которых тестируемый объект производит манипуляции с другими объектами. Применяются, когда требуется удостовериться, что тестируемый объект корректно взаимодействует с другими объектами.
21 |
22 | [к оглавлению](#Тестирование)
23 |
24 | ## Что такое _«интеграционное тестирование»_?
25 | __Интеграционное тестирование (integration testing)__ — это тестирование, проверяющие работоспособность двух или более модулей системы в совокупности — то есть нескольких объектов как единого блока. В тестах взаимодействия же тестируется конкретный, определенный объект и то, как именно он взаимодействует с внешними зависимостями.
26 |
27 | [к оглавлению](#Тестирование)
28 |
29 | ## Чем интеграционное тестирование отличается от модульного?
30 | С технологической точки зрения интеграционное тестирование является количественным развитием модульного, поскольку так же, как и модульное тестирование, оперирует интерфейсами модулей и подсистем и требует создания тестового окружения, включая заглушки на месте отсутствующих модулей. Основная разница между модульным и интеграционным тестированием состоит в целях, то есть в типах обнаруживаемых дефектов, которые, в свою очередь, определяют стратегию выбора входных данных и методов анализа.
31 |
32 | > Допустим, есть класс, который при определенных условиях взаимодействует с web-сервисом через зависимый объект. И нам надо проверить, что определенный метод зависимого объекта действительно вызывается. Если в качестве зависимого класса передать:
33 |
34 | > + реальный класс, работающий с web-сервисом, то это будет интеграционное тестирование.
35 |
36 | > + заглушку, то это будет тестирование состояния.
37 |
38 | > + шпиона, а в конце теста проверить, что определенный метод зависимого объекта действительно был вызван, то это будет тест взаимодействия.
39 |
40 | [к оглавлению](#Тестирование)
41 |
42 | ## Какие существуют виды тестовых объектов?
43 | __пустышка (dummy)__ - объект, который обычно передается в тестируемый класс в качестве параметра, но не имеет поведения: с ним ничего не происходит и никакие его методы не вызываются.
44 |
45 | > Примером dummy-объектов являются new object(), null, «Ignored String» и т.д.
46 |
47 | __фальшивка (fake object)__ применяется в основном для ускорения запуска ресурсоёмких тестов и является заменой тяжеловесного внешнего зависимого объекта его легковесной реализацией.
48 |
49 | > Основные примеры — эмулятор базы данных (fake database) или фальшивый web-сервис.
50 |
51 | __заглушка (test stub)__ используется для получения данных из внешней зависимости, подменяя её. При этом заглушка игнорирует все данные поступающие из тестируемого объекта, возвращая заранее определённый результат.
52 |
53 | > Тестируемый объект использует чтение из конфигурационного файла? Тогда передаем ему заглушку `ConfigFileStub` возвращающую тестовые строки конфигурации без обращения к файловой системе.
54 |
55 | __шпион (test spy)__ - разновидность заглушки, которая умеет протоколировать сделанные к ней обращения из тестируемой системы, чтобы проверить их правильность в конце теста. При этом фиксируется количество, состав и содержание параметров вызовов.
56 |
57 | > Если существует необходимость проверки, что определённый метод тестируемого класса вызывался ровно 1 раз, то шпион - имменно то, что нам нужно.
58 |
59 | __фикция (mock object)__ похож на _шпиона_, но обладает расширенной функциональностью, заранее заданными поведением и реакцией на вызовы.
60 |
61 | [к оглавлению](#Тестирование)
62 |
63 | ## Чем _stub_ отличается от _mock_?
64 | _stub_ используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.
65 |
66 | _mock_ использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.
67 |
68 | [к оглавлению](#Тестирование)
69 |
70 | ## Что такое _«фикстуры»_?
71 | __Фикстуры (fixtures)__ - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования.
72 |
73 | [к оглавлению](#Тестирование)
74 |
75 | ## Какие аннотации фикстур существуют в JUnit?
76 |
77 | + `@BeforeClass` - определяет код, который должен единожды выполниться перед запуском набора тестовых методов.
78 | + `@AfterClass` - код, выполняемый один раз после исполнения набора тестовых методов.
79 | + `@Before` - определяет код, который должен выполняться каждый раз перд запуском любого тестовым методом.
80 | + `@After` - код, выполняемый каждый раз после исполнения любого тестового метода.
81 |
82 | [к оглавлению](#Тестирование)
83 |
84 | ## Для чего в JUnit используется аннотация `@Ignore`?
85 | `@Ignore` указывает JUnit на необходимость пропустить данный тестовый метод.
86 |
87 | [к оглавлению](#Тестирование)
88 |
89 | # Источники
90 | + [Википедия](https://ru.wikipedia.org/wiki/Тестирование_программного_обеспечения)
91 | + [Хабрахабр](https://habrahabr.ru/post/116372/)
92 | + [Интуит](http://www.intuit.ru/department/se/testing/5/2.html)
93 |
94 | [Вопросы для собеседования](README.md)
95 |
--------------------------------------------------------------------------------
/log.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # Журналирование
4 | + [Какие существуют типы логов?](#Какие-существуют-типы-логов)
5 | + [Из каких частей состоит система журналирования log4j?](#Из-каких-частей-состоит-система-журналирования-log4j)
6 | + [Что такое _Logger_ в log4j?](#Что-такое-logger-в-log4j)
7 | + [Что такое _Appender_ в log4j?](#Что-такое-appender-в-log4j)
8 | + [Что такое _Layout_ в log4j?](#Что-такое-layout-в-log4j)
9 | + [Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.](#Перечислите-уровни-журналирования-в-log4j-Назовите-порядок-их-приоритетности)
10 | + [Какие существуют способы конфигурирования log4j?](#Какие-существуют-способы-конфигурирования-log4j)
11 |
12 | ## Какие существуют типы логов?
13 | + системы (System);
14 | + безопасности (Security);
15 | + приложения (Application, Buisness).
16 |
17 | > Пользователь входит в приложение, проверяется пароль. Это действие относится к безопасности (Security). Дальше он запускает какой-нибудь модуль. Это событие уровня приложения (Application). Модуль при старте обращается к другому модулю за какими-то дополнительными данными, производит какие-либо еще вызовы – это уже системные действия (System).
18 |
19 | [к оглавлению](#Журналирование)
20 |
21 | ## Из каких частей состоит система журналирования log4j?
22 | Система журналирования состоит из трёх основных частей:
23 |
24 | + управляющей журналированием - __logger__;
25 | + добавляющей в журнал - __appender__;
26 | + определяющей формат добавления - __layout__.
27 |
28 | [к оглавлению](#Журналирование)
29 |
30 | ## Что такое _Logger_ в log4j?
31 | __Logger__ представляет собой объект класса `org.apache.log4j.Logger`, который используется как управляющий интерфейс для журналирования сообщений с возможностью задавать уровень детализации. Именно logger проверяет нужно ли обрабатывать сообщение и если журналирование необходимо, то сообщение передаётся в appender, если нет - система завершает обработку данного сообщения.
32 |
33 | [к оглавлению](#Журналирование)
34 |
35 | ## Что такое _Appender_ в log4j?
36 | __Appender__ - это именованный объект журнала событий, реализующий интерфейс `org.apache.log4j.Appender` и добавляющий события в журнал. Appender вызывает разные вспомогательные инструменты - компоновщик, фильтр, обработчик ошибок (если они определены и необходимы). В ходе этой работы окончательно устанавливается необходимость записи сообщения, сообщению придаются окончательные содержание и форма.
37 |
38 | В log4j журнал может представлять:
39 |
40 | + консоль;
41 | + файл;
42 | + сокет;
43 | + объект класса реализующего `java.io.Writer` или `java.io.OutputStream`;
44 | + JDBC хранилище;
45 | + тему (topic) JMS;
46 | + NT Event Log;
47 | + SMTP;
48 | + Syslog;
49 | + Telnet.
50 |
51 | Наиболее часто используемые log4j appender-ы:
52 |
53 | + `org.apache.log4j.ConsoleAppender` - вывод в консоль;
54 | + `org.apache.log4j.FileAppender` - добавление в файл;
55 | + `org.apache.log4j.DailyRollingFileAppender` - добавление в файл с обновлением файла через заданный промежуток времени;
56 | + `org.apache.log4j.RollingFileAppender` - добавление в файл с обновлением файла по достижению определенного размера;
57 | + `org.apache.log4j.varia.ExternallyRolledFileAppender` - расширение _RollingFileAppender_ обновляющее файл по команде принятой с заданного порта;
58 | + `org.apache.log4j.net.SMTPAppender` - сообщение по SMTP;
59 | + `org.apache.log4j.AsyncAppender` - позволяет, используя отдельный поток, организовать асинхронную работу, когда сообщения фиксируются лишь при достижении определенного уровня заполненности промежуточного буфера.
60 | + `org.apache.log4j.nt.NTEventLogAppender` - добавление в NT Event Log;
61 | + `org.apache.log4j.net.SyslogAppender` - добавление в Syslog;
62 | + `org.apache.log4j.jdbc.JDBCAppender` - запись в хранилище JDBC;
63 | + `org.apache.log4j.lf5.LF5Appender` - сообщение передаётся в специальный GUI интерфейс LogFactor5
64 | + `org.apache.log4j.net.SocketAppender` - трансляция сообщения по указанному адресу и порту;
65 | + `org.apache.log4j.net.SocketHubAppender` - рассылка сообщения сразу нескольким удалённым серверам соединённым по заданному порту;
66 | + `org.apache.log4j.net.TelnetAppender` - отсылка сообщения по протоколу Telenet;
67 | + `org.apache.log4j.net.JMSAppender` - добавление сообщения в JMS.
68 |
69 | [к оглавлению](#Журналирование)
70 |
71 | ## Что такое _Layout_ в log4j?
72 | __Layout__ - наследник класса `org.apache.log4j.Layout` предоставляющий возможность форматирования сообщения перед добавлением в журнал.
73 |
74 | В log4j существуют следующие типы layout-ов:
75 |
76 | + `org.apache.log4j.SimpleLayout` - на выходе получается строка содержащая лишь уровень вывода и сообщение;
77 | + `org.apache.log4j.HTMLLayout` - форматирует сообщение в виде элемента HTML-таблицы;
78 | + `org.apache.log4j.xml.XMLLayout` - компанует сообщение в виде XML формате;
79 | + `org.apache.log4j.TTCCLayout` - на выходе сообщение дополняется информацией о времени, потоке, имени логгера и вложенном диагностическом контексте;
80 | + `org.apache.log4j.PatternLayout` / `org.apache.log4j.EnhancedPatternLayout` - настройка форматирования сообщения при помощи шаблона заданного пользователем.
81 |
82 | [к оглавлению](#Журналирование)
83 |
84 | ## Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.
85 | + __OFF__ - отсутствие журналирования;
86 | + __FATAL__ - фатальная ошибка;
87 | + __ERROR__ - ошибка;
88 | + __WARN__ - предупреждение;
89 | + __INFO__ - информация;
90 | + __DEBUG__ - детальная информация для отладки;
91 | + __TRACE__ – трассировка всех сообщений.
92 |
93 | Между уровнями логирования установлен следующий порядок приоритетов:
94 |
95 | `OFF < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < ALL`
96 |
97 | [к оглавлению](#Журналирование)
98 |
99 | ## Какие существуют способы конфигурирования log4j?
100 | Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями:
101 |
102 | + Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования.
103 | + Указать файл или URL как аргумент при запуске java-машины `-Dlog4j.configuration=путь/к/файлу/конфигурации`, а затем прочитать его в программе при помощи `PropertyConfigurator.configure(...)`/ `DOMConfigurator.configure(...)` для формата `.properties` или `XML` соответственно.
104 | + Загрузить конфигурацию из файла в формате `XML` или `.properties`: log4j ищет файл конфигурации в classpath. Сначала ищется файл `log4j.xml` и, если таковой не найден, - файл `log4j.properties`.
105 |
106 | [к оглавлению](#Журналирование)
107 |
108 | # Источники
109 | + [Quizful](http://www.quizful.net/)
110 | + [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger)
111 |
112 | [Вопросы для собеседования](README.md)
113 |
--------------------------------------------------------------------------------
/css.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # Основы CSS
4 | + [Что такое _«CSS»_?](#Что-такое-css)
5 | + [Как в CSS обозначаются комментарии?](#Как-в-css-обозначаются-комментарии)
6 | + [Что такое _«селектор»_?](#Что-такое-селектор)
7 | + [Перечислите основные виды селекторов.](#Перечислите-основные-виды-селекторов)
8 | + [Что такое псевдокласс?](#Что-такое-псевдокласс)
9 | + [Какие существуют селекторы аттрибутов?](#Какие-существуют-селекторы-аттрибутов)
10 | + [В чем разница между `#my` и `.my`?](#В-чем-разница-между-my-и-my)
11 | + [В чем разница между `margin` и `padding`?](#В-чем-разница-между-margin-и-padding)
12 | + [В чем заключается разница между значениями `0` и `auto` в свойстве `margin`?](#В-чем-заключается-разница-между-значениями-0-и-auto-в-свойстве-margin)
13 | + [Какое свойство задает цвет фона?](#Какое-свойство-задает-цвет-фона)
14 | + [Как убрать подчеркивание для всех ссылок на странице?](#Как-убрать-подчеркивание-для-всех-ссылок-на-странице)
15 | + [Для чего используется свойство `clear`?](#Для-чего-используется-свойство-clear)
16 | + [Как сделать жирным текст во всех элементах `
`?](#Как-сделать-жирным-текст-во-всех-элементах-p)
17 | + [Как задать красный цвет для всех элементов, имеющих класс `red`?](#Как-задать-красный-цвет-для-всех-элементов-имеющих-класс-red)
18 |
19 | ## Что такое _«CSS»_?
20 | __CSS, Cascading Style Sheets (каскадные таблицы стилей)__ - формальный язык описания внешнего вида документа, написанного с использованием языка разметки, который применяется к элементам web-страницы для управления их видом и положением.
21 |
22 | Основной целью разработки CSS являлось разделение описания логической структуры web-страницы, которое производится с помощью HTML или других языков разметки от описания внешнего вида этой web-страницы, которое производится с помощью CSS.
23 |
24 | [к оглавлению](#Основы-css)
25 |
26 | ## Как в CSS обозначаются комментарии?
27 | Чтобы пометить, что текст является комментарием, применяют конструкцию `/* ... */`
28 |
29 | [к оглавлению](#Основы-css)
30 |
31 | ## Что такое _«селектор»_?
32 | __Селектор__ – это правило, на основании которого осуществляется выбор элементов в HTML документе для того, чтобы применить к ним определённые стили.
33 |
34 | ```css
35 | p {
36 | text-align: center;
37 | font-size: 20px;
38 | }
39 | /* p – это селектор, text-align и font-size – это свойства, а center и 20px – значения. */
40 | ```
41 |
42 | [к оглавлению](#Основы-css)
43 |
44 | ## Перечислите основные виды селекторов.
45 |
46 | + __селектор `*`__ - выбор всех элементов;
47 | + __селектор элемента__ - выбор всех элементов в HTML документе, имеющих указанный тег (например: `div`);
48 | + __селектор класса__ - выбор всех элементов в HTML документе, имеющих указанный класс (например: `.center`);
49 | + __селектор идентификатора__ - выбор элемента в HTML документе, имеющего указанный идентификатор (например: `#footer`);
50 | + __селекторы псевдоклассов__ - выбор всех элементов в HTML документе, имеющих указанный псевдокласс (например: `p:first-of-type`);
51 | + __селекторы атрибутов__ - выбор элементов в зависимости от указанного атрибута элемента или его значения (например: `[href*="youtube"]`).
52 |
53 | [к оглавлению](#Основы-css)
54 |
55 | ## Что такое псевдокласс?
56 | Псевдокласс определяет динамическое состояние элементов, которое изменяется из-за действий пользователя, или же соответствует текущему положению в дереве документа. В отличие от настоящего класса, в явном виде псеводкласс в HTML не указывается, а в CSS указывается через `:` непосредственно после селектора.
57 |
58 | Наиболее известные псевдоклассы:
59 |
60 | + `:link` применяется к непосещенным ссылкам;
61 | + `:visited` применяется к посещенным ссылкам;
62 | + `:hover` применяется, когда курсор мыши находится в пределах элемента, но не активирует его;
63 | + `:active` применяется при активации элемента;
64 | + `:focus` применяется к элементу при получении им фокуса;
65 | + `:first-child` применяется к первому дочернему элементу селектора, который расположен в дереве элементов документа.
66 |
67 | ```css
68 | a.snowman:link {
69 | color: blue;
70 | }
71 | a.snowman:visited {
72 | color: purple;
73 | }
74 | a.snowman:active {
75 | color: red;
76 | }
77 | a.snowman:hover {
78 | text-decoration: none;
79 | color: blue;
80 | background-color: yellow;
81 | }
82 | ```
83 |
84 | [к оглавлению](#Основы-css)
85 |
86 | ## Какие существуют селекторы аттрибутов?
87 | + __`[атрибут]`__ - все элементы, имеющие указанный `атрибут`;
88 | + __`[атрибут=значение]`__ - все элементы, имеющие `атрибут`, значение которого равно `"значение"`;
89 | + __`[атрибут^=занчение]`__ - все элементы, имеющие `атрибут`, значение которого начинается с `значение`;
90 | + __`[атрибут|=значение]`__ - все элементы, имеющие `атрибут`, значение которого равно `значение` или начинается с `значение` следующим образом `значение-*` (`значение` с обязательным дефисом, после которого идёт остальное содержимое значения);
91 | + __`[атрибут$=значение]`__ - все элементы, имеющие `атрибут`, значение которого заканчивается на `значение`;
92 | + __`[атрибут*=значение]`__ - все элементы, имеющие `атрибут`, значение которого содержит подстроку `значение`;
93 | + __`[атрибут~=значение]`__ - все элементы, имеющие `атрибут`, значение которого содержит `значение` как одно из значений через пробел.
94 |
95 | [к оглавлению](#Основы-css)
96 |
97 | ## В чем разница между `#my` и `.my`?
98 | `#my` — селектор идентификатора, а `.my` — селектор класса.
99 |
100 | [к оглавлению](#Основы-css)
101 |
102 | ## В чем разница между `margin` и `padding`?
103 | `margin` — внешний отступ, а `padding` — внутренний отступ.
104 |
105 | [к оглавлению](#Основы-css)
106 |
107 | ## В чем заключается разница между значениями `0` и `auto` в свойстве `margin`?
108 | В вертикальных полях — `auto` всегда означает `0`. В горизонтальных полях — `auto` означает `0` только тогда, когда свойство `width` также `auto`.
109 |
110 | [к оглавлению](#Основы-css)
111 |
112 | ## Какое свойство задает цвет фона?
113 | Цвет фона задает свойство `background-color`.
114 |
115 | [к оглавлению](#Основы-css)
116 |
117 | ## Как убрать подчеркивание для всех ссылок на странице?
118 | ```css
119 | a {
120 | text-decoration: none;
121 | }
122 | ```
123 |
124 | [к оглавлению](#Основы-css)
125 |
126 | ## Для чего используется свойство `clear`?
127 | `clear` устанавливает, с какой стороны элемента запрещено его обтекание другими элементами.
128 |
129 | [к оглавлению](#Основы-css)
130 |
131 | ## Как сделать жирным текст во всех элементах `
`?
132 | ```css
133 | p {
134 | font-weight: bold;
135 | }
136 | ```
137 |
138 | [к оглавлению](#Основы-css)
139 |
140 | ## Как задать красный цвет для всех элементов, имеющих класс `red`?
141 | ```css
142 | .red {
143 | color: red;
144 | }
145 | ```
146 |
147 | [к оглавлению](#Основы-css)
148 |
149 | # Источники
150 | + [myway-blog.ru](http://myway-blog.ru/interview-frontend-web-programmer/)
151 | + [htmlbook.ru](http://stepbystep.htmlbook.ru/?id=43)
152 | + [itchief.ru](https://itchief.ru/lessons/html-and-css/css-selectors)
153 |
154 | [Вопросы для собеседования](README.md)
155 |
--------------------------------------------------------------------------------
/uml.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # UML
4 | + [Что такое _UML_?](#Что-такое-uml)
5 | + [Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?](#Что-такое-диаграмма-нотация-и-метамодель-в-uml)
6 | + [Какие существуют типы диаграмм?](#Какие-существуют-типы-диаграмм)
7 | + [Какие виды отношений существуют в структурной диаграмме классов?](#Какие-виды-отношений-существуют-в-структурной-диаграмме-классов)
8 |
9 | ## Что такое _UML_?
10 | __UML__ – это унифицированный графический язык моделирования для описания, визуализации, проектирования и документирования объектно-ориентированных систем. UML призван поддерживать процесс моделирования на основе объектно-ориентированного подхода, организовывать взаимосвязь концептуальных и программных понятий, отражать проблемы масштабирования сложных систем.
11 |
12 | Отличительной особенностью UML является то, что словарь этого языка образуют графические элементы. Каждому графическому символу соответствует конкретная семантика, поэтому модель, созданная одним человеком, может однозначно быть понята другим человеком или программным средством, интерпретирующим UML. Отсюда, в частности, следует, что модель системы, представленная на UML, может автоматически быть переведена на объектно-ориентированный язык программирования, то есть, при наличии хорошего инструментального средства визуального моделирования, поддерживающего UML, построив модель, мы получим и заготовку программного кода, соответствующего этой модели.
13 |
14 | [к оглавлению](#uml)
15 |
16 | ## Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?
17 | __Диаграмма__ - графическое представление совокупности элементов модели в форме связного графа, вершинам и ребрам (дугам) которого приписывается определенная семантика
18 |
19 | __Нотация__ – совокупность символов и правила их применения, используются для представления понятий и связей между ними.
20 | Нотация диаграммы определяет способ представления, ассоциации, множественности. Причем эти понятия должны быть точно определены.
21 |
22 | __Метамодель__ – диаграмма, определяющая нотацию.
23 | Метамодель помогает понять, что такое хорошо организованная, т.е. синтаксически правильная, модель.
24 |
25 | [к оглавлению](#uml)
26 |
27 | ## Какие существуют типы диаграмм?
28 | ## Структурные диаграммы:
29 | __классов (Class diagram)__ описывает структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами.
30 |
31 | __объектов (Object diagram)__ демонстрирует полный или частичный снимок моделируемой системы в заданный момент времени. На диаграмме объектов отображаются экземпляры классов (объекты) системы с указанием текущих значений их атрибутов и связей между объектами.
32 |
33 | __компонентов (Component diagram)__ показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами.
34 |
35 | + __развёртывания/размещения (Deployment diagram)__ служит для моделирования работающих узлов и артефактов, развёрнутых на них.
36 |
37 | + __пакетов (Package diagram)__ используется для организации элементов в группы по какому-либо признаку с целью упрощения структуры и организации работы с моделью системы.
38 |
39 | + __профилей (Profile diagram)__ действует на уровне метамодели и показывает стереотип класса или пакета.
40 |
41 | + __композитной/составной структуры (Composite structure diagram)__ демонстрирует внутреннюю структуру класса и, по возможности, взаимодействие элементов (частей) его внутренней структуры.
42 |
43 | + __кооперации (Collaboration diagram)__ показывает роли и взаимодействие классов в рамках кооперации.
44 |
45 | ## Диаграммы поведения:
46 | __деятельности (Activity diagram)__ показывает разложение некоторой деятельности на её составные части. Под деятельностью понимается спецификация исполняемого поведения в виде координированного последовательного и параллельного выполнения подчинённых элементов — вложенных видов деятельности и отдельных действий, соединённых между собой потоками, которые идут от выходов одного узла к входам другого. Диаграммы деятельности используются при моделировании бизнес-процессов, технологических процессов, последовательных и параллельных вычислений.
47 |
48 | __состояний/автомата/конечного автомата (State Machine diagram)__ представляет конечный автомат с простыми состояниями, переходами и композитными состояниями. Конечный автомат (State machine) — спецификация последовательности состояний, через которые проходит объект или взаимодействие в ответ на события своей жизни, а также ответные действия объекта на эти события. Конечный автомат прикреплён к исходному элементу (классу, кооперации или методу) и служит для определения поведения его экземпляров.
49 |
50 | __вариантов использования/прецедентов (Use case diagram)__ отражает отношения существующие между актёрами и вариантами использования. Основная задача — представлять собой единое средство, дающее возможность заказчику, конечному пользователю и разработчику совместно обсуждать функциональность и поведение системы.
51 |
52 | __взаимодействия (Interaction diagram)__:
53 |
54 | + __коммуникации (Communication diagram)__ изображает взаимодействия между частями композитной структуры или ролями кооперации при этом явно указываются отношения между элементами (объектами), а время как отдельное измерение не используется (применяются порядковые номера вызовов).
55 |
56 | + __последовательности (Sequence diagram)__ показывает взаимодействия объектов, упорядоченные по времени их проявления.
57 |
58 | + __обзора взаимодействия (Interaction overview diagram)__ — разновидность диаграммы деятельности, включающая фрагменты диаграммы последовательности и конструкции потока управления.
59 |
60 | + __синхронизации (Timing diagram)__ — альтернативное представление диаграммы последовательности, явным образом показывающее изменения состояния на линии жизни с заданной шкалой времени. Может быть полезна в приложениях реального времени.
61 |
62 | [к оглавлению](#uml)
63 |
64 | ## Какие виды отношений существуют в структурной диаграмме классов?
65 | ## Взаимосвязи классов
66 | __Обобщение (Generalization)__ показывает, что один из двух связанных классов (подтип) является частной формой другого (супертипа), который называется обобщением первого. На практике это означает, что любой экземпляр подтипа является также экземпляром супертипа. Обобщение также известно как _наследование_, _«is a» взаимосвязь_ или _отношение «является»_.
67 |
68 | > «Табурет» является подтипом «Мебели».
69 |
70 | __Реализация (Implementation)__ — отношение между двумя элементами модели, в котором один элемент (клиент) реализует поведение, заданное другим (поставщиком). Реализация — отношение целое-часть. Поставщик, как правило является абстрактным классом или классом-интерфейсом.
71 |
72 | > «Кровать» реализует поведение «Мебели для сна»
73 |
74 | ## Взаимосвязи объектов классов
75 | __Зависимость (Dependency)__ обозначает такое отношение между классами, что изменение спецификации класса-поставщика может повлиять на работу зависимого класса, но не наоборот.
76 |
77 | > «Расписание занятий» имеет зависимость от «Списка предметов». При изменении списка предметов расписание занятий будет вынуждено изменится. Однако изменение расписания занятий никак не влияет на список предметов.
78 |
79 | __Ассоциация (Association)__ показывает, что объекты одной сущности (класса) связаны с объектами другой сущности таким образом, что можно перемещаться от объектов одного класса к другому. Является общим случаем композиции и агрегации.
80 |
81 | > «Студент» и «Университет» имеют ассоциацию т.к. студент может учиться в университете и этой ассоциации можно присвоить имя «учится в».
82 |
83 | __Агрегация (Aggregation)__ — это разновидность ассоциации в отношении между целым и его частями. Как тип ассоциации агрегация может быть именованной. Одно отношение агрегации не может включать более двух классов (контейнер и содержимое). Агрегация встречается, когда один класс является коллекцией или контейнером других. Причём по умолчанию, агрегацией называют агрегацию по ссылке, то есть когда время существования содержащихся классов не зависит от времени существования содержащего их класса. Если контейнер будет уничтожен, то его содержимое — нет.
84 |
85 | > «Студент» не является неотъемлемой частью «Группы», но в то же время, группа состоит из студентов, поэтому следует использовать агрегацию.
86 |
87 | __Композиция (Composition)__ — более строгий вариант агрегации. Известна также как агрегация по значению. Композиция имеет жёсткую зависимость времени существования экземпляров класса контейнера и экземпляров содержащихся классов. Если контейнер будет уничтожен, то всё его содержимое будет также уничтожено.
88 |
89 | > «Факультет» является частью «Университета» и факультет без университета существовать не может, следовательно здесь подходит композиция.
90 |
91 | ## #Общие взаимосвязи
92 | __Зависимость__ — это слабая форма отношения использования, при котором изменение в спецификации одного влечёт за собой изменение другого, причём обратное не обязательно. Возникает, когда объект выступает, например, в форме параметра или локальной переменной. Существует несколько именованных вариантов. Зависимость может быть между экземплярами, классами или экземпляром и классом.
93 |
94 | __Уточнение отношений__ имеет отношение к уровню детализации. Один пакет уточняет другой, если в нём содержатся те же самые элементы, но в более подробном представлении.
95 |
96 | __Мощность/кратность/мультипликатор отношения__ означает число связей между каждым экземпляром класса (объектом) в начале линии с экземпляром класса в её конце. Различают следующие типичные случаи:
97 |
98 | | нотация | объяснение | пример |
99 | |:----------:|:--------------------------:|:---------------------------------------------:|
100 | | 0..1 | Ноль или один экземпляр | кошка имеет или не имеет хозяина |
101 | | 1 | Обязательно один экземпляр | у кошки одна мать |
102 | | 0..* или * | Ноль или более экземпляров | у кошки могут быть, а может и не быть котят |
103 | | 1..* | Один или более экземпляров | у кошки есть хотя бы одно место, где она спит |
104 |
105 | [к оглавлению](#uml)
106 |
107 | # Источники
108 | + [Википедия](https://ru.wikipedia.org/wiki/UML)
109 | + [Информикус](http://www.informicus.ru/)
110 |
111 | [Вопросы для собеседования](README.md)
112 |
--------------------------------------------------------------------------------
/examples/src/main/resources/google_checkstyle.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
70 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
95 |
96 |
97 |
99 |
100 |
101 |
102 |
104 |
105 |
106 |
107 |
109 |
110 |
111 |
112 |
113 |
114 |
116 |
117 |
118 |
119 |
121 |
122 |
123 |
124 |
126 |
127 |
128 |
129 |
131 |
132 |
133 |
134 |
136 |
138 |
140 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
--------------------------------------------------------------------------------
/serialization.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # Сериализация
4 | + [Что такое _«сериализация»_?](#Что-такое-сериализация)
5 | + [Опишите процесс сериализации/десериализации с использованием `Serializable`.](#Опишите-процесс-сериализациидесериализации-с-использованием-serializable)
6 | + [Как изменить стандартное поведение сериализации/десериализации?](#Как-изменить-стандартное-поведение-сериализациидесериализации)
7 | + [Как исключить поля из сериализации?](#Как-исключить-поля-из-сериализации)
8 | + [Что обозначает ключевое слово `transient`?](#Что-обозначает-ключевое-слово-transient)
9 | + [Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final`](#Какое-влияние-оказывают-на-сериализуемость-модификаторы-полей-static-и-final)
10 | + [Как не допустить сериализацию?](#Как-не-допустить-сериализацию)
11 | + [Как создать собственный протокол сериализации?](#Как-создать-собственный-протокол-сериализации)
12 | + [Какая роль поля `serialVersionUID` в сериализации?](#Какая-роль-поля-serialversionuid-в-сериализации)
13 | + [Когда стоит изменять значение поля `serialVersionUID`?](#Когда-стоит-изменять-значение-поля-serialversionuid)
14 | + [В чем проблема сериализации Singleton?](#В-чем-проблема-сериализации-singleton)
15 | + [Какие существуют способы контроля за значениями десериализованного объекта](#Какие-существуют-способы-контроля-за-значениями-десериализованного-объекта)
16 |
17 | ## Что такое _«сериализация»_?
18 | __Сериализация (Serialization)__ - процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать).
19 |
20 | В Java, согласно спецификации Java Object Serialization существует два стандартных способа сериализации: стандартная сериализация, через использование интерфейса `java.io.Serializable` и «расширенная» сериализация - `java.io.Externalizable`.
21 |
22 | Сериализация позволяет в определенных пределах изменять класс. Вот наиболее важные изменения, с которыми спецификация Java Object Serialization может справляться автоматически:
23 |
24 | + добавление в класс новых полей;
25 | + изменение полей из статических в нестатические;
26 | + изменение полей из транзитных в нетранзитные.
27 |
28 | Обратные изменения (из нестатических полей в статические и из нетранзитных в транзитные) или удаление полей требуют определенной дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима.
29 |
30 | [к оглавлению](#Сериализация)
31 |
32 | ## Опишите процесс сериализации/десериализации с использованием `Serializable`.
33 | При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:
34 |
35 | + запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор `SerialVersionUID`, идентификаторы полей класса);
36 | + рекурсивную запись в поток описания суперклассов до класса `java.lang.Object` (не включительно);
37 | + запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса;
38 | + рекурсивную запись объектов, которые являются полями сериализуемого объекта.
39 |
40 | При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками.
41 |
42 | Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации.
43 |
44 | [к оглавлению](#Сериализация)
45 |
46 | ## Как изменить стандартное поведение сериализации/десериализации?
47 | + Реализовать интерфейс `java.io.Externalizable`, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах `writeExternal()` и `readExternal()`. Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод `readExternal`.
48 | + Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :
49 | + `writeObject()` - запись объекта в поток;
50 | + `readObject()` - чтение объекта из потока;
51 | + `writeReplace()` - позволяет заменить себя экземпляром другого класса перед записью;
52 | + `readResolve()` - позволяет заменить на себя другой объект после чтения.
53 |
54 | [к оглавлению](#Сериализация)
55 |
56 | ## Как исключить поля из сериализации?
57 | Для управления сериализацией при определении полей можно использовать ключевое слово `transient`, таким образом исключив поля из общего процесса сериализации.
58 |
59 | [к оглавлению](#Сериализация)
60 |
61 | ## Что обозначает ключевое слово `transient`?
62 | Поля класса, помеченные модификатором `transient`, не сериализуются.
63 |
64 | Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
65 |
66 | [к оглавлению](#Сериализация)
67 |
68 | ## Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final`
69 | При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации `Externalizable` сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.
70 |
71 | Поля с модификатором `final` сериализуются как и обычные. За одним исключением – их невозможно десериализовать при использовании `Externalizable`, поскольку `final` поля должны быть инициализированы в конструкторе, а после этого в `readExternal()` изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с `final` полем необходимо использовать только стандартную сериализацию.
72 |
73 | [к оглавлению](#Сериализация)
74 |
75 | ## Как не допустить сериализацию?
76 | Чтобы не допустить автоматическую сериализацию можно переопределить `private` методы для создания исключительной ситуации `NotSerializableException`.
77 |
78 | ```java
79 | private void writeObject(ObjectOutputStream out) throws IOException {
80 | throw new NotSerializableException();
81 | }
82 |
83 | private void readObject(ObjectInputStream in) throws IOException {
84 | throw new NotSerializableException();
85 | }
86 | ```
87 |
88 | Любая попытка записать или прочитать этот объект теперь приведет к возникновению исключительной ситуации.
89 |
90 | [к оглавлению](#Сериализация)
91 |
92 | ## Как создать собственный протокол сериализации?
93 | Для создания собственного протокола сериализации достаточно реализовать интерфейс `Externalizable`, который содержит два метода:
94 |
95 | ```java
96 | public void writeExternal(ObjectOutput out) throws IOException;
97 | public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException;
98 | ```
99 |
100 | [к оглавлению](#Сериализация)
101 |
102 | ## Какая роль поля `serialVersionUID` в сериализации?
103 | `serialVersionUID` используется для указании версии сериализованных данных.
104 |
105 | Когда мы не объявляем `serialVersionUID` в нашем классе явно, среда выполнения Java делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр.
106 |
107 | Рекомендуется явно объявлять `serialVersionUID` т.к. при добавлении, удалении атрибутов класса динамически сгенерированное значение может измениться и в момент выполнения будет выброшено исключение `InvalidClassException`.
108 |
109 | ```java
110 | private static final long serialVersionUID = 20161013L;
111 | ```
112 | [к оглавлению](#Сериализация)
113 |
114 | ## Когда стоит изменять значение поля `serialVersionUID`?
115 | `serialVersionUID` нужно изменять при внесении в класс несовместимых изменений, например при удалении какого-либо его атрибута.
116 |
117 | [к оглавлению](#Сериализация)
118 |
119 | ## В чем проблема сериализации Singleton?
120 | Проблема в том что после десериализации мы получим другой объект. Таким образом, сериализация дает возможность создать Singleton еще раз, что недопустимо. Существует два способа избежать этого:
121 |
122 | + явный запрет сериализации.
123 | + определение метода с сигнатурой `(default/public/private/protected/) Object readResolve() throws ObjectStreamException`, назначением которого станет возврат замещающего объекта вместо объекта, на котором он вызван.
124 |
125 | [к оглавлению](#Сериализация)
126 |
127 | ## Какие существуют способы контроля за значениями десериализованного объекта
128 | Если есть необходимость выполнения контроля за значениями десериализованного объекта, то можно использовать интерфейс `ObjectInputValidation` с переопределением метода `validateObject()`.
129 |
130 | ```java
131 | // Если вызвать метод validateObject() после десериализации объекта, то будет вызвано исключение InvalidObjectException при значении возраста за пределами 39...60.
132 | public class Person implements java.io.Serializable,
133 | java.io.ObjectInputValidation {
134 | ...
135 | @Override
136 | public void validateObject() throws InvalidObjectException {
137 | if ((age < 39) || (age > 60))
138 | throw new InvalidObjectException("Invalid age");
139 | }
140 | }
141 | ```
142 |
143 | Так же существуют способы подписывания и шифрования, позволяющие убедиться, что данные не были изменены:
144 |
145 | + с помощью описания логики в `writeObject()` и `readObject()`.
146 |
147 | + поместить в оберточный класс `javax.crypto.SealedObject` и/или `java.security.SignedObject`. Данные классы являются сериализуемыми, поэтому при оборачивании объекта в `SealedObject` создается подобие «подарочной упаковки» вокруг исходного объекта. Для шифрования необходимо создать симметричный ключ, управление которым должно осуществляться отдельно. Аналогично, для проверки данных можно использовать класс `SignedObject`, для работы с которым также нужен симметричный ключ, управляемый отдельно.
148 |
149 | [к оглавлению](#Сериализация)
150 |
151 | # Источники
152 | + [IBM developerWorks](https://www.ibm.com/developerworks/ru/library/j-5things1/)
153 | + [Java-online.ru](http://java-online.ru/blog-serialization.xhtml)
154 | + [Изучите секреты Java Serialization API](http://ccfit.nsu.ru/~deviv/courses/oop/java_ser_rus.html)
155 | + [JavaRush](http://bit.ly/1xwRA2D)
156 | + [Записки трезвого практика](http://www.skipy.ru/technics/serialization.html)
157 |
158 | [Вопросы для собеседования](README.md)
159 |
--------------------------------------------------------------------------------
/html.md:
--------------------------------------------------------------------------------
1 | [Вопросы для собеседования](README.md)
2 |
3 | # Основы HTML
4 | + [Что такое _«HTML»_?](#Что-такое-html)
5 | + [Что такое _«XHTML»_?](#Что-такое-xhtml)
6 | + [Что такое `DOCTYPE` и зачем он нужен?](#Что-такое-doctype-и-зачем-он-нужен)
7 | + [Для чего предназначен тег `
`?](#Для-чего-предназначен-тег-head)
8 | + [Чем отличается `
` от ``?](#Чем-отличается-div-от-span)
9 | + [Как обозначаются комментарии в HTML?](#Как-обозначаются-комментарии-в-html)
10 | + [Каким образом задаётся адрес документа, на который следует перейти?](#Каким-образом-задаётся-адрес-документа-на-который-следует-перейти)
11 | + [Как сделать ссылку на адрес электронной почты?](#Как-сделать-ссылку-на-адрес-электронной-почты)
12 | + [Для чего предназначен тег ``?](#Для-чего-предназначен-тег-em)
13 | + [Для чего предназначены теги ``, `
`, `
`?](#Для-чего-предназначены-теги-ol-ul-li)
14 | + [Для чего предназначены теги `
`, `
`, `
`?](#Для-чего-предназначены-теги-dl-dt-dd)
15 | + [Для чего предназначены теги `
`, `
`, `
`?](#Для-чего-предназначены-теги-tr-th-td)
16 | + [Обязательно ли писать атрибут `alt` в теге ``?](#Обязательно-ли-писать-атрибут-alt-в-теге-img)
17 | + [В каком регистре лучше писать HTML-код?](#В-каком-регистре-лучше-писать-html-код)
18 | + [Что такое «мнемоника (entity)»?](#Что-такое-мнемоника-entity)
19 |
20 | ## Что такое _«HTML»_?
21 | __HTML__, HyperText Markup Language («язык гипертекстовой разметки») — стандартизированный язык разметки документов в WWW. На данный момент актуальна 5 версия этого языка - HTML5.
22 |
23 | [к оглавлению](#Основы-html)
24 |
25 | ## Что такое _«XHTML»_?
26 | __XHTML__, eXtensible HyperText Markup Language («расширяемый язык гипертекстовой разметки») - более строгий вариант HTML, следующий всем ограничениям XML и, фактически являющийся приложением языка XML к области разметки гипертекста.
27 |
28 | [к оглавлению](#Основы-html)
29 |
30 | ## Что такое `DOCTYPE` и зачем он нужен?
31 | Элемент `` предназначен для указания типа текущего документа. Это необходимо, чтобы браузер понимал согласно какого стандарта необходимо интерпретировать данную web-страницу.
32 |
33 | Существует несколько видов ``, различающихся версией языка, на который они ориентированы:
34 |
35 | __HTML 4.01__
36 |
37 | + ``: строгий синтаксис HTML;
39 |
40 | + ``: переходный синтаксис HTML;
42 |
43 | + ``: HTML с фреймами.
45 |
46 | __HTML 5__
47 |
48 | + ``: для всех документов.
49 |
50 | __XHTML 1.0__
51 |
52 | + ``: строгий синтаксис XHTML;
54 |
55 | + ``: переходный синтаксис XHTML;
57 |
58 | + ``: XHTML с фреймами.
60 |
61 | __XHTML 1.1__
62 |
63 | + ``: для всех документов.
65 |
66 | [к оглавлению](#Основы-html)
67 |
68 | ## Для чего предназначен тег ``?
69 | Тег `` предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными. Также внутри этого контейнера находятся _метатеги_, которые используются для хранения информации предназначенной для браузеров и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам для получения описания сайта, ключевых слов и других данных.
70 |
71 | Содержимое тега `` не отображается напрямую на web-странице, за исключением тега `` устанавливающего заголовок окна.
72 |
73 | Внутри контейнера `` допускается размещать следующие элементы: ``, ``, ``, ``, ``, `