1
1
Fork 0

Fix title's formatting issues

This commit is contained in:
enhorse 2017-10-21 09:01:09 +06:00
parent 879ae7822a
commit c21f7c498e
14 changed files with 440 additions and 440 deletions

32
html.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Основы HTML
# Основы HTML
+ [Что такое _«HTML»_?](#Что-такое-html)
+ [Что такое _«XHTML»_?](#Что-такое-xhtml)
+ [Что такое `DOCTYPE` и зачем он нужен?](#Что-такое-doctype-и-зачем-он-нужен)
@ -17,17 +17,17 @@
+ [В каком регистре лучше писать HTML-код?](#В-каком-регистре-лучше-писать-html-код)
+ [Что такое «мнемоника (entity)»?](#Что-такое-мнемоника-entity)
##Что такое _«HTML»_?
## Что такое _«HTML»_?
__HTML__, HyperText Markup Language («язык гипертекстовой разметки») — стандартизированный язык разметки документов в WWW. На данный момент актуальна 5 версия этого языка - HTML5.
[к оглавлению](#Основы-html)
##Что такое _«XHTML»_?
## Что такое _«XHTML»_?
__XHTML__, eXtensible HyperText Markup Language («расширяемый язык гипертекстовой разметки») - более строгий вариант HTML, следующий всем ограничениям XML и, фактически являющийся приложением языка XML к области разметки гипертекста.
[к оглавлению](#Основы-html)
##Что такое `DOCTYPE` и зачем он нужен?
## Что такое `DOCTYPE` и зачем он нужен?
Элемент `<!DOCTYPE>` предназначен для указания типа текущего документа. Это необходимо, чтобы браузер понимал согласно какого стандарта необходимо интерпретировать данную web-страницу.
Существует несколько видов `<!DOCTYPE>`, различающихся версией языка, на который они ориентированы:
@ -65,7 +65,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Для чего предназначен тег `<head>`?
## Для чего предназначен тег `<head>`?
Тег `<head>` предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными. Также внутри этого контейнера находятся етатеги_, которые используются для хранения информации предназначенной для браузеров и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам для получения описания сайта, ключевых слов и других данных.
Содержимое тега `<head>` не отображается напрямую на web-странице, за исключением тега `<title>` устанавливающего заголовок окна.
@ -86,19 +86,19 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Чем отличается `<div>` от `<span>`?
## Чем отличается `<div>` от `<span>`?
`<div>` - блочный, а `<span>` - строчный элементы. Поэтому `<div>` формирует блок из того, что в нем располагается с новой строки, а `<span>` не переносит элементы, размещая их в строку. Так же стоит отметь, что согласно рекомендациям w3c линейный тег не может включать в себя блочные теги, поэтому `<div>` обычно используется для разметки блоков, а `<span>` - отрывков текста.
[к оглавлению](#Основы-html)
##Как обозначаются комментарии в HTML?
## Как обозначаются комментарии в HTML?
Комментарий в HTML-коде задаётся так: `<!-- комментарий -->`
Комментарии можно использовать в любом месте страницы, кроме тега `<title>` — внутри него они не работают. Внутри тега `<style>` HTML-комментарии тоже не работают, так как в CSS код комментируется другим способом.
[к оглавлению](#Основы-html)
##Каким образом задаётся адрес документа, на который следует перейти?
## Каким образом задаётся адрес документа, на который следует перейти?
Для создания ссылок на другие документы используется тег `<a>`. В зависимости от присутствия атрибутов `name` или `href` тег `<a>` устанавливает ссылку или якорь. Якорем называется закладка внутри страницы, которую можно указать в качестве цели ссылки. При использовании ссылки, которая указывает на якорь, происходит переход к закладке внутри web-страницы.
Синтаксис:
@ -124,7 +124,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Как сделать ссылку на адрес электронной почты?
## Как сделать ссылку на адрес электронной почты?
Создание ссылки на адрес электронной почты делается почти также, как и ссылка на web-страницу. Только вместо URL указывается `mailto:"адрес электронной почты"`
```html
@ -133,7 +133,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Для чего предназначен тег `<em>`?
## Для чего предназначен тег `<em>`?
Тег `<em>` предназначен для акцентирования текста. Браузеры отображают такой текст курсивным начертанием.
```html
@ -143,7 +143,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Для чего предназначены теги `<ol>`, `<ul>`, `<li>`?
## Для чего предназначены теги `<ol>`, `<ul>`, `<li>`?
Теги `<ol>`, `<ul>` и `<li>` предназначены для оформления списков.
+ `<ol>`: нумерованный список, т.е. каждый элемент списка начинается с числа или буквы и увеличивается по нарастающей.
@ -167,7 +167,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Для чего предназначены теги `<dl>`, `<dt>`, `<dd>`?
## Для чего предназначены теги `<dl>`, `<dt>`, `<dd>`?
Теги `<dl>`, `<dt>`, `<dd>` предназначены для создания списка определений.
Каждый такой список начинается с контейнера `<dl>`, куда входит тег `<dt>` создающий термин и тег `<dd>` задающий определение этого термина. Закрывающий тег `</dd>` не обязателен, поскольку следующий тег сообщает о завершении предыдущего элемента. Тем не менее, хорошим стилем является закрывать все теги.
@ -181,7 +181,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Для чего предназначены теги `<tr>`, `<th>`, `<td>`?
## Для чего предназначены теги `<tr>`, `<th>`, `<td>`?
`<tr>`: служит контейнером для создания строки таблицы. Каждая ячейка в пределах такой строки может задаваться с помощью тега `<th>` или `<td>`.
`<th>`: предназначен для создания одной ячейки заголовка таблицы.
@ -200,7 +200,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Обязательно ли писать атрибут `alt` в теге `<img>`?
## Обязательно ли писать атрибут `alt` в теге `<img>`?
Да, писать его обязательно.
Атрибут `alt` устанавливает альтернативный текст для изображений. Такой текст позволяет получить текстовую информацию о рисунке при отключенной в браузере загрузке изображений. Поскольку загрузка изображений происходит после получения браузером информации о нем, то замещающий рисунок текст появляется раньше. А уже по мере загрузки текст будет сменяться изображением.
@ -211,7 +211,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##В каком регистре лучше писать HTML-код?
## В каком регистре лучше писать HTML-код?
Весь HTML-код рекомендуется писать в нижнем регистре: это относится к названиям элементов, названиям атрибутов, значениям атрибутов (кроме текста/`CDATA`), селекторам, свойствам и их значениям (кроме текста).
Не рекомендуется
@ -226,7 +226,7 @@ __XHTML 1.1__
[к оглавлению](#Основы-html)
##Что такое «мнемоника (entity)»?
## Что такое «мнемоника (entity)»?
__Мнемоника (entity)__ - это конструкция из символа `&` и буквенного (или цифрового кода) после нее, предназначенная для замещения символов, которые запрещены для использования в HTML в «явном виде».
>&num; имеет мнемонику `&num;`

60
io.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Потоки ввода/вывода в Java
# Потоки ввода/вывода в Java
+ [В чём заключается разница между IO и NIO?](#В-чём-заключается-разница-между-io-и-nio)
+ [Какие особенности NIO вы знаете?](#Какие-особенности-nio-вы-знаете)
+ [Что такое _«каналы»_?](#Что-такое-каналы)
@ -32,28 +32,28 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##В чём заключается разница между IO и NIO?
## В чём заключается разница между IO и NIO?
+ Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных.
+ Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается `read()` или `write()` метод любого класса из пакета `java.io.*`, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны.
+ В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи.
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие особенности NIO вы знаете?
## Какие особенности NIO вы знаете?
+ __Каналы и селекторы__: NIO поддерживает различные типы каналов. Канал является абстракцией объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), что позволяет передавать данные с более высокой скоростью. Каналы не блокируются и поэтому Java предоставляет еще такие инструменты, как селектор, который позволяет выбрать готовый канал для передачи данных, и сокет, который является инструментом для блокировки.
+ __Буферы__: имеет буферизация для всех классов-обёрток примитивов (кроме Boolean). Появился абстрактный класс Buffer, который предоставляет такие операции, как clear, flip, mark и т.д. Его подклассы предоставляют методы для получения и установки данных.
+ __Кодировки__: появились кодеры и декодеры для отображения байт и символов Unicode.
[к оглавлению](#Потоки-вводавывода-в-java)
##Что такое _«каналы»_?
## Что такое _«каналы»_?
Каналы (channels) это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных. При организации вывода, данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал. При вводе, данные из канала помещаются в заранее предоставленный буфер.
Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с минимальными накладными расходами, а буферы внутренние конечные точки этих шлюзов, используемые для передачи и приема данных.
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие существуют виды потоков ввода/вывода?
##Назовите основные классы потоков ввода/вывода.
## Какие существуют виды потоков ввода/вывода?
## Назовите основные классы потоков ввода/вывода.
Разделяют два вида потоков ввода/вывода:
+ __байтовые__ - `java.io.InputStream`, `java.io.OutputStream`;
@ -61,12 +61,12 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##В каких пакетах расположены классы потоков ввода/вывода?
## В каких пакетах расположены классы потоков ввода/вывода?
`java.io`, `java.nio`. Для работы с потоками компрессированных данных используются классы из пакета `java.util.zip`
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие подклассы класса `InputStream` вы знаете, для чего они предназначены?
## Какие подклассы класса `InputStream` вы знаете, для чего они предназначены?
+ `InputStream` - абстрактный класс, описывающий поток ввода;
+ `BufferedInputStream` - буферизованный входной поток;
+ `ByteArrayInputStream` позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока;
@ -82,21 +82,21 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Для чего используется `PushbackInputStream`?
## Для чего используется `PushbackInputStream`?
Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс `PushbackInputStream` представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации.
У класса есть дополнительный метод unread().
[к оглавлению](#Потоки-вводавывода-в-java)
##Для чего используется `SequenceInputStream`?
## Для чего используется `SequenceInputStream`?
Класс `SequenceInputStream` позволяет сливать вместе несколько экземпляров класса `InputStream`. Конструктор принимает в качестве аргумента либо пару объектов класса `InputStream`, либо интерфейс `Enumeration`.
Во время работы класс выполняет запросы на чтение из первого объекта класса `InputStream` и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса `InputStream`. По достижении конца, связанный с ним поток закрывается. Закрытие потока, созданного объектом класса `SequenceInputStream`, приводит к закрытию всех открытых потоков.
[к оглавлению](#Потоки-вводавывода-в-java)
##Какой класс позволяет читать данные из входного байтового потока в формате примитивных типов данных?
## Какой класс позволяет читать данные из входного байтового потока в формате примитивных типов данных?
Класс `DataInputStream` представляет поток ввода и предназначен для записи данных примитивных типов, таких, как `int`, `double` и т.д. Для каждого примитивного типа определен свой метод для считывания:
+ `boolean readBoolean()`: считывает из потока булевое однобайтовое значение
@ -111,7 +111,7 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие подклассы класса `OutputStream` вы знаете, для чего они предназначены?
## Какие подклассы класса `OutputStream` вы знаете, для чего они предназначены?
+ `OutputStream` - это абстрактный класс, определяющий потоковый байтовый вывод;
+ `BufferedOutputStream` - буферизированный выходной поток;
+ `ByteArrayOutputStream` - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере;
@ -123,7 +123,7 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие подклассы класса `Reader` вы знаете, для чего они предназначены?
## Какие подклассы класса `Reader` вы знаете, для чего они предназначены?
+ `Reader` - абстрактный класс, описывающий символьный ввод;
+ `BufferedReader` - буферизованный входной символьный поток;
+ `CharArrayReader` - входной поток, который читает из символьного массива;
@ -137,7 +137,7 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие подклассы класса `Writer` вы знаете, для чего они предназначены?
## Какие подклассы класса `Writer` вы знаете, для чего они предназначены?
+ `Writer` - абстрактный класс, описывающий символьный вывод;
+ `BufferedWriter` - буферизованный выходной символьный поток;
+ `CharArrayWriter` - выходной поток, который пишет в символьный массив;
@ -150,14 +150,14 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##В чем отличие класса `PrintWriter` от `PrintStream`?
## В чем отличие класса `PrintWriter` от `PrintStream`?
Прежде всего, в классе `PrintWriter` применен усовершенствованный способ работы с символами Unicode и другой механизм буферизации вывода: в классе PrintStream буфер вывода сбрасывался всякий раз, когда вызывался метод `print()` или `println()`, а при использовании класса `PrintWriter` существует возможность отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода `flush()`.
Кроме того, методы класса `PrintWriter` никогда не создают исключений. Для проверки ошибок необходимо явно вызвать метод `checkError()`.
[к оглавлению](#Потоки-вводавывода-в-java)
##Чем отличаются и что общего у `InputStream`, `OutputStream`, `Reader`, `Writer`?
## Чем отличаются и что общего у `InputStream`, `OutputStream`, `Reader`, `Writer`?
+ `InputStream` и его наследники - совокупность для получения байтовых данных из различных источников;
+ `OutputStream` и его наследники - набор классов определяющих потоковый байтовый вывод;
+ `Reader` и его наследники определяют потоковый ввод символов Unicode;
@ -165,13 +165,13 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
## Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?
+ `OutputStreamWriter` — «мост» между классом `OutputStream` и классом `Writer`. Символы, записанные в поток, преобразовываются в байты.
+ `InputStreamReader` — аналог для чтения. При помощи методов класса `Reader` читаются байты из потока `InputStream` и далее преобразуются в символы.
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие классы позволяют ускорить чтение/запись за счет использования буфера?
## Какие классы позволяют ускорить чтение/запись за счет использования буфера?
+ `BufferedInputStream(InputStream in)`/`BufferedInputStream(InputStream in, int size)`,
+ `BufferedOutputStream(OutputStream out)`/`BufferedOutputStream(OutputStream out, int size)`,
+ `BufferedReader(Reader r)`/`BufferedReader(Reader in, int sz)`,
@ -179,12 +179,12 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Какой класс предназначен для работы с элементами файловой системы?
## Какой класс предназначен для работы с элементами файловой системы?
`File` работает непосредственно с файлами и каталогами. Данный класс позволяет создавать новые элементы и получать информацию существующих: размер, права доступа, время и дату создания, путь к родительскому каталогу.
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие методы класса `File` вы знаете?
## Какие методы класса `File` вы знаете?
Наиболее используемые методы класса `File`:
+ `boolean createNewFile()`: делает попытку создать новый файл;
@ -205,7 +205,7 @@
[к оглавлению](#Потоки-вводавывода-в-java)
##Что вы знаете об интерфейсе `FileFilter`?
## Что вы знаете об интерфейсе `FileFilter`?
Интерфейс `FileFilter` применяется для проверки, попадает ли объект `File` под некоторое условие. Этот интерфейс содержит единственный метод `boolean accept(File pathName)`. Этот метод необходимо переопределить и реализовать. Например:
```java
@ -216,12 +216,12 @@ public boolean accept(final File file) {
[к оглавлению](#Потоки-вводавывода-в-java)
##Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?
## Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?
Метод `File.listFiles()` возвращает массив объектов `File`, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего `FileFilter`. Это позволяет включить список только те элементы, для которые метода `accept` возвращает `true` (критерием может быть длина имени файла или его расширение).
[к оглавлению](#Потоки-вводавывода-в-java)
##Что вы знаете о `RandomAccessFile`?
## Что вы знаете о `RandomAccessFile`?
Класс `java.io.RandomAccessFile` обеспечивает чтение и запись данных в произвольном месте файла. Он не является частью иерархии `InputStream` или `OutputStream`. Это полностью отдельный класс, имеющий свои собственные (в большинстве своем _native_) методы. Объяснением этого может быть то, что `RandomAccessFile` имеет во многом отличающееся поведение по сравнению с остальными классами ввода/вывода так как позволяет, в пределах файла, перемещаться вперед и назад.
`RandomAccessFile` имеет такие специфические методы как:
@ -239,7 +239,7 @@ public boolean accept(final File file) {
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие режимы доступа к файлу есть у `RandomAccessFile`?
## Какие режимы доступа к файлу есть у `RandomAccessFile`?
+ `"r"` открывает файл только для чтения. Запуск любых методов записи данных приведет к выбросу исключения `IOException`.
+ `"rw"` открывает файл для чтения и записи. Если файл еще не создан, то осуществляется попытка создать его.
+ `"rws"` открывает файл для чтения и записи подобно `"rw"`, но требует от системы при каждом изменении содержимого файла или метаданных синхронно записывать эти изменения на физический носитель.
@ -247,7 +247,7 @@ public boolean accept(final File file) {
[к оглавлению](#Потоки-вводавывода-в-java)
##Какие классы поддерживают чтение и запись потоков в компрессированном формате?
## Какие классы поддерживают чтение и запись потоков в компрессированном формате?
+ `DeflaterOutputStream` - компрессия данных в формате deflate.
+ `Deflater` - компрессия данных в формат ZLIB
+ `ZipOutputStream` - потомок `DeflaterOutputStream` для компрессии данных в формат Zip.
@ -259,7 +259,7 @@ public boolean accept(final File file) {
[к оглавлению](#Потоки-вводавывода-в-java)
##Существует ли возможность перенаправить потоки стандартного ввода/вывода?
## Существует ли возможность перенаправить потоки стандартного ввода/вывода?
Класс `System` позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода:
+ `setIn(InputStream)` - для ввода;
@ -268,21 +268,21 @@ public boolean accept(final File file) {
[к оглавлению](#Потоки-вводавывода-в-java)
##Какой символ является разделителем при указании пути в файловой системе?
## Какой символ является разделителем при указании пути в файловой системе?
Для различных операционных систем символ разделителя различается. Для Windows это `\`, для Linux - `/`.
В Java получить разделитель для текущей операционной системы можно через обращение к статическому полю `File.separator`.
[к оглавлению](#Потоки-вводавывода-в-java)
##Что такое абсолютный путь»_ и относительный путь»_?
## Что такое абсолютный путь»_ и относительный путь»_?
__Абсолютный (полный) путь__ — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога.
__Относительный путь__ представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения.
[к оглавлению](#Потоки-вводавывода-в-java)
##Что такое символьная ссылка»_?
## Что такое символьная ссылка»_?
__Символьная (символическая) ссылка__ (также «симлинк», Symbolic link) — специальный файл в файловой системе, в котором, вместо пользовательских данных, содержится путь к файлу, который должен быть открыт при попытке обратиться к данной ссылке (файлу). Целью ссылки может быть любой объект: например, другая ссылка, файл, каталог или даже несуществующий файл (в последнем случае, при попытке открыть его, должно выдаваться сообщение об отсутствии файла).
Символьные ссылки используются для более удобной организации структуры файлов на компьютере, так как:
@ -298,4 +298,4 @@ __Символьная (символическая) ссылка__ (также
+ [Освой программирование играючи](http://developer.alexanderklimov.ru/android/java/io.php)
+ [Metanit](http://metanit.com/java/tutorial/6.1.php)
+ [javastudy.ru](http://javastudy.ru/interview/input-output/)
+ [Bruce Eckel «Thinking in Java»](http://iais.kemsu.ru/odocs/java/Chapter11.html)
+ [Bruce Eckel «Thinking in Java»](http://iais.kemsu.ru/odocs/java/Chapter11.html)

128
java8.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Java 8
# Java 8
+ [Какие нововведения, появились в Java 8 и JDK 8?](#Какие-нововведения-появились-в-java-8-и-jdk-8)
+ [Что такое _«лямбда»_? Какова структура и особенности использования лямбда-выражения?](#Что-такое-лямбда-Какова-структура-и-особенности-использования-лямбда-выражения)
+ [К каким переменным есть доступ у лямбда-выражений?](#К-каким-переменным-есть-доступ-у-лямбда-выражений)
@ -64,7 +64,7 @@
+ [Какой класс появился в Java 8 для кодирования/декодирования данных?](#Какой-класс-появился-в-java-8-для-кодированиядекодирования-данных)
+ [Как создать Base64 кодировщик и декодировщик?](#Как-создать-base64-кодировщик-и-декодировщик)
##Какие нововведения, появились в Java 8 и JDK 8?
## Какие нововведения, появились в Java 8 и JDK 8?
+ Методы интерфейсов по умолчанию;
+ Лямбда-выражения;
+ Функциональные интерфейсы;
@ -97,7 +97,7 @@
[к оглавлению](#java-8)
##Что такое _«лямбда»_? Какова структура и особенности использования лямбда-выражения?
## Что такое _«лямбда»_? Какова структура и особенности использования лямбда-выражения?
__Лямбда__ представляет собой набор инструкций, которые можно выделить в отдельную переменную и затем многократно вызвать в различных местах программы.
Основу лямбда-выражения составляет _лямбда-оператор_, который представляет стрелку `->`. Этот оператор разделяет лямбда-выражение на две части: левая часть содержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия.
@ -182,7 +182,7 @@ public static void main(String[] args) {
[к оглавлению](#java-8)
##К каким переменным есть доступ у лямбда-выражений?
## К каким переменным есть доступ у лямбда-выражений?
Доступ к переменным внешней области действия из лямбда-выражения очень схож к доступу из анонимных объектов. Можно ссылаться на:
+ неизменяемые (_effectively final_ - не обязательно помеченные как `final`) локальные переменные;
@ -193,7 +193,7 @@ public static void main(String[] args) {
[к оглавлению](#java-8)
##Как отсортировать список строк с помощью лямбда-выражения?
## Как отсортировать список строк с помощью лямбда-выражения?
```java
public static List<String> sort(List<String> list){
Collections.sort(list, (a, b) -> a.compareTo(b));
@ -203,7 +203,7 @@ public static List<String> sort(List<String> list){
[к оглавлению](#java-8)
##Что такое «ссылка на метод»?
## Что такое «ссылка на метод»?
Если существующий в классе метод уже делает все, что необходимо, то можно воспользоваться механизмом __method reference (ссылка на метод)__ для непосредственной передачи этого метода. Такая ссылка передается в виде:
+ `имя_класса::имя_статическогоетода` для статического метода;
@ -227,19 +227,19 @@ public static void main(String[] args) {
[к оглавлению](#java-8)
##Какие виды ссылок на методы вы знаете?
## Какие виды ссылок на методы вы знаете?
+ на статический метод;
+ на метод экземпляра;
+ на конструктор.
[к оглавлению](#java-8)
##Объясните выражение `System.out::println`.
## Объясните выражение `System.out::println`.
Заданное выражение иллюстрирует передачу ссылки на статический метод `println()` класса `System.out`.
[к оглавлению](#java-8)
##Что такое «функциональные интерфейсы»?
## Что такое «функциональные интерфейсы»?
__Функциональный интерфейс__ - это интерфейс, который определяет только один абстрактный метод.
Чтобы точно определить интерфейс как функциональный, добавлена аннотация `@FunctionalInterface`, работающая по принципу `@Override`. Она обозначит замысел и не даст определить второй абстрактный метод в интерфейсе.
@ -248,7 +248,7 @@ __Функциональный интерфейс__ - это интерфейс,
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `Function<T,R>`, `DoubleFunction<R>`, `IntFunction<R>` и `LongFunction<R>`?
## Для чего нужны функциональные интерфейсы `Function<T,R>`, `DoubleFunction<R>`, `IntFunction<R>` и `LongFunction<R>`?
__`Function<T, R>`__ - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса `T` и возвращающая на выходе экземпляр класса `R`.
Методы по умолчанию могут использоваться для построения цепочек вызовов (`compose`, `andThen`).
@ -265,7 +265,7 @@ backToString.apply("123"); // "123"
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `UnaryOperator<T>`, `DoubleUnaryOperator`, `IntUnaryOperator` и `LongUnaryOperator`?
## Для чего нужны функциональные интерфейсы `UnaryOperator<T>`, `DoubleUnaryOperator`, `IntUnaryOperator` и `LongUnaryOperator`?
__`UnaryOperator<T>` (унарный оператор)__ принимает в качестве параметра объект типа `T`, выполняет над ними операции и возвращает результат операций в виде объекта типа `T`:
```java
@ -279,7 +279,7 @@ System.out.println(operator.apply(5)); // 25
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `BinaryOperator<T>`, `DoubleBinaryOperator`, `IntBinaryOperator` и `LongBinaryOperator`?
## Для чего нужны функциональные интерфейсы `BinaryOperator<T>`, `DoubleBinaryOperator`, `IntBinaryOperator` и `LongBinaryOperator`?
__`BinaryOperator<T>` (бинарный оператор)__ - интерфейс, с помощью которого реализуется функция, получающая на вход два экземпляра класса `T` и возвращающая на выходе экземпляр класса `T`.
```java
BinaryOperator<Integer> operator = (a, b) -> a + b;
@ -292,7 +292,7 @@ System.out.println(operator.apply(1, 2)); // 3
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `Predicate<T>`, `DoublePredicate`, `IntPredicate` и `LongPredicate`?
## Для чего нужны функциональные интерфейсы `Predicate<T>`, `DoublePredicate`, `IntPredicate` и `LongPredicate`?
__`Predicate<T>` (предикат)__ - интерфейс, с помощью которого реализуется функция, получающая на вход экземпляр класса `T` и возвращающая на выходе значение типа `boolean`.
Интерфейс содержит различные методы по умолчанию, позволяющие строить сложные условия (`and`, `or`, `negate`).
@ -309,7 +309,7 @@ predicate.negate().test("foo"); // false
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `Consumer<T>`, `DoubleConsumer`, `IntConsumer` и `LongConsumer`?
## Для чего нужны функциональные интерфейсы `Consumer<T>`, `DoubleConsumer`, `IntConsumer` и `LongConsumer`?
__`Consumer<T>` (потребитель)__ - интерфейс, с помощью которого реализуется функция, которая получает на вход экземпляр класса `T`, производит с ним некоторое действие и ничего не возвращает.
```java
@ -323,7 +323,7 @@ hello.accept("world");
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `Supplier<T>`, `BooleanSupplier`, `DoubleSupplier`, `IntSupplier` и `LongSupplier`?
## Для чего нужны функциональные интерфейсы `Supplier<T>`, `BooleanSupplier`, `DoubleSupplier`, `IntSupplier` и `LongSupplier`?
__`Supplier<T>` (поставщик)__ - интерфейс, с помощью которого реализуется функция, ничего не принимающая на вход, но возвращающая на выход результат класса `T`;
```java
@ -337,22 +337,22 @@ now.get();
[к оглавлению](#java-8)
##Для чего нужен функциональный интерфейс `BiConsumer<T,U>`?
## Для чего нужен функциональный интерфейс `BiConsumer<T,U>`?
__`BiConsumer<T,U>`__ представляет собой операцию, которая принимает два аргумента классов `T` и `U` производит с ними некоторое действие и ничего не возвращает.
[к оглавлению](#java-8)
##Для чего нужен функциональный интерфейс `BiFunction<T,U,R>`?
## Для чего нужен функциональный интерфейс `BiFunction<T,U,R>`?
__`BiFunction<T,U,R>`__ представляет собой операцию, которая принимает два аргумента классов `T` и `U` и возвращающая результат класса `R`.
[к оглавлению](#java-8)
##Для чего нужен функциональный интерфейс `BiPredicate<T,U>`?
## Для чего нужен функциональный интерфейс `BiPredicate<T,U>`?
__`BiPredicate<T,U>`__ представляет собой операцию, которая принимает два аргумента классов `T` и `U` и возвращающая результат типа `boolean`.
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы вида `_To_Function`?
## Для чего нужны функциональные интерфейсы вида `_To_Function`?
+ `DoubleToIntFunction` - операция принимающая аргумент класса `Double` и возвращающая результат типа `Integer`;
+ `DoubleToLongFunction` - операция принимающая аргумент класса `Double` и возвращающая результат типа `Long`;
+ `IntToDoubleFunction` - операция принимающая аргумент класса `Integer` и возвращающая результат типа `Double`;
@ -362,28 +362,28 @@ __`BiPredicate<T,U>`__ представляет собой операцию, к
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `ToDoubleBiFunction<T,U>`, `ToIntBiFunction<T,U>` и `ToLongBiFunction<T,U>`?
## Для чего нужны функциональные интерфейсы `ToDoubleBiFunction<T,U>`, `ToIntBiFunction<T,U>` и `ToLongBiFunction<T,U>`?
+ `ToDoubleBiFunction<T,U>` - операция принимающая два аргумента классов `T` и `U` и возвращающая результат типа `Double`;
+ `ToLongBiFunction<T,U>` - операция принимающая два аргумента классов `T` и `U` и возвращающая результат типа `Long`;
+ `ToIntBiFunction<T,U>` - операция принимающая два аргумента классов `T` и `U` и возвращающая результат типа `Integer`.
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `ToDoubleFunction<T>`, `ToIntFunction<T>` и `ToLongFunction<T>`?
## Для чего нужны функциональные интерфейсы `ToDoubleFunction<T>`, `ToIntFunction<T>` и `ToLongFunction<T>`?
+ `ToDoubleFunction<T>` - операция принимающая аргумент класса `T` и возвращающая результат типа `Double`;
+ `ToLongFunction<T>` - операция принимающая аргумент класса `T` и возвращающая результат типа `Long`;
+ `ToIntFunction<T>` - операция принимающая аргумент класса `T` и возвращающая результат типа `Integer`.
[к оглавлению](#java-8)
##Для чего нужны функциональные интерфейсы `ObjDoubleConsumer<T>`, `ObjIntConsumer<T>` и `ObjLongConsumer<T>`?
## Для чего нужны функциональные интерфейсы `ObjDoubleConsumer<T>`, `ObjIntConsumer<T>` и `ObjLongConsumer<T>`?
+ `ObjDoubleConsumer<T>` - операция, которая принимает два аргумента классов `T` и `Double`, производит с ними некоторое действие и ничего не возвращает;
+ `ObjLongConsumer<T>` - операция, которая принимает два аргумента классов `T` и `Long`, производит с ними некоторое действие и ничего не возвращает;
+ `ObjIntConsumer<T>` - операция, которая принимает два аргумента классов `T` и `Integer`, производит с ними некоторое действие и ничего не возвращает.
[к оглавлению](#java-8)
##Что такое `StringJoiner`?
## Что такое `StringJoiner`?
Класс `StringJoiner` используется, чтобы создать последовательность строк, разделенных разделителем с возможностью присоединить к полученной строке префикс и суффикс:
```java
@ -396,7 +396,7 @@ System.out.println(joiner); //prefix-Hello.the.brave.world-suffix
[к оглавлению](#java-8)
##Что такое `default` методы интрефейса?
## Что такое `default` методы интрефейса?
Java 8 позволяет добавлять неабстрактные реализации методов в интерфейс, используя ключевое слово `default`:
```java
@ -418,7 +418,7 @@ interface Example {
[к оглавлению](#java-8)
##Как вызывать `default` метод интерфейса в реализующем этот интерфейс классе?
## Как вызывать `default` метод интерфейса в реализующем этот интерфейс классе?
Используя ключевое слово `super` вместе с именем интерфейса:
```java
@ -437,7 +437,7 @@ class Licence implements Paper {
[к оглавлению](#java-8)
##Что такое `static` метод интерфейса?
## Что такое `static` метод интерфейса?
Статические методы интерфейса похожи на методы по умолчанию, за исключением того, что для них отсутствует возможность переопределения в классах, реализующих интерфейс.
+ Статические методы в интерфейсе являются частью интерфейса без возможности использовать их для объектов класса реализации;
@ -446,7 +446,7 @@ class Licence implements Paper {
[к оглавлению](#java-8)
##Как вызывать `static` метод интерфейса?
## Как вызывать `static` метод интерфейса?
Используя имя интерфейса:
```java
@ -465,7 +465,7 @@ class Licence {
[к оглавлению](#java-8)
##Что такое `Optional`?
## Что такое `Optional`?
Опциональное значение `Optional` — это контейнер для объекта, который может содержать или не содержать значение `null`. Такая обёртка является удобным средством предотвращения `NullPointerException`, т.к.
имеет некоторые функции высшего порядка, избавляющие от добавления повторяющихся `if null/notNull` проверок:
@ -480,7 +480,7 @@ optional.orElse("ops..."); // "hello"
[к оглавлению](#java-8)
##Что такое `Stream`?
## Что такое `Stream`?
Интерфейс `java.util.Stream` представляет собой последовательность элементов, над которой можно производить различные операции.
Операции над стримами бывают или _промежуточными (intermediate)_ или онечными (terminal)_. Конечные операции возвращают результат определенного типа, а промежуточные операции возвращают тот же стрим. Таким образом вы можете строить цепочки из несколько операций над одним и тем же стримом.
@ -502,7 +502,7 @@ optional.orElse("ops..."); // "hello"
[к оглавлению](#java-8)
##Какие существуют способы создания стрима?
## Какие существуют способы создания стрима?
1. Из коллекции:
```java
Stream<String> fromCollection = Arrays.asList("x", "y", "z").stream();
@ -538,12 +538,12 @@ Stream<String> fromGenerate = Stream.generate(() -> "0");
[к оглавлению](#java-8)
##В чем разница между `Collection` и `Stream`?
## В чем разница между `Collection` и `Stream`?
Коллекции позволяют работать с элементами по-отдельности, тогда как стримы так делать не позволяет, но вместо этого предоставляет возможность выполнять функции над данными как над одним целым.
[к оглавлению](#java-8)
##Для чего нужен метод `collect()` в стримах?
## Для чего нужен метод `collect()` в стримах?
Метод `collect()` является конечной операцией, которая используется для представление результата в виде коллекции или какой-либо другой структуры данных.
`collect()` принимает на вход `Collector<Тип_источника, Тип_аккумулятора, Тип_результата>`, который содержит четыре этапа: _supplier_ - инициализация аккумулятора, _accumulator_ - обработка каждого элемента, _combiner_ - соединение двух аккумуляторов при параллельном выполнении, _[finisher]_ - необязательный метод последней обработки аккумулятора. В Java 8 в классе `Collectors` реализовано несколько распространённых коллекторов:
@ -569,13 +569,13 @@ Collector<String, List<String>, List<String>> toList = Collector.of(
[к оглавлению](#java-8)
##Для чего в стримах применяются методы `forEach()` и `forEachOrdered()`?
## Для чего в стримах применяются методы `forEach()` и `forEachOrdered()`?
+ `forEach()` применяет функцию к каждому объекту стрима, порядок при параллельном выполнении не гарантируется;
+ `forEachOrdered()` применяет функцию к каждому объекту стрима с сохранением порядка элементов.
[к оглавлению](#java-8)
##Для чего в стримах предназначены методы `map()` и `mapToInt()`, `mapToDouble()`, `mapToLong()`?
## Для чего в стримах предназначены методы `map()` и `mapToInt()`, `mapToDouble()`, `mapToLong()`?
Метод `map()` является промежуточной операцией, которая заданным образом преобразует каждый элемент стрима.
`mapToInt()`, `mapToDouble()`, `mapToLong()` - аналоги `map()`, возвращающие соответствующий числовой стрим (то есть стрим из числовых примитивов):
@ -588,24 +588,24 @@ Stream
```
[к оглавлению](#java-8)
##Какова цель метода `filter()` в стримах?
## Какова цель метода `filter()` в стримах?
Метод `filter()` является промежуточной операцией принимающей предикат, который фильтрует все элементы, возвращая только те, что соответствуют условию.
[к оглавлению](#java-8)
##Для чего в стримах предназначен метод `limit()`?
## Для чего в стримах предназначен метод `limit()`?
Метод `limit()` является промежуточной операцией, которая позволяет ограничить выборку определенным количеством первых элементов.
[к оглавлению](#java-8)
##Для чего в стримах предназначен метод `sorted()`?
## Для чего в стримах предназначен метод `sorted()`?
Метод `sorted()` является промежуточной операцией, которая позволяет сортировать значения либо в натуральном порядке, либо задавая `Comparator`.
Порядок элементов в исходной коллекции остается нетронутым - `sorted()` всего лишь создает его отсортированное представление.
[к оглавлению](#java-8)
##Для чего в стримах предназначены методы `flatMap()`, `flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()`?
## Для чего в стримах предназначены методы `flatMap()`, `flatMapToInt()`, `flatMapToDouble()`, `flatMapToLong()`?
Метод `flatMap()` похож на map, но может создавать из одного элемента несколько. Таким образом, каждый объект будет преобразован в ноль, один или несколько других объектов, поддерживаемых потоком. Наиболее очевидный способ применения этой операции — преобразование элементов контейнера при помощи функций, которые возвращают контейнеры.
```java
@ -619,7 +619,7 @@ Stream
[к оглавлению](#java-8)
##Расскажите о параллельной обработке в Java 8.
## Расскажите о параллельной обработке в Java 8.
Стримы могут быть последовательными и параллельными. Операции над последовательными стримами выполняются в одном потоке процессора, над параллельными — используя несколько потоков процессора. Параллельные стримы используют общий `ForkJoinPool` доступный через статический `ForkJoinPool.commonPool()` метод. При этом, если окружение не является многоядерным, то поток будет выполняться как последовательный. Фактически применение параллельных стримов сводится к тому, что данные в стримах будут разделены на части, каждая часть обрабатывается на отдельном ядре процессора, и в конце эти части соединяются, и над ними выполняются конечные операции.
Для создания параллельного потока из коллекции можно также использовать метод `parallelStream()` интерфейса `Collection`.
@ -658,7 +658,7 @@ collection.parallelStream()
[к оглавлению](#java-8)
##Какие конечные методы работы со стримами вы знаете?
## Какие конечные методы работы со стримами вы знаете?
+ `findFirst()` возвращает первый элемент;
+ `findAny()` возвращает любой подходящий элемент;
+ `collect()` представление результатов в виде коллекций и других структур данных;
@ -680,7 +680,7 @@ collection.parallelStream()
[к оглавлению](#java-8)
##Какие промежуточные методы работы со стримами вы знаете?
## Какие промежуточные методы работы со стримами вы знаете?
+ `filter()` отфильтровывает записи, возвращая только записи, соответствующие условию;
+ `skip()` позволяет пропустить определённое количество элементов в начале;
+ `distinct()` возвращает стрим без дубликатов (для метода `equals()`);
@ -695,7 +695,7 @@ collection.parallelStream()
[к оглавлению](#java-8)
##Как вывести на экран 10 случайных чисел, используя `forEach()`?
## Как вывести на экран 10 случайных чисел, используя `forEach()`?
```java
(new Random())
.ints()
@ -705,7 +705,7 @@ collection.parallelStream()
[к оглавлению](#java-8)
##Как можно вывести на экран уникальные квадраты чисел используя метод `map()`?
## Как можно вывести на экран уникальные квадраты чисел используя метод `map()`?
```java
Stream
.of(1, 2, 3, 2, 1)
@ -717,7 +717,7 @@ Stream
[к оглавлению](#java-8)
##Как вывести на экран количество пустых строк с помощью метода `filter()`?
## Как вывести на экран количество пустых строк с помощью метода `filter()`?
```java
System.out.println(
Stream
@ -728,7 +728,7 @@ System.out.println(
[к оглавлению](#java-8)
##Как вывести на экран 10 случайных чисел в порядке возрастания?
## Как вывести на экран 10 случайных чисел в порядке возрастания?
```java
(new Random())
.ints()
@ -739,7 +739,7 @@ System.out.println(
[к оглавлению](#java-8)
##Как найти максимальное число в наборе?
## Как найти максимальное число в наборе?
```java
Stream
.of(5, 3, 4, 55, 2)
@ -750,7 +750,7 @@ Stream
[к оглавлению](#java-8)
##Как найти минимальное число в наборе?
## Как найти минимальное число в наборе?
```java
Stream
.of(5, 3, 4, 55, 2)
@ -760,7 +760,7 @@ Stream
```
[к оглавлению](#java-8)
##Как получить сумму всех чисел в наборе?
## Как получить сумму всех чисел в наборе?
```java
Stream
.of(5, 3, 4, 55, 2)
@ -769,7 +769,7 @@ Stream
```
[к оглавлению](#java-8)
##Как получить среднее значение всех чисел?
## Как получить среднее значение всех чисел?
```java
Stream
.of(5, 3, 4, 55, 2)
@ -779,7 +779,7 @@ Stream
```
[к оглавлению](#java-8)
##Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8?
## Какие дополнительные методы для работы с ассоциативными массивами (maps) появились в Java 8?
+ `putIfAbsent()` добавляет пару «ключ-значение», только если ключ отсутствовал:
`map.putIfAbsent("a", "Aa");`
@ -810,24 +810,24 @@ Stream
[к оглавлению](#java-8)
##Что такое `LocalDateTime`?
## Что такое `LocalDateTime`?
`LocalDateTime` объединяет вместе `LocaleDate` и `LocalTime`, содержит дату и время в календарной системе ISO-8601 без привязки к часовому поясу. Время хранится с точностью до наносекунды. Содержит множество удобных методов, таких как plusMinutes, plusHours, isAfter, toSecondOfDay и т.д.
[к оглавлению](#java-8)
##Что такое `ZonedDateTime`?
## Что такое `ZonedDateTime`?
`java.time.ZonedDateTime` — аналог `java.util.Calendar`, класс с самым полным объемом информации о временном контексте в календарной системе ISO-8601. Включает временную зону, поэтому все операции с временными сдвигами этот класс проводит с её учётом.
[к оглавлению](#java-8)
##Как получить текущую дату с использованием Date Time API из Java 8?
## Как получить текущую дату с использованием Date Time API из Java 8?
```java
LocalDate.now();
```
[к оглавлению](#java-8)
##Как добавить 1 неделю, 1 месяц, 1 год, 10 лет к текущей дате с использованием Date Time API?
## Как добавить 1 неделю, 1 месяц, 1 год, 10 лет к текущей дате с использованием Date Time API?
```java
LocalDate.now().plusWeeks(1);
LocalDate.now().plusMonths(1);
@ -837,14 +837,14 @@ LocalDate.now().plus(1, ChronoUnit.DECADES);
[к оглавлению](#java-8)
##Как получить следующий вторник используя Date Time API?
## Как получить следующий вторник используя Date Time API?
```java
LocalDate.now().with(TemporalAdjusters.next(DayOfWeek.TUESDAY));
```
[к оглавлению](#java-8)
##Как получить вторую субботу текущего месяца используя Date Time API?
## Как получить вторую субботу текущего месяца используя Date Time API?
```java
LocalDate
.of(LocalDate.now().getYear(), LocalDate.now().getMonth(), 1)
@ -854,21 +854,21 @@ LocalDate
[к оглавлению](#java-8)
##Как получить текущее время с точностью до миллисекунд используя Date Time API?
## Как получить текущее время с точностью до миллисекунд используя Date Time API?
```java
new Date().toInstant();
```
[к оглавлению](#java-8)
##Как получить текущее время по местному времени с точностью до миллисекунд используя Date Time API?
## Как получить текущее время по местному времени с точностью до миллисекунд используя Date Time API?
```java
LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
```
[к оглавлению](#java-8)
##Как определить повторяемую аннотацию?
## Как определить повторяемую аннотацию?
Чтобы определить повторяемую аннотацию, необходимо создать аннотацию-контейнер для списка повторяемых аннотаций и обозначить повторяемую мета-аннотацией `@Repeatable`:
```java
@ -886,17 +886,17 @@ LocalDateTime.ofInstant(new Date().toInstant(), ZoneId.systemDefault());
[к оглавлению](#java-8)
##Что такое `Nashorn`?
## Что такое `Nashorn`?
__Nashorn__ - это движок JavaScript, разрабатываемый на Java компанией Oracle. Призван дать возможность встраивать код JavaScript в приложения Java. В сравнении с _Rhino_, который поддерживается Mozilla Foundation, Nashorn обеспечивает от 2 до 10 раз более высокую производительность, так как он компилирует код и передает байт-код виртуальной машине Java непосредственно в памяти. Nashorn умеет компилировать код JavaScript и генерировать классы Java, которые загружаются специальным загрузчиком. Так же возможен вызов кода Java прямо из JavaScript.
[к оглавлению](#java-8)
##Что такое `jjs`?
## Что такое `jjs`?
`jjs` это утилита командной строки, которая позволяет исполнять программы на языке JavaScript прямо в консоли.
[к оглавлению](#java-8)
##Какой класс появился в Java 8 для кодирования/декодирования данных?
## Какой класс появился в Java 8 для кодирования/декодирования данных?
`Base64` - потокобезопасный класс, который реализует кодировщик и декодировщик данных, используя схему кодирования base64 согласно _RFC 4648_ и _RFC 2045_.
Base64 содержит 6 основных методов:
@ -907,7 +907,7 @@ Base64 содержит 6 основных методов:
[к оглавлению](#java-8)
##Как создать Base64 кодировщик и декодировщик?
## Как создать Base64 кодировщик и декодировщик?
```java
// Encode
String b64 = Base64.getEncoder().encodeToString("input".getBytes("utf-8")); //aW5wdXQ==
@ -921,4 +921,4 @@ new String(Base64.getDecoder().decode("aW5wdXQ=="), "utf-8"); //input
+ [Хабрахабр - Новое в Java 8](https://habrahabr.ru/post/216431/)
+ [Хабрахабр - Шпаргалка Java программиста 4. Java Stream API](https://habrahabr.ru/company/luxoft/blog/270383/)
+ [METANIT.COM](http://metanit.com/java/tutorial/9.1.php)
+ [javadevblog.com](http://javadevblog.com/interfejsy-v-java-8-staticheskie-metody-metody-po-umolchaniyu-funktsional-ny-e-interfejsy.html)
+ [javadevblog.com](http://javadevblog.com/interfejsy-v-java-8-staticheskie-metody-metody-po-umolchaniyu-funktsional-ny-e-interfejsy.html)

176
jcf.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Java Collections Framework
# Java Collections Framework
+ [Что такое _«коллекция»_?](#Что-такое-коллекция)
+ [Назовите основные интерфейсы JCF и их реализации.](#Назовите-основные-интерфейсы-jcf-и-их-реализации)
+ [Расположите в виде иерархии следующие интерфейсы: `List`, `Set`, `Map`, `SortedSet`, `SortedMap`, `Collection`, `Iterable`, `Iterator`, `NavigableSet`, `NavigableMap`.](#Расположите-в-виде-иерархии-следующие-интерфейсы-list-set-map-sortedset-sortedmap-collection-iterable-iterator-navigableset-navigablemap)
@ -89,12 +89,12 @@
+ [Сделайте `HashSet` из ключей `HashMap`.](#Сделайте-hashset-из-ключей-hashmap)
+ [Сделайте `HashMap` из `HashSet<Map.Entry<K, V>>`.](#Сделайте-hashmap-из-hashsetmapentryk-v)
##Что такое _«коллекция»_?
## Что такое _«коллекция»_?
Коллекция»_ - это структура данных, набор каких-либо объектов. Данными (объектами в наборе) могут быть числа, строки, объекты пользовательских классов и т.п.
[к оглавлению](#java-collections-framework)
##Назовите основные интерфейсы JCF и их реализации.
## Назовите основные интерфейсы JCF и их реализации.
На вершине иерархии в Java Collection Framework располагаются 2 интерфейса: `Collection` и `Map`. Эти интерфейсы разделяют все коллекции, входящие во фреймворк на две части по типу хранения данных: простые последовательные наборы элементов и наборы пар «ключ — значение» соответственно.
Интерфейс `Collection` расширяют интерфейсы:
@ -122,7 +122,7 @@ _«Коллекция»_ - это структура данных, набор к
[к оглавлению](#java-collections-framework)
##Расположите в виде иерархии следующие интерфейсы: `List`, `Set`, `Map`, `SortedSet`, `SortedMap`, `Collection`, `Iterable`, `Iterator`, `NavigableSet`, `NavigableMap`.
## Расположите в виде иерархии следующие интерфейсы: `List`, `Set`, `Map`, `SortedSet`, `SortedMap`, `Collection`, `Iterable`, `Iterator`, `NavigableSet`, `NavigableMap`.
+ `Iterable`
+ `Collection`
+ `List`
@ -136,19 +136,19 @@ _«Коллекция»_ - это структура данных, набор к
[к оглавлению](#java-collections-framework)
##Почему `Map` — это не `Collection`, в то время как `List` и `Set` являются `Collection`?
## Почему `Map` — это не `Collection`, в то время как `List` и `Set` являются `Collection`?
`Collection` представляет собой совокупность некоторых элементов. `Map` - это совокупность пар «ключ-значение».
[к оглавлению](#java-collections-framework)
##В чем разница между классами `java.util.Collection` и `java.util.Collections`?
## В чем разница между классами `java.util.Collection` и `java.util.Collections`?
`java.util.Collections` - набор статических методов для работы с коллекциями.
`java.util.Collection` - один из основных интерфейсов Java Collections Framework.
[к оглавлению](#java-collections-framework)
##Что такое «fail-fast поведение»?
## Что такое «fail-fast поведение»?
__fail-fast поведение__ означает, что при возникновении ошибки или состояния, которое может привести к ошибке, система немедленно прекращает дальнейшую работу и уведомляет об этом. Использование fail-fast подхода позволяет избежать недетерминированного поведения программы в течение времени.
В Java Collections API некоторые итераторы ведут себя как fail-fast и выбрасывают `ConcurrentModificationException`, если после его создания была произведена модификация коллекции, т.е. добавлен или удален элемент напрямую из коллекции, а не используя методы итератора.
@ -161,17 +161,17 @@ __fail-fast поведение__ означает, что при возникн
[к оглавлению](#java-collections-framework)
##Какая разница между fail-fast и fail-safe?
## Какая разница между fail-fast и fail-safe?
В противоположность fail-fast, итераторы fail-safe не вызывают никаких исключений при изменении структуры, потому что они работают с клоном коллекции вместо оригинала.
[к оглавлению](#java-collections-framework)
##Приведите примеры итераторов реализующих поведение fail-safe
## Приведите примеры итераторов реализующих поведение fail-safe
Итератор коллекции `CopyOnWriteArrayList` и итератор представления `keySet` коллекции `ConcurrentHashMap` являются примерами итераторов fail-safe.
[к оглавлению](#java-collections-framework)
##Чем различаются `Enumeration` и `Iterator`.
## Чем различаются `Enumeration` и `Iterator`.
Хотя оба интерфейса и предназначены для обхода коллекций между ними имеются существенные различия:
+ с помощью `Enumeration` нельзя добавлять/удалять элементы;
@ -180,17 +180,17 @@ __fail-fast поведение__ означает, что при возникн
[к оглавлению](#java-collections-framework)
##Как между собой связаны `Iterable` и `Iterator`?
## Как между собой связаны `Iterable` и `Iterator`?
Интерфейс `Iterable` имеет только один метод - `iterator()`, который возвращает `Iterator`.
[к оглавлению](#java-collections-framework)
##Как между собой связаны `Iterable`, `Iterator` и «for-each»?
## Как между собой связаны `Iterable`, `Iterator` и «for-each»?
Классы, реализующие интерфейс `Iterable`, могут применяться в конструкции `for-each`, которая использует `Iterator`.
[к оглавлению](#java-collections-framework)
##Сравните `Iterator` и `ListIterator`.
## Сравните `Iterator` и `ListIterator`.
+ `ListIterator` расширяет интерфейс `Iterator`
+ `ListIterator` может быть использован только для перебора элементов коллекции `List`;
+ `Iterator` позволяет перебирать элементы только в одном направлении, при помощи метода `next()`. Тогда как `ListIterator` позволяет перебирать список в обоих направлениях, при помощи методов `next()` и `previous()`;
@ -199,27 +199,27 @@ __fail-fast поведение__ означает, что при возникн
[к оглавлению](#java-collections-framework)
##Что произойдет при вызове `Iterator.next()` без предварительного вызова `Iterator.hasNext()`?
## Что произойдет при вызове `Iterator.next()` без предварительного вызова `Iterator.hasNext()`?
Если итератор указывает на последний элемент коллекции, то возникнет исключение `NoSuchElementException`, иначе будет возвращен следующий элемент.
[к оглавлению](#java-collections-framework)
##Сколько элементов будет пропущено, если `Iterator.next()` будет вызван после 10-ти вызовов `Iterator.hasNext()`?
## Сколько элементов будет пропущено, если `Iterator.next()` будет вызван после 10-ти вызовов `Iterator.hasNext()`?
Нисколько - `hasNext()` осуществляет только проверку наличия следующего элемента.
[к оглавлению](#java-collections-framework)
##Как поведёт себя коллекция, если вызвать `iterator.remove()`?
## Как поведёт себя коллекция, если вызвать `iterator.remove()`?
Если вызову `iterator.remove()` предшествовал вызов `iterator.next()`, то `iterator.remove()` удалит элемент коллекции, на который указывает итератор, в противном случае будет выброшено `IllegalStateException()`.
[к оглавлению](#java-collections-framework)
##Как поведёт себя уже инстанциированный итератор для `collection`, если вызвать `collection.remove()`?
## Как поведёт себя уже инстанциированный итератор для `collection`, если вызвать `collection.remove()`?
При следующем вызове методов итератора будет выброшено `ConcurrentModificationException`.
[к оглавлению](#java-collections-framework)
##Как избежать `ConcurrentModificationException` во время перебора коллекции?
## Как избежать `ConcurrentModificationException` во время перебора коллекции?
+ Попробовать подобрать другой итератор, работающий по принципу fail-safe. К примеру, для `List` можно использовать `ListIterator`.
+ Использовать `ConcurrentHashMap` и `CopyOnWriteArrayList`.
+ Преобразовать список в массив и перебирать массив.
@ -229,18 +229,18 @@ __fail-fast поведение__ означает, что при возникн
[к оглавлению](#java-collections-framework)
##Какая коллекция реализует дисциплину обслуживания FIFO?
## Какая коллекция реализует дисциплину обслуживания FIFO?
FIFO, First-In-First-Out («первым пришел-первым ушел») - по этому принципу построена коллекция `Queue`.
[к оглавлению](#java-collections-framework)
##Какая коллекция реализует дисциплину обслуживания FILO?
## Какая коллекция реализует дисциплину обслуживания FILO?
FILO, First-In-Last-Out («первым пришел, последним ушел») - по этому принципу построена коллекция `Stack`.
[к оглавлению](#java-collections-framework)
##Чем отличается `ArrayList` от `Vector`?
##Зачем добавили `ArrayList`, если уже был `Vector`?
## Чем отличается `ArrayList` от `Vector`?
## Зачем добавили `ArrayList`, если уже был `Vector`?
+ Методы класса `Vector` синхронизированы, а `ArrayList` - нет;
+ По умолчанию, `Vector` удваивает свой размер, когда заканчивается выделенная под элементы память. `ArrayList` же увеличивает свой размер только на половину.
@ -248,7 +248,7 @@ FILO, First-In-Last-Out («первым пришел, последним уше
[к оглавлению](#java-collections-framework)
##Чем отличается `ArrayList` от `LinkedList`? В каких случаях лучше использовать первый, а в каких второй?
## Чем отличается `ArrayList` от `LinkedList`? В каких случаях лучше использовать первый, а в каких второй?
`ArrayList` это список, реализованный на основе массива, а `LinkedList` — это классический двусвязный список, основанный на объектах с ссылками между ними.
`ArrayList`:
@ -271,62 +271,62 @@ FILO, First-In-Last-Out («первым пришел, последним уше
[к оглавлению](#java-collections-framework)
##Что работает быстрее `ArrayList` или `LinkedList`?
## Что работает быстрее `ArrayList` или `LinkedList`?
Смотря какие действия будут выполняться над структурой.
см. [Чем отличается `ArrayList` от `LinkedList`](#Чем-отличается-arraylist-от-linkedlist-В-каких-случаях-лучше-использовать-первый-а-в-каких-второй)
[к оглавлению](#java-collections-framework)
##Какое худшее время работы метода `contains()` для элемента, который есть в `LinkedList`?
## Какое худшее время работы метода `contains()` для элемента, который есть в `LinkedList`?
_O(N)_. Время поиска элемента линейно пропорционально количеству элементов с списке.
[к оглавлению](#java-collections-framework)
##Какое худшее время работы метода `contains()` для элемента, который есть в `ArrayList`?
## Какое худшее время работы метода `contains()` для элемента, который есть в `ArrayList`?
_O(N)_. Время поиска элемента линейно пропорционально количеству элементов с списке.
[к оглавлению](#java-collections-framework)
##Какое худшее время работы метода `add()` для `LinkedList`?
## Какое худшее время работы метода `add()` для `LinkedList`?
_O(N)_. Добавление в начало/конец списка осуществляется за время _O(1)_.
[к оглавлению](#java-collections-framework)
##Какое худшее время работы метода `add()` для `ArrayList`?
## Какое худшее время работы метода `add()` для `ArrayList`?
_O(N)_. Вставка элемента в конец списка осуществляется за время _O(1)_, но если вместимость массива недостаточна, то происходит создание нового массива с увеличенным размером и копирование всех элементов из старого массива в новый.
[к оглавлению](#java-collections-framework)
##Необходимо добавить 1 млн. элементов, какую структуру вы используете?
## Необходимо добавить 1 млн. элементов, какую структуру вы используете?
Однозначный ответ можно дать только исходя из информации о том в какую часть списка происходит добавление элементов, что потом будет происходить с элементами списка, существуют ли какие-то ограничения по памяти или скорости выполнения.
см. [Чем отличается `ArrayList` от `LinkedList`](#Чем-отличается-arraylist-от-linkedlist-В-каких-случаях-лучше-использовать-первый-а-в-каких-второй)
[к оглавлению](#java-collections-framework)
##Как происходит удаление элементов из `ArrayList`? Как меняется в этом случае размер `ArrayList`?
## Как происходит удаление элементов из `ArrayList`? Как меняется в этом случае размер `ArrayList`?
При удалении произвольного элемента из списка, все элементы находящиеся «правее» смещаются на одну ячейку влево и реальный размер массива (его емкость, capacity) не изменяется никак. Механизм автоматического «расширения» массива существует, а вот автоматического «сжатия» нет, можно только явно выполнить «сжатие» командой `trimToSize()`.
[к оглавлению](#java-collections-framework)
##Предложите эффективный алгоритм удаления нескольких рядом стоящих элементов из середины списка, реализуемого `ArrayList`.
## Предложите эффективный алгоритм удаления нескольких рядом стоящих элементов из середины списка, реализуемого `ArrayList`.
Допустим нужно удалить `n` элементов с позиции `m` в списке. Вместо выполнения удаления одного элемента `n` раз (каждый раз смещая на 1 позицию элементы, стоящие «правее» в списке), нужно выполнить смещение всех элементов, стоящих «правее» `n + m` позиции на `n` элементов «левее» к началу списка. Таким образом, вместо выполнения `n` итераций перемещения элементов списка, все выполняется за 1 проход.
[к оглавлению](#java-collections-framework)
##Сколько необходимо дополнительной памяти при вызове `ArrayList.add()`?
## Сколько необходимо дополнительной памяти при вызове `ArrayList.add()`?
Если в массиве достаточно места для размещения нового элемента, то дополнительной памяти не требуется. Иначе происходит создание нового массива размером в 1,5 раза превышающим существующий (это верно для JDK выше 1.7, в более ранних версиях размер увеличения иной).
[к оглавлению](#java-collections-framework)
##Сколько выделяется дополнительно памяти при вызове `LinkedList.add()`?
## Сколько выделяется дополнительно памяти при вызове `LinkedList.add()`?
Создается один новый экземпляр вложенного класса `Node`.
[к оглавлению](#java-collections-framework)
##Оцените количество памяти на хранение одного примитива типа `byte` в `LinkedList`?
## Оцените количество памяти на хранение одного примитива типа `byte` в `LinkedList`?
Каждый элемент `LinkedList` хранит ссылку на предыдущий элемент, следующий элемент и ссылку на данные.
```java
@ -344,12 +344,12 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##Оцените количество памяти на хранение одного примитива типа `byte` в `ArrayList`?
## Оцените количество памяти на хранение одного примитива типа `byte` в `ArrayList`?
`ArrayList` основан на массиве, для примитивных типов данных осуществляется автоматическая упаковка значения, поэтому 16 байт тратится на хранение упакованного объекта и 4 байта (8 для x64) - на хранение ссылки на этот объект в самой структуре данных. Таким образом, в x32 JVM 4 байта используются на хранение одного элемента и 16 байт - на хранение упакованного объекта типа `Byte`. Для x64 - 8 байт и 24 байта соотвтетсвенно.
[к оглавлению](#java-collections-framework)
##Для `ArrayList` или для `LinkedList` операция добавления элемента в середину (`list.add(list.size()/2, newElement)`) медленнее?
## Для `ArrayList` или для `LinkedList` операция добавления элемента в середину (`list.add(list.size()/2, newElement)`) медленнее?
Для `ArrayList`:
+ проверка массива на вместимость. Если вместимости недостаточно, то увеличение размера массива и копирование всех элементов в новый массив (_O(N)_);
@ -365,13 +365,13 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##В реализации класса `ArrayList` есть следующие поля: `Object[] elementData`, `int size`. Объясните, зачем хранить отдельно `size`, если всегда можно взять `elementData.length`?
## В реализации класса `ArrayList` есть следующие поля: `Object[] elementData`, `int size`. Объясните, зачем хранить отдельно `size`, если всегда можно взять `elementData.length`?
Размер массива `elementData` представляет собой вместимость (capacity) `ArrayList`, которая всегда больше переменной `size` - реального количества хранимых элементов. При необходимости вместимость автоматически возрастает.
[к оглавлению](#java-collections-framework)
##Сравните интерфейсы `Queue` и `Deque`.
##Кто кого расширяет: `Queue` расширяет `Deque`, или `Deque` расширяет `Queue`?
## Сравните интерфейсы `Queue` и `Deque`.
## Кто кого расширяет: `Queue` расширяет `Deque`, или `Deque` расширяет `Queue`?
`Queue` - это очередь, которая обычно (но необязательно) строится по принципу FIFO (First-In-First-Out) - соответственно извлечение элемента осуществляется с начала очереди, вставка элемента - в конец очереди. Хотя этот принцип нарушает, к примеру `PriorityQueue`, использующая «natural ordering» или переданный `Comparator` при вставке нового элемента.
`Deque` (Double Ended Queue) расширяет `Queue` и согласно документации это линейная коллекция, поддерживающая вставку/извлечение элементов с обоих концов. Помимо этого реализации интерфейса `Deque` могут строится по принципу FIFO, либо LIFO.
@ -380,34 +380,34 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##Почему `LinkedList` реализует и `List`, и `Deque`?
## Почему `LinkedList` реализует и `List`, и `Deque`?
`LinkedList` позволяет добавлять элементы в начало и конец списка за константное время, что хорошо согласуется с поведением интерфейса `Deque`.
[к оглавлению](#java-collections-framework)
##`LinkedList` — это односвязный, двусвязный или четырехсвязный список?
## `LinkedList` — это односвязный, двусвязный или четырехсвязный список?
`Двусвязный`: каждый элемент `LinkedList` хранит ссылку на предыдущий и следующий элементы.
[к оглавлению](#java-collections-framework)
##Как перебрать элементы `LinkedList` в обратном порядке, не используя медленный `get(index)`?
## Как перебрать элементы `LinkedList` в обратном порядке, не используя медленный `get(index)`?
Для этого в `LinkedList` есть обратный итератор, который можно получить вызва метод `descendingIterator()`.
[к оглавлению](#java-collections-framework)
##Что позволяет сделать `PriorityQueue`?
## Что позволяет сделать `PriorityQueue`?
Особенностью `PriorityQueue` является возможность управления порядком элементов. По-умолчанию, элементы сортируются с использованием «natural ordering», но это поведение может быть переопределено при помощи объекта `Comparator`, который задаётся при создании очереди. Данная коллекция не поддерживает null в качестве элементов.
Используя `PriorityQueue`, можно, например, реализовать алгоритм Дейкстры для поиска кратчайшего пути от одной вершины графа к другой. Либо для хранения объектов согласно определённого свойства.
[к оглавлению](#java-collections-framework)
##`Stack` считается «устаревшим». Чем его рекомендуют заменять? Почему?
## `Stack` считается «устаревшим». Чем его рекомендуют заменять? Почему?
`Stack` был добавлен в Java 1.0 как реализация стека LIFO (last-in-first-out) и является расширением коллекции `Vector`, хотя это несколько нарушает понятие стека (например, класс `Vector` предоставляет возможность обращаться к любому элементу по индексу). Является частично синхронизированной коллекцией (кроме метода добавления `push()`) с вытекающими отсюда последствиями в виде негативного воздействия на производительность. После добавления в Java 1.6 интерфейса `Deque`, рекомендуется использовать реализации именно этого интерфейса, например `ArrayDeque`.
[к оглавлению](#java-collections-framework)
##Зачем нужен `HashMap`, если есть `Hashtable`?
## Зачем нужен `HashMap`, если есть `Hashtable`?
+ Методы класса `Hashtable` синхронизированы, что приводит к снижению производительности, а `HashMap` - нет;
+ `HashTable` не может содержать элементы `null`, тогда как `HashMap` может содержать один ключ `null` и любое количество значений `null`;
+ Iterator у `HashMap`, в отличие от Enumeration у `HashTable`, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных).
@ -416,7 +416,7 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##В чем разница между `HashMap` и `IdentityHashMap`? Для чего нужна `IdentityHashMap`?
## В чем разница между `HashMap` и `IdentityHashMap`? Для чего нужна `IdentityHashMap`?
`IdentityHashMap` - это структура данных, так же реализующая интерфейс `Map` и использующая при сравнении ключей (значений) сравнение ссылок, а не вызов метода `equals()`. Другими словами, в `IdentityHashMap` два ключа `k1` и `k2` будут считаться равными, если они указывают на один объект, т.е. выполняется условие `k1` == `k2`.
`IdentityHashMap` не использует метод `hashCode()`, вместо которого применяется метод `System.identityHashCode()`, по этой причине `IdentityHashMap` по сравнению с `HashMap` имеет более высокую производительность, особенно если последний хранит объекты с дорогостоящими методами `equals()` и `hashCode()`.
@ -427,7 +427,7 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##В чем разница между `HashMap` и `WeakHashMap`? Для чего используется `WeakHashMap`?
## В чем разница между `HashMap` и `WeakHashMap`? Для чего используется `WeakHashMap`?
В Java существует 4 типа ссылок: _сильные (strong reference)_, _мягкие (SoftReference)_, _слабые (WeakReference)_ и антомные (PhantomReference)_. Особенности каждого типа ссылок связаны с работой Garbage Collector. Если объект можно достичь только с помощью цепочки WeakReference (то есть на него отсутствуют сильные и мягкие ссылки), то данный объект будет помечен на удаление.
`WeakHashMap` - это структура данных, реализующая интерфейс `Map` и основанная на использовании WeakReference для хранения ключей. Таким образом, пара «ключ-значение» будет удалена из `WeakHashMap`, если на объект-ключ более не имеется сильных ссылок.
@ -436,34 +436,34 @@ private static class Node<E> {
[к оглавлению](#java-collections-framework)
##В `WeakHashMap` используются WeakReferences. А почему бы не создать `SoftHashMap` на SoftReferences?
## В `WeakHashMap` используются WeakReferences. А почему бы не создать `SoftHashMap` на SoftReferences?
`SoftHashMap` представлена в сторонних библиотеках, например, в `Apache Commons`.
[к оглавлению](#java-collections-framework)
##В `WeakHashMap` используются WeakReferences. А почему бы не создать `PhantomHashMap` на PhantomReferences?
## В `WeakHashMap` используются WeakReferences. А почему бы не создать `PhantomHashMap` на PhantomReferences?
PhantomReference при вызове метода `get()` возвращает всегда `null`, поэтому тяжело представить назначение такой структуры данных.
[к оглавлению](#java-collections-framework)
##`LinkedHashMap` - что в нем от `LinkedList`, а что от `HashMap`?
## `LinkedHashMap` - что в нем от `LinkedList`, а что от `HashMap`?
Реализация `LinkedHashMap` отличается от `HashMap` поддержкой двухсвязанного списка, определяющего порядок итерации по элементам структуры данных. По умолчанию элементы списка упорядочены согласно их порядку добавления в `LinkedHashMap` (insertion-order). Однако порядок итерации можно изменить, установив параметр конструктора `accessOrder` в значение `true`. В этом случае доступ осуществляется по порядку последнего обращения к элементу (access-order). Это означает, что при вызове методов `get()` или `put()` элемент, к которому обращаемся, перемещается в конец списка.
При добавлении элемента, который уже присутствует в `LinkedHashMap` (т.е. с одинаковым ключом), порядок итерации по элементам не изменяется.
[к оглавлению](#java-collections-framework)
##В чем проявляется «сортированность» `SortedMap`, кроме того, что `toString()` выводит все элементы по порядку?
## В чем проявляется «сортированность» `SortedMap`, кроме того, что `toString()` выводит все элементы по порядку?
Так же оно проявляется при итерации по коллекции.
[к оглавлению](#java-collections-framework)
##Как устроен `HashMap`?
## Как устроен `HashMap`?
`HashMap` состоит из «корзин» (bucket). С технической точки зрения «корзины» — это элементы массива, которые хранят ссылки на списки элементов. При добавлении новой пары «ключ-значение», вычисляет хэш-код ключа, на основании которого вычисляется номер корзины (номер ячейки массива), в которую попадет новый элемент. Если корзина пустая, то в нее сохраняется ссылка на вновь добавляемый элемент, если же там уже есть элемент, то происходит последовательный переход по ссылкам между элементами в цепочке, в поисках последнего элемента, от которого и ставится ссылка на вновь добавленный элемент. Если в списке был найден элемент с таким же ключом, то он заменяется.
[к оглавлению](#java-collections-framework)
##Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресации и на основе метода цепочек. Как реализована `HashMap`? Почему, по вашему мнению, была выбрана именно эта реализация? В чем плюсы и минусы каждого подхода?
## Согласно Кнуту и Кормену существует две основных реализации хэш-таблицы: на основе открытой адресации и на основе метода цепочек. Как реализована `HashMap`? Почему, по вашему мнению, была выбрана именно эта реализация? В чем плюсы и минусы каждого подхода?
`HashMap` реализован с использованием метода цепочек, т.е. каждой ячейке массива (корзине) соответствует свой связный список и при возникновении коллизии осуществляется добавление нового элемента в этот список.
Для метода цепочек коэффициент заполнения может быть больше 1 и с увеличением числа элементов производительность убывает линейно. Такие таблицы удобно использовать, если заранее неизвестно количество хранимых элементов, либо их может быть достаточно много, что приводит к большим значениям коэффициента заполнения.
@ -487,112 +487,112 @@ PhantomReference при вызове метода `get()` возвращает
[к оглавлению](#java-collections-framework)
##Как работает `HashMap` при попытке сохранить в него два элемента по ключам с одинаковым `hashCode()`, но для которых `equals() == false`?
## Как работает `HashMap` при попытке сохранить в него два элемента по ключам с одинаковым `hashCode()`, но для которых `equals() == false`?
По значению `hashCode()` вычисляется индекс ячейки массива, в список которой этот элемент будет добавлен. Перед добавлением осуществляется проверка на наличие элементов в этой ячейке. Если элементы с таким `hashCode()` уже присутствует, то осуществляется обход списка со сравнением по `equals()` в поисках идентичного элемента. Т.к. `equals() == false`, - элемент будет добавлен в начало списка.
[к оглавлению](#java-collections-framework)
##Какое начальное количество корзин в `HashMap`?
## Какое начальное количество корзин в `HashMap`?
В конструкторе по умолчанию - 16, используя конструкторы с параметрами можно задавать произвольное начальное количество корзин.
[к оглавлению](#java-collections-framework)
##Какова оценка временной сложности операций над элементами из `HashMap`? Гарантирует ли `HashMap` указанную сложность выборки элемента?
## Какова оценка временной сложности операций над элементами из `HashMap`? Гарантирует ли `HashMap` указанную сложность выборки элемента?
В общем случае операции добавления, поиска и удаления элементов занимают константное время.
Данная сложность не гарантируется, т.к. если хэш-функция будет распределяет элементы по корзинам равномерно, временная сложность станет не хуже _O(lg(N))_, а в случае, когда хэш-функция постоянно возвращает одно и то же значение `HashMap` превратится в связный список со сложностью О(n) .
[к оглавлению](#java-collections-framework)
##Возможна ли ситуация, когда `HashMap` выродится в список даже с ключами имеющими разные `hashCode()`?
## Возможна ли ситуация, когда `HashMap` выродится в список даже с ключами имеющими разные `hashCode()`?
Это возможно в случае, если метод, определяющий номер корзины будет возвращать одинаковые значения.
[к оглавлению](#java-collections-framework)
##В каком случае может быть потерян элемент в `HashMap`?
## В каком случае может быть потерян элемент в `HashMap`?
Допустим, в качестве ключа используется не примитив, а объект с несколькими полями. После добавления элемента в `HashMap` у объекта, который выступает в качестве ключа, изменяют одно поле, которое участвует в вычислении хэш-кода. В результате при попытке найти данный элемент по исходному ключу, будет происходить обращение к правильной корзине, а вот `equals` уже не найдет указанный ключ в списке элементов. Тем не менее, даже если `equals` реализован таким образом, что изменение данного поля объекта не влияет на результат, то после увеличения размера корзин и пересчета хэш-кодов элементов, указанный элемент, с измененным значением поля, с большой долей вероятности попадет в совершенно другую корзину и тогда уже потеряется совсем.
[к оглавлению](#java-collections-framework)
##Почему нельзя использовать `byte[]` в качестве ключа в `HashMap`?
## Почему нельзя использовать `byte[]` в качестве ключа в `HashMap`?
Хэш-код массива не зависит от хранимых в нем элементов, а присваивается при создании массива (метод вычисления хэш-кода массива не переопределен и вычисляется по стандартному `Object.hashCode()` на основании адреса массива). Так же у массивов не переопределен `equals` и выполняется сравнение указателей. Это приводит к тому, что обратиться к сохраненному с ключом-массивом элементу не получится при использовании другого массива такого же размера и с такими же элементами, доступ можно осуществить лишь в одном случае — при использовании той же самой ссылки на массив, что использовалась для сохранения элемента.
[к оглавлению](#java-collections-framework)
##Какова роль `equals()` и `hashCode()` в `HashMap`?
## Какова роль `equals()` и `hashCode()` в `HashMap`?
`hashCode` позволяет определить корзину для поиска элемента, а `equals` используется для сравнения ключей элементов в списке корзины и искомого ключа.
[к оглавлению](#java-collections-framework)
##Каково максимальное число значений `hashCode()`?
## Каково максимальное число значений `hashCode()`?
Число значений следует из сигнатуры `int hashCode()` и равно диапазону типа `int`__2<sup>32</sup>__.
[к оглавлению](#java-collections-framework)
##Какое худшее время работы метода get(key) для ключа, которого нет в `HashMap`?
##Какое худшее время работы метода get(key) для ключа, который есть в `HashMap`?
## Какое худшее время работы метода get(key) для ключа, которого нет в `HashMap`?
## Какое худшее время работы метода get(key) для ключа, который есть в `HashMap`?
___O(N)___. Худший случай - это поиск ключа в `HashMap`, вырожденного в список по причине совпадения ключей по `hashCode()` и для выяснения хранится ли элемент с определённым ключом может потребоваться перебор всего списка.
[к оглавлению](#java-collections-framework)
##Сколько переходов происходит в момент вызова `HashMap.get(key)` по ключу, который есть в таблице?
## Сколько переходов происходит в момент вызова `HashMap.get(key)` по ключу, который есть в таблице?
+ ключ равен `null`: __1__ - выполняется единственный метод `getForNullKey()`.
+ любой ключ отличный от `null`: __4__ - вычисление хэш-кода ключа; определение номера корзины; поиск значения; возврат значения.
[к оглавлению](#java-collections-framework)
##Сколько создается новых объектов, когда вы добавляете новый элемент в `HashMap`?
## Сколько создается новых объектов, когда вы добавляете новый элемент в `HashMap`?
__Один__ новый объект статического вложенного класса `Entry<K,V>`.
[к оглавлению](#java-collections-framework)
##Как и когда происходит увеличение количества корзин в `HashMap`?
## Как и когда происходит увеличение количества корзин в `HashMap`?
Помимо `capacity` у `HashMap` есть еще поле `loadFactor`, на основании которого, вычисляется предельное количество занятых корзин `capacity * loadFactor`. По умолчанию `loadFactor = 0.75`. По достижению предельного значения, число корзин увеличивается в 2 раза и для всех хранимых элементов вычисляется новое «местоположение» с учетом нового числа корзин.
[к оглавлению](#java-collections-framework)
##Объясните смысл параметров в конструкторе `HashMap(int initialCapacity, float loadFactor)`.
## Объясните смысл параметров в конструкторе `HashMap(int initialCapacity, float loadFactor)`.
+ `initialCapacity` - исходный размер `HashMap`, количество корзин в хэш-таблице в момент её создания.
+ `loadFactor` - коэффициент заполнения `HashMap`, при превышении которого происходит увеличение количества корзин и автоматическое перехэширование. Равен отношению числа уже хранимых элементов в таблице к её размеру.
[к оглавлению](#java-collections-framework)
##Будет ли работать `HashMap`, если все добавляемые ключи будут иметь одинаковый `hashCode()`?
## Будет ли работать `HashMap`, если все добавляемые ключи будут иметь одинаковый `hashCode()`?
Да, будет, но в этом случае `HashMap` вырождается в связный список и теряет свои преимущества.
##Как перебрать все ключи `Map`?
## Как перебрать все ключи `Map`?
Использовать метод `keySet()`, который возвращает множество `Set<K>` ключей.
[к оглавлению](#java-collections-framework)
##Как перебрать все значения `Map`?
## Как перебрать все значения `Map`?
Использовать метод `values()`, который возвращает коллекцию `Collection<V>` значений.
[к оглавлению](#java-collections-framework)
##Как перебрать все пары «ключ-значение» в `Map`?
## Как перебрать все пары «ключ-значение» в `Map`?
Использовать метод `entrySet()`, который возвращает множество `Set<Map.Entry<K, V>` пар «ключ-значение».
[к оглавлению](#java-collections-framework)
##В чем отличия `TreeSet` и `HashSet`?
## В чем отличия `TreeSet` и `HashSet`?
`TreeSet` обеспечивает упорядоченно хранение элементов в виде красно-черного дерева. Сложность выполнения основных операций не хуже _O(lg(N))_.
`HashSet` использует для хранения элементов такой же подход, что и `HashMap`, за тем отличием, что в `HashSet` в качестве ключа и значения выступает сам `элемент`, кроме того `HashSet` не поддерживает упорядоченное хранение элементов и обеспечивает временную сложность выполнения операций аналогично `HashMap`.
[к оглавлению](#java-collections-framework)
##Что будет, если добавлять элементы в `TreeSet` по возрастанию?
## Что будет, если добавлять элементы в `TreeSet` по возрастанию?
В основе `TreeSet` лежит красно-черное дерево, которое умеет само себя балансировать. В итоге, `TreeSet` все равно в каком порядке вы добавляете в него элементы, преимущества этой структуры данных будут сохраняться.
[к оглавлению](#java-collections-framework)
##Чем `LinkedHashSet` отличается от `HashSet`?
## Чем `LinkedHashSet` отличается от `HashSet`?
`LinkedHashSet` отличается от `HashSet` только тем, что в его основе лежит `LinkedHashMap` вместо `HashMap`. Благодаря этому порядок элементов при обходе коллекции является идентичным порядку добавления элементов (insertion-order). При добавлении элемента, который уже присутствует в `LinkedHashSet` (т.е. с одинаковым ключом), порядок обхода элементов не изменяется.
[к оглавлению](#java-collections-framework)
##Для `Enum` есть специальный класс `java.util.EnumSet`. Зачем? Чем авторов не устраивал `HashSet` или `TreeSet`?
## Для `Enum` есть специальный класс `java.util.EnumSet`. Зачем? Чем авторов не устраивал `HashSet` или `TreeSet`?
`EnumSet` - это реализация интерфейса `Set` для использования с перечислениями (`Enum`). В структуре данных хранятся объекты только одного типа `Enum`, указываемого при создании. Для хранения значений `EnumSet` использует массив битов (_bit vector_), - это позволяет получить высокую компактность и эффективность. Проход по `EnumSet` осуществляется согласно порядку объявления элементов перечисления.
Все основные операции выполняются за _O(1)_ и обычно (но негарантированно) быстрей аналогов из `HashSet`, а пакетные операции (_bulk operations_), такие как `containsAll()` и `retainAll()` выполняются даже горазда быстрей.
@ -601,7 +601,7 @@ __Один__ новый объект статического вложенног
[к оглавлению](#java-collections-framework)
##Какие существуют способы перебирать элементы списка?
## Какие существуют способы перебирать элементы списка?
+ Цикл с итератором
```java
@ -639,7 +639,7 @@ for (String element : list) {
[к оглавлению](#java-collections-framework)
##Каким образом можно получить синхронизированные объекты стандартных коллекций?
## Каким образом можно получить синхронизированные объекты стандартных коллекций?
С помощью статических методов `synchronizedMap()` и `synchronizedList()` класса `Collections`. Данные методы возвращают синхронизированный декоратор переданной коллекции. При этом все равно в случае обхода по коллекции требуется ручная синхронизация.
```java
@ -651,7 +651,7 @@ for (String element : list) {
[к оглавлению](#java-collections-framework)
##Как получить коллекцию только для чтения?
## Как получить коллекцию только для чтения?
При помощи:
+ `Collections.unmodifiableList(list)`;
@ -662,7 +662,7 @@ for (String element : list) {
[к оглавлению](#java-collections-framework)
##Напишите однопоточную программу, которая заставляет коллекцию выбросить `ConcurrentModificationException`.
## Напишите однопоточную программу, которая заставляет коллекцию выбросить `ConcurrentModificationException`.
```java
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
@ -678,7 +678,7 @@ public static void main(String[] args) {
[к оглавлению](#java-collections-framework)
##Приведите пример, когда какая-либо коллекция выбрасывает `UnsupportedOperationException`.
## Приведите пример, когда какая-либо коллекция выбрасывает `UnsupportedOperationException`.
```java
public static void main(String[] args) {
List<Integer> list = Collections.emptyList();
@ -688,7 +688,7 @@ public static void main(String[] args) {
[к оглавлению](#java-collections-framework)
##Реализуйте симметрическую разность двух коллекций используя методы `Collection` (`addAll(...)`, `removeAll(...)`, `retainAll(...)`).
## Реализуйте симметрическую разность двух коллекций используя методы `Collection` (`addAll(...)`, `removeAll(...)`, `retainAll(...)`).
Симметрическая разность двух коллекций - это множество элементов, одновременно не принадлежащих обоим исходным коллекциям.
```java
@ -709,7 +709,7 @@ public static void main(String[] args) {
```
[к оглавлению](#java-collections-framework)
##Как, используя LinkedHashMap, сделать кэш c «invalidation policy»?
## Как, используя LinkedHashMap, сделать кэш c «invalidation policy»?
Необходимо использовать _LRU-алгоритм (Least Recently Used algorithm)_ и `LinkedHashMap` с access-order. В этом случае при обращении к элементу он будет перемещаться в конец списка, а наименее используемые элементы будут постепенно группироваться в начале списка. Так же в стандартной реализации `LinkedHashMap` есть метод `removeEldestEntries()`, который возвращает `true`, если текущий объект `LinkedHashMap` должен удалить наименее используемый элемент из коллекции при использовании методов `put()` и `putAll()`.
```java
@ -731,42 +731,42 @@ public class LRUCache<K, V> extends LinkedHashMap<K, V> {
[к оглавлению](#java-collections-framework)
##Как одной строчкой скопировать элементы любой `collection` в массив?
## Как одной строчкой скопировать элементы любой `collection` в массив?
```java
Object[] array = collection.toArray();
```
[к оглавлению](#java-collections-framework)
##Как одним вызовом из `List` получить `List` со всеми элементами, кроме первых и последних 3-х?
## Как одним вызовом из `List` получить `List` со всеми элементами, кроме первых и последних 3-х?
```java
List<Integer> subList = list.subList(3, list.size() - 3);
```
[к оглавлению](#java-collections-framework)
##Как одной строчкой преобразовать `HashSet` в `ArrayList`?
## Как одной строчкой преобразовать `HashSet` в `ArrayList`?
```java
ArrayList<Integer> list = new ArrayList<>(new HashSet<>());
```
[к оглавлению](#java-collections-framework)
##Как одной строчкой преобразовать `ArrayList` в `HashSet`?
## Как одной строчкой преобразовать `ArrayList` в `HashSet`?
```java
HashSet<Integer> set = new HashSet<>(new ArrayList<>());
```
[к оглавлению](#java-collections-framework)
##Сделайте `HashSet` из ключей `HashMap`.
## Сделайте `HashSet` из ключей `HashMap`.
```java
HashSet<Object> set = new HashSet<>(map.keySet());
```
[к оглавлению](#java-collections-framework)
##Сделайте `HashMap` из `HashSet<Map.Entry<K, V>>`.
## Сделайте `HashMap` из `HashSet<Map.Entry<K, V>>`.
```java
HashMap<K, V> map = new HashMap<>(set.size());
for (Map.Entry<K, V> entry : set) {

32
jdbc.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#JDBC
# JDBC
+ [Что такое _JDBC_?](#Что-такое-jdbc)
+ [В чем заключаются преимущества использования JDBC?](#В-чем-заключаются-преимущества-использования-jdbc)
+ [Что из себя представляет JDBC URL?](#Что-из-себя-представляет-jdbc-url)
@ -16,14 +16,14 @@
+ [Как вызвать хранимую процедуру?](#Как-вызвать-хранимую-процедуру)
+ [Как закрыть соединение с базой данных?](#Как-закрыть-соединение-с-базой-данных)
##Что такое _JDBC_?
## Что такое _JDBC_?
__JDBC, Java DataBase Connectivity (соединение с базами данных на Java)__ — промышленный стандарт взаимодействия Java-приложений с различными СУБД. Реализован в виде пакета `java.sql`, входящего в состав Java SE.
JDBC основан на концепции драйверов, которые позволяют получать соединение с базой данных по специально описанному URL. При загрузке драйвер регистрирует себя в системе и в дальнейшем автоматически вызывается, когда программа требует URL, содержащий протокол, за который этот драйвер отвечает.
[к оглавлению](#jdbc)
##В чем заключаются преимущества использования JDBC?
## В чем заключаются преимущества использования JDBC?
Преимуществами JDBC считают:
+ Лёгкость разработки: разработчик может не знать специфики базы данных, с которой работает;
@ -33,7 +33,7 @@ JDBC основан на концепции драйверов, которые
[к оглавлению](#jdbc)
##Что из себя представляет JDBC URL?
## Что из себя представляет JDBC URL?
__JDBC URL__ состоит из:
+ `<protocol>:` (протокола) - всегда `jdbc:`.
@ -44,7 +44,7 @@ __JDBC URL__ состоит из:
[к оглавлению](#jdbc)
##Из каких частей стоит JDBC?
## Из каких частей стоит JDBC?
JDBC состоит из двух частей:
+ __JDBC API__, который содержит набор классов и интерфейсов, определяющих доступ к базам данных. Эти классы и методы объявлены в двух пакетах - `java.sql` и `javax.sql`;
@ -54,7 +54,7 @@ JDBC превращает вызовы уровня API в «родные» ко
[к оглавлению](#jdbc)
##Перечислите основные классы и интерфейсы JDBC.
## Перечислите основные классы и интерфейсы JDBC.
+ `java.sql.DriverManager` - позволяет загрузить и зарегистрировать необходимый JDBC-драйвер, а затем получить соединение с базой данных.
+ `javax.sql.DataSource` - решает те же задачи, что и _DriverManager_, но более удобным и универсальным образом. Существуют также `javax.sql.ConnectionPoolDataSource` и `javax.sq1.XADataSource` задача которых - обеспечение поддержки пула соединений.
@ -71,7 +71,7 @@ JDBC превращает вызовы уровня API в «родные» ко
[к оглавлению](#jdbc)
##Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java?
## Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java?
| JDBC Type | Java Object Type |
|---------------:|---------------------------|
@ -104,7 +104,7 @@ JDBC превращает вызовы уровня API в «родные» ко
[к оглавлению](#jdbc)
##Опишите основные этапы работы с базой данных при использовании JDBC.
## Опишите основные этапы работы с базой данных при использовании JDBC.
+ Регистрация драйверов;
+ Установление соединения с базой данных;
+ Создание запроса(ов) к базе данных;
@ -114,7 +114,7 @@ JDBC превращает вызовы уровня API в «родные» ко
[к оглавлению](#jdbc)
##Как зарегистрировать драйвер JDBC?
## Как зарегистрировать драйвер JDBC?
Регистрацию драйвера можно осуществить несколькими способами:
+ `java.sql.DriverManager.registerDriver(%объект класса драйвера%)`.
@ -125,7 +125,7 @@ JDBC превращает вызовы уровня API в «родные» ко
[к оглавлению](#jdbc)
##Как установить соединение с базой данных?
## Как установить соединение с базой данных?
Для установки соединения с базой данных используется статический вызов `java.sql.DriverManager.getConnection(...)` .
@ -150,7 +150,7 @@ static Connection getConnection(String url, String user, String password)
[к оглавлению](#jdbc)
##Какие уровни изоляции транзакций поддерживаются в JDBC?
## Какие уровни изоляции транзакций поддерживаются в JDBC?
__Уровень изолированности транзакций__ — значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных.
Во время использования транзакций, для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить:
@ -174,7 +174,7 @@ __Уровень изолированности транзакций__ — зн
[к оглавлению](#jdbc)
##При помощи чего формируются запросы к базе данных?
## При помощи чего формируются запросы к базе данных?
Для выполнения запросов к базе данных в Java используются три интерфейса:
@ -190,7 +190,7 @@ __Уровень изолированности транзакций__ — зн
[к оглавлению](#jdbc)
##Чем отличается Statement от PreparedStatement?
## Чем отличается Statement от PreparedStatement?
+ __Statement__: используется для простых случаев запроса без параметров.
+ __PreparedStatement__: предварительно компилирует запрос, который может содержать входные параметры и выполняться несколько раз с разным набором этих параметров.
@ -200,7 +200,7 @@ __Уровень изолированности транзакций__ — зн
[к оглавлению](#jdbc)
##Как осуществляется запрос к базе данных и обработка результатов?
## Как осуществляется запрос к базе данных и обработка результатов?
Выполнение запросов осуществляется при помощи вызова методов объекта, реализующего интерфейс `java.sql.Statement`:
+ __`executeQuery()`__ - для запросов, результатом которых является один набор значений, например запросов `SELECT`. Результатом выполнения является объект класса `java.sql.ResultSet`;
@ -219,7 +219,7 @@ __Уровень изолированности транзакций__ — зн
[к оглавлению](#jdbc)
##Как вызвать хранимую процедуру?
## Как вызвать хранимую процедуру?
__Хранимые процедуры__ это именованный набор операторов SQL хранящийся на сервере. Такую процедуру можно вызвать из Java-класса с помощью вызова методов объекта реализующего интерфейс `java.sql.Statement`.
Выбор объекта зависит от характеристик хранимой процедуры:
@ -263,7 +263,7 @@ public vois runStoredProcedure(final Connection connection) throws Exception {
[к оглавлению](#jdbc)
##Как закрыть соединение с базой данных?
## Как закрыть соединение с базой данных?
Соединение с базой данной закрывается вызовом метода `close()` у соответствующего объекта `java.sql.Connection` или посредством использования механизма try-with-resources при создании такого объекта, появившегося в Java 7.
> __NB!__ Предварительно необходимо закрыть все запросы созданные этим соединением.

18
log.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
##Журналирование
# Журналирование
+ [Какие существуют типы логов?](#Какие-существуют-типы-логов)
+ [Из каких частей состоит система журналирования log4j?](#Из-каких-частей-состоит-система-журналирования-log4j)
+ [Что такое _Logger_ в log4j?](#Что-такое-logger-в-log4j)
@ -9,7 +9,7 @@
+ [Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.](#Перечислите-уровни-журналирования-в-log4j-Назовите-порядок-их-приоритетности)
+ [Какие существуют способы конфигурирования log4j?](#Какие-существуют-способы-конфигурирования-log4j)
###Какие существуют типы логов?
## Какие существуют типы логов?
+ системы (System);
+ безопасности (Security);
+ приложения (Application, Buisness).
@ -18,7 +18,7 @@
[к оглавлению](#Журналирование)
###Из каких частей состоит система журналирования log4j?
## Из каких частей состоит система журналирования log4j?
Система журналирования состоит из трёх основных частей:
+ управляющей журналированием - __logger__;
@ -27,12 +27,12 @@
[к оглавлению](#Журналирование)
###Что такое _Logger_ в log4j?
## Что такое _Logger_ в log4j?
__Logger__ представляет собой объект класса `org.apache.log4j.Logger`, который используется как управляющий интерфейс для журналирования сообщений с возможностью задавать уровень детализации. Именно logger проверяет нужно ли обрабатывать сообщение и если журналирование необходимо, то сообщение передаётся в appender, если нет - система завершает обработку данного сообщения.
[к оглавлению](#Журналирование)
###Что такое _Appender_ в log4j?
## Что такое _Appender_ в log4j?
__Appender__ - это именованный объект журнала событий, реализующий интерфейс `org.apache.log4j.Appender` и добавляющий события в журнал. Appender вызывает разные вспомогательные инструменты - компоновщик, фильтр, обработчик ошибок (если они определены и необходимы). В ходе этой работы окончательно устанавливается необходимость записи сообщения, сообщению придаются окончательные содержание и форма.
В log4j журнал может представлять:
@ -68,7 +68,7 @@ __Appender__ - это именованный объект журнала соб
[к оглавлению](#Журналирование)
###Что такое _Layout_ в log4j?
## Что такое _Layout_ в log4j?
__Layout__ - наследник класса `org.apache.log4j.Layout` предоставляющий возможность форматирования сообщения перед добавлением в журнал.
В log4j существуют следующие типы layout-ов:
@ -81,7 +81,7 @@ __Layout__ - наследник класса `org.apache.log4j.Layout` пред
[к оглавлению](#Журналирование)
###Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.
## Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.
+ __OFF__ - отсутствие журналирования;
+ __FATAL__ - фатальная ошибка;
+ __ERROR__ - ошибка;
@ -96,7 +96,7 @@ __Layout__ - наследник класса `org.apache.log4j.Layout` пред
[к оглавлению](#Журналирование)
###Какие существуют способы конфигурирования log4j?
## Какие существуют способы конфигурирования log4j?
Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями:
+ Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования.
@ -107,4 +107,4 @@ __Layout__ - наследник класса `org.apache.log4j.Layout` пред
##Источники
+ [Quizful](http://www.quizful.net/)
+ [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger)
+ [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger)

28
oop.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#ООП
# ООП
+ [Что такое _ООП_?](#Что-такое-ООП)
+ [Назовите основные принципы _ООП_.](#Назовите-основные-принципы-ООП)
+ [Что такое _«инкапсуляция»_?](#Что-такое-инкапсуляция)
@ -14,7 +14,7 @@
+ [В чем разница между _композицией_ и _агрегацией_?](#В-чем-разница-между-композицией-и-агрегацией)
+ [Что такое _статическое_ и _динамическое связывание_?](#Что-такое-статическое-и-динамическое-связывание)
##Что такое _ООП_?
## Что такое _ООП_?
__Объектно-ориентированное программирование (ООП)__ — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования.
+ объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы;
@ -27,7 +27,7 @@ __Объектно-ориентированное программировани
[к оглавлению](#ООП)
##Назовите основные принципы _ООП_.
## Назовите основные принципы _ООП_.
+ _Инкапсуляция_ - сокрытие реализации.
+ _Наследование_ - создание новой сущности на базе уже существующей.
+ олиморфизм_ - возможность иметь разные формы для одной и той же сущности.
@ -39,7 +39,7 @@ __Объектно-ориентированное программировани
[к оглавлению](#ООП)
##Что такое _«инкапсуляция»_?
## Что такое _«инкапсуляция»_?
__Инкапсуляция__ это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании.
Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса.
@ -50,7 +50,7 @@ __Инкапсуляция__ это свойство системы, поз
[к оглавлению](#ООП)
##Что такое _«наследование»_?
## Что такое _«наследование»_?
__Наследование__ это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью.
Класс, от которого производится наследование, называется _предком_, _базовым_ или _родительским_. Новый класс _потомком_, аследником_ или _производным_ классом.
@ -63,7 +63,7 @@ __Наследование__ это свойство системы, поз
[к оглавлению](#ООП)
##Что такое _«полиморфизм»_?
## Что такое _«полиморфизм»_?
__Полиморфизм__ это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования. Отсюда следует ключевая особенность полиморфизма - использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа).
@ -81,21 +81,21 @@ _Полиморфная переменная_, это переменная, ко
[к оглавлению](#ООП)
##Что такое абстракция»_?
## Что такое абстракция»_?
_Абстрагирование_ это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, __абстракция__ это набор всех таких характеристик.
>Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерёнок в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота он будет использовать регулярно.
[к оглавлению](#ООП)
##Что представляет собой обмен сообщениями»_?
## Что представляет собой обмен сообщениями»_?
Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. В ООП посылка сообщения (вызов метода) — это единственный путь передать управление объекту. Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод. Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding).
>Пусть требуется создать физическую модель, описывающую сталкивающиеся шары разных размеров. Традиционный подход к решению этой задачи примерно таков: определяется набор данных, описывающих каждый шар (например, его координаты, массу и ускорение); каждому шару присваивается уникальный идентификатор (например, организуется массив, значение индекса которого соответствует номеру шара), который позволит отличать каждый из шаров от всех других. Наконец, пишется подпрограмма с названием, скажем, `bounce`; эта процедура должна на основе номера шара и его начальных параметров соответствующим образом изменять данные, описывающие шар. В отличие от традиционного подхода объектно-ориентированная версия программы моделирует каждый из шаров посредством объекта. При этом объект, соответствующий конкретному шару, содержит не только его параметры, но и весь код, описывающий поведение шара при различных взаимодействиях. Так, каждый шар будет иметь собственный метод `bounce()`. Вместо того, чтобы вызывать подпрограмму `bounce` с аргументом, определяющим, скажем, шар №3, необходимо будет передать объекту «шар №3» сообщение, предписывающее ему выполнить столкновение.
[к оглавлению](#ООП)
##Расскажите про основные понятия ООП: _«класс»_, объект»_, _«интерфейс»_.
## Расскажите про основные понятия ООП: _«класс»_, объект»_, _«интерфейс»_.
__Класс__ это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт).
С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов).
@ -108,7 +108,7 @@ __Интерфейс__ это набор методов класса, дос
[к оглавлению](#ООП)
##В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?
## В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?
Преимущества:
+ Объектная модель вполне естественна, поскольку в первую очередь ориентирована на человеческое восприятие мира, а не на компьютерную реализацию.
@ -137,13 +137,13 @@ __Интерфейс__ это набор методов класса, дос
[к оглавлению](#ООП)
##Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_?
## Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_?
__«является»__ подразумевает наследование.
__«имеет»__ подразумевает ассоциацию (агрегацию или композицию).
[к оглавлению](#ООП)
##В чем разница между омпозицией_ и _агрегацией_?
## В чем разница между омпозицией_ и _агрегацией_?
Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое».
Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых.
@ -153,7 +153,7 @@ __«имеет»__ подразумевает ассоциацию (агрега
[к оглавлению](#ООП)
##Что такое _статическое_ и _динамическое связывание_?
## Что такое _статическое_ и _динамическое связывание_?
Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется _статическим_ или _ранним связыванием (early binding)_.
В свою очередь, _позднее связывание (late binding)_ это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют _динамическим (dynamic)_ или _связыванием на стадии выполнения (runtime binding)_. В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация.
@ -165,4 +165,4 @@ __«имеет»__ подразумевает ассоциацию (агрега
#Источники
+ [DevColibri](http://devcolibri.com/720)
+ [Хабрахабр](https://habrahabr.ru/post/87119/)
+ [Википедия](https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование)
+ [Википедия](https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование)

View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Сериализация
# Сериализация
+ [Что такое _«сериализация»_?](#Что-такое-сериализация)
+ [Опишите процесс сериализации/десериализации с использованием `Serializable`.](#Опишите-процесс-сериализациидесериализации-с-использованием-serializable)
+ [Как изменить стандартное поведение сериализации/десериализации?](#Как-изменить-стандартное-поведение-сериализациидесериализации)
@ -14,7 +14,7 @@
+ [В чем проблема сериализации Singleton?](#В-чем-проблема-сериализации-singleton)
+ [Какие существуют способы контроля за значениями десериализованного объекта](#Какие-существуют-способы-контроля-за-значениями-десериализованного-объекта)
##Что такое сериализация»_?
## Что такое сериализация»_?
__Сериализация (Serialization)__ - процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать).
В Java, согласно спецификации Java Object Serialization существует два стандартных способа сериализации: стандартная сериализация, через использование интерфейса `java.io.Serializable` и «расширенная» сериализация - `java.io.Externalizable`.
@ -29,7 +29,7 @@ __Сериализация (Serialization)__ - процесс преобразо
[к оглавлению](#Сериализация)
##Опишите процесс сериализации/десериализации с использованием `Serializable`.
## Опишите процесс сериализации/десериализации с использованием `Serializable`.
При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет:
+ запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор `SerialVersionUID`, идентификаторы полей класса);
@ -43,7 +43,7 @@ __Сериализация (Serialization)__ - процесс преобразо
[к оглавлению](#Сериализация)
##Как изменить стандартное поведение сериализации/десериализации?
## Как изменить стандартное поведение сериализации/десериализации?
+ Реализовать интерфейс `java.io.Externalizable`, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах `writeExternal()`` и `readExternal()`. Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод `readExternal`.
+ Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию :
+ `writeObject()` - запись объекта в поток;
@ -53,26 +53,26 @@ __Сериализация (Serialization)__ - процесс преобразо
[к оглавлению](#Сериализация)
##Как исключить поля из сериализации?
## Как исключить поля из сериализации?
Для управления сериализацией при определении полей можно использовать ключевое слово `transient`, таким образом исключив поля из общего процесса сериализации.
[к оглавлению](#Сериализация)
##Что обозначает ключевое слово `transient`?
## Что обозначает ключевое слово `transient`?
Поля класса, помеченные модификатором `transient`, не сериализуются.
Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован.
[к оглавлению](#Сериализация)
##Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final`
## Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final`
При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации `Externalizable` сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками.
Поля с модификатором `final` сериализуются как и обычные. За одним исключением их невозможно десериализовать при использовании `Externalizable`, поскольку `final` поля должны быть инициализированы в конструкторе, а после этого в `readExternal()` изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с `final` полем необходимо использовать только стандартную сериализацию.
[к оглавлению](#Сериализация)
##Как не допустить сериализацию?
## Как не допустить сериализацию?
Чтобы не допустить автоматическую сериализацию можно переопределить `private` методы для создания исключительной ситуации `NotSerializableException`.
```java
@ -89,7 +89,7 @@ private void readObject(ObjectInputStream in) throws IOException {
[к оглавлению](#Сериализация)
##Как создать собственный протокол сериализации?
## Как создать собственный протокол сериализации?
Для создания собственного протокола сериализации достаточно реализовать интерфейс `Externalizable`, который содержит два метода:
```java
@ -99,7 +99,7 @@ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundExcept
[к оглавлению](#Сериализация)
##Какая роль поля `serialVersionUID` в сериализации?
## Какая роль поля `serialVersionUID` в сериализации?
`serialVersionUID` используется для указании версии сериализованных данных.
Когда мы не объявляем `serialVersionUID` в нашем классе явно, среда выполнения Java делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр.
@ -111,12 +111,12 @@ private static final long serialVersionUID = 20161013L;
```
[к оглавлению](#Сериализация)
##Когда стоит изменять значение поля `serialVersionUID`?
## Когда стоит изменять значение поля `serialVersionUID`?
`serialVersionUID` нужно изменять при внесении в класс несовместимых изменений, например при удалении какого-либо его атрибута.
[к оглавлению](#Сериализация)
##В чем проблема сериализации Singleton?
## В чем проблема сериализации Singleton?
Проблема в том что после десериализации мы получим другой объект. Таким образом, сериализация дает возможность создать Singleton еще раз, что недопустимо. Существует два способа избежать этого:
+ явный запрет сериализации.
@ -124,7 +124,7 @@ private static final long serialVersionUID = 20161013L;
[к оглавлению](#Сериализация)
##Какие существуют способы контроля за значениями десериализованного объекта
## Какие существуют способы контроля за значениями десериализованного объекта
Если есть необходимость выполнения контроля за значениями десериализованного объекта, то можно использовать интерфейс `ObjectInputValidation` с переопределением метода `validateObject()`.
```java
@ -154,4 +154,4 @@ public class Person implements java.io.Serializable,
+ [Java-online.ru](http://java-online.ru/blog-serialization.xhtml)
+ [Изучите секреты Java Serialization API](http://ccfit.nsu.ru/~deviv/courses/oop/java_ser_rus.html)
+ [JavaRush](http://bit.ly/1xwRA2D)
+ [Записки трезвого практика](http://www.skipy.ru/technics/serialization.html)
+ [Записки трезвого практика](http://www.skipy.ru/technics/serialization.html)

View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Servlets, JSP, JSTL
# Servlets, JSP, JSTL
+ [Что такое _«сервлет»_?](#Что-такое-сервлет)
+ [В чем заключаются преимущества технологии сервлетов над CGI (Common Gateway Interface)?](#В-чем-заключаются-преимущества-технологии-сервлетов-над-cgi-common-gateway-interface)
+ [Какова структура веб-проекта?](#Какова-структура-веб-проекта)
@ -95,7 +95,7 @@
+ [Какая разница между `JSPWriter` и сервлетным `PrintWriter`?](#Какая-разница-между-jspwriter-и-сервлетным-printwriter)
+ [Опишите общие практические принципы работы с JSP.](#Опишите-общие-практические-принципы-работы-с-jsp)
##Что такое сервлет»_?
## Что такое сервлет»_?
__Сервлет__ является интерфейсом, реализация которого расширяет функциональные возможности сервера. Сервлет взаимодействует с клиентами посредством принципа запрос-ответ. Хотя сервлеты могут обслуживать любые запросы, они обычно используются для расширения веб-серверов.
Большинство необходимых для создания сервлетов классов и интерфейсов содержатся в пакетах `javax.servlet` и `javax.servlet.http`.
@ -112,7 +112,7 @@ __Сервлет__ является интерфейсом, реализация
[к оглавлению](#servlets-jsp-jstl)
##В чем заключаются преимущества технологии сервлетов над CGI (Common Gateway Interface)?
## В чем заключаются преимущества технологии сервлетов над CGI (Common Gateway Interface)?
+ Сервлеты предоставляют лучшую производительность обработки запросов и более эффективное использование памяти за счет использования преимущество многопоточности (на каждый запрос создается новая нить, что быстрее выделения памяти под новый объект для каждого запроса, как это происходит в CGI).
+ Сервлеты, как платформа и система являются независимыми. Таким образом веб-приложение написанное с использованием сервлетов может быть запущена в любом контейнере сервлетов, реализующим этот стандарт и в любой операционной системе.
+ Использование сервлетов повышает надежность программы, т.к. контейнер сервлетов самостоятельно заботится о жизненном цикле сервлетов (а значит и за утечками памяти), безопасности и сборщике мусора.
@ -120,7 +120,7 @@ __Сервлет__ является интерфейсом, реализация
[к оглавлению](#servlets-jsp-jstl)
##Какова структура веб-проекта?
## Какова структура веб-проекта?
`src/main/java` Исходники приложения/библиотеки
`src/main/resources` Ресурсные файлы приложения/библиотеки
@ -149,7 +149,7 @@ __Сервлет__ является интерфейсом, реализация
[к оглавлению](#servlets-jsp-jstl)
##Что такое _«контейнер сервлетов»_?
## Что такое _«контейнер сервлетов»_?
__Контейнер сервлетов__ — программа, представляющая собой сервер, который занимается системной поддержкой сервлетов и обеспечивает их жизненный цикл в соответствии с правилами, определёнными в спецификациях. Может работать как полноценный самостоятельный веб-сервер, быть поставщиком страниц для другого веб-сервера, или интегрироваться в Java EE сервер приложений.
Контейнер сервлетов обеспечивает обмен данными между сервлетом и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего сервлета, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
@ -165,7 +165,7 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##Как контейнер сервлетов управляет жизненным циклом сервлета, когда и какие методы вызываются?
## Как контейнер сервлетов управляет жизненным циклом сервлета, когда и какие методы вызываются?
Контейнер сервлетов управляет четырьмя фазами жизненного цикла сервлета:
+ Загрузка класса сервлета — когда контейнер получает запрос для сервлета, то происходит загрузка класса сервлета в память и вызов его конструктора без параметров.
@ -181,7 +181,7 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##Что такое _«дескриптор развертывания»_?
## Что такое _«дескриптор развертывания»_?
Дескриптор развертывания — это конфигурационный файл артефакта, который будет развернут в контейнере сервлетов. В спецификации Java Platform, Enterprise Edition дескриптор развертывания описывает то, как компонент, модуль или приложение (такое, как веб-приложение или приложение предприятия) должно быть развернуто.
Этот конфигурационный файл указывает параметры развертывания для модуля или приложения с определенными настройками, параметры безопасности и описывает конкретные требования к конфигурации. Для синтаксиса файлов дескриптора развертывания используется язык XML.
@ -227,7 +227,7 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##Какие действия необходимо проделать при создании сервлетов?
## Какие действия необходимо проделать при создании сервлетов?
Чтобы создать сервлет `ExampleServlet`, необходимо описать его в дескрипторе развёртывания:
```xml
@ -249,19 +249,19 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##В каком случае требуется переопределять метод `service()`?
## В каком случае требуется переопределять метод `service()`?
Метод `service()` переопределяется, когда необходимо, чтобы сервлет обрабатывал все запросы (и `GET`, и `POST`) в одном методе.
Когда контейнер сервлетов получает запрос клиента, то происходит вызов метода `service()`, который в зависимости от поступившего запроса вызывает или метод `doGet()` или метод `doPost()`.
[к оглавлению](#servlets-jsp-jstl)
##Есть ли смысл определять для сервлета конструктор? Каким образом лучше инициализировать данные?
## Есть ли смысл определять для сервлета конструктор? Каким образом лучше инициализировать данные?
Большого смысла определять для сервлета конструктор нет, т.к. инициализировать данные лучше не в конструкторе, а переопределив метод `init()`, в котором имеется возможность доступа к параметрам инициализации сервлета через использование объекта `ServletConfig`.
[к оглавлению](#servlets-jsp-jstl)
##Почему необходимо переопределить только `init()` метод без аргументов?
## Почему необходимо переопределить только `init()` метод без аргументов?
Метод `init()` переопределяется, если необходимо инициализировать какие-то данные до того как сервлет начнет обрабатывать запросы.
При переопределении метода `init(ServletConfig config)`, первым должен быть вызван метод `super(config)`, который обеспечит вызов метода `init(ServletConfig config)` суперкласса. `GenericServlet` предоставляет другой метод `init()` без параметров, который будет вызываться в конце метода `init(ServletConfig config)`.
@ -270,7 +270,7 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##Какие наиболее распространенные задачи выполняются в контейнере сервлетов?
## Какие наиболее распространенные задачи выполняются в контейнере сервлетов?
+ Поддержка обмена данными. Контейнер сервлетов предоставляет легкий способ обмена данными между веб клиентом (браузером) и сервлетом. Благодаря контейнеру нет необходимости создавать слушателя сокета на сервере для отслеживания запросов от клиента, а так же разбирать запрос и генерировать ответ. Все эти важные и комплексные задачи решаются с помощью контейнера и разработчик может сосредоточиться на бизнес логике приложения.
+ Управление жизненным циклом сервлетов и ресурсов. Начиная от загрузки сервлета в память, инициализации, внедрения методов и заканчивая уничтожением сервлета. Контейнер так же предоставляет дополнительные утилиты, например JNDI, для управления пулом ресурсов.
+ Поддержка многопоточности. Контейнер самостоятельно создает новую нить для каждого запроса и предоставляет ей запрос и ответ для обработки. Таким образом сервлет не инициализируется заново для каждого запроса и тем самым сохраняет память и уменьшает время до обработки запроса.
@ -279,7 +279,7 @@ __Контейнер сервлетов__ — программа, предста
[к оглавлению](#servlets-jsp-jstl)
##Что вы знаете о _сервлетных фильтрах_?
## Что вы знаете о _сервлетных фильтрах_?
__Сервлетный фильтр__ - это Java-код, пригодный для повторного использования и позволяющий преобразовать содержание HTTP-запросов, HTTP-ответов и информацию, содержащуюся в заголовках HTML. Сервлетный фильтр занимается предварительной обработкой запроса, прежде чем тот попадает в сервлет, и/или последующей обработкой ответа, исходящего из сервлета.
Сервлетные фильтры могут:
@ -343,7 +343,7 @@ __Сервлетный фильтр__ - это Java-код, пригодный
[к оглавлению](#servlets-jsp-jstl)
##Зачем в сервлетах используются различные _listener_?
## Зачем в сервлетах используются различные _listener_?
__Listener (слушатель)__ работает как триггер, выполняя определённые действия при наступлении какого-либо события в жизненном цикле сервлета.
Слушатели, разделённые по области видимости (scope):
@ -379,12 +379,12 @@ __Listener (слушатель)__ работает как триггер, вып
[к оглавлению](#servlets-jsp-jstl)
##Когда стоит использовать фильтры сервлетов, а когда слушателей?
## Когда стоит использовать фильтры сервлетов, а когда слушателей?
Следует использовать фильтры, если необходимо обрабатывать входящие или исходящие данные (например: для аутентификации, преобразования формата, компрессии, шифрования и т.д.), в случае, когда необходимо реагировать на события - лучше применять слушателей.
[к оглавлению](#servlets-jsp-jstl)
##Как реализовать запуск сервлета одновременно с запуском приложения?
## Как реализовать запуск сервлета одновременно с запуском приложения?
Контейнер сервлетов обычно загружает сервлет по первому запросу клиента.
Если необходимо загрузить сервлет прямо на старте приложения (например если загрузка сервлета происходит длительное время) следует использовать элемент `<load-on-startup>` в дескрипторе или аннотацию `@loadOnStartup` в коде сервлета, что будет указывать на необходимость загрузки сервлета при запуске.
@ -401,7 +401,7 @@ __Listener (слушатель)__ работает как триггер, вып
[к оглавлению](#servlets-jsp-jstl)
##Как обработать в приложении исключения, выброшенные другим сервлетом?
## Как обработать в приложении исключения, выброшенные другим сервлетом?
Когда приложение выбрасывет исключение контейнер сервлетов обрабатывает его и создаёт ответ в формате HTML. Это аналогично тому что происходит при кодах ошибок вроде 404, 403 и т.д.
В дополнении к этому существует возможность написания собственных сервлетов для обработки исключений и ошибок с указанием их в дескрипторе развертывания:
@ -422,7 +422,7 @@ __Listener (слушатель)__ работает как триггер, вып
[к оглавлению](#servlets-jsp-jstl)
##Что представляет собой `ServletConfig`?
## Что представляет собой `ServletConfig`?
Интерфейс `javax.servlet.ServletConfig` используется для передачи сервлету конфигурационной информации. Каждый сервлет имеет свой собственный экземпляр объекта `ServletConfig`, создаваемый контейнером сервлетов.
Для установки параметров конфигурации используются параметры `init-param` в `web.xml`:
@ -456,7 +456,7 @@ public class ExampleServlet extends HttpServlet {
[к оглавлению](#servlets-jsp-jstl)
##Что представляет собой `ServletContext`?
## Что представляет собой `ServletContext`?
Уникальный (в рамках веб-приложения) объект `ServletContext` реализует интерфейс `javax.servlet.ServletContext` и предоставляет сервлетам доступ к параметрам этого веб-приложения. Для предоставления доступа используется элемент `<context-param>` в `web.xml`:
```xml
@ -475,14 +475,14 @@ public class ExampleServlet extends HttpServlet {
[к оглавлению](#servlets-jsp-jstl)
##В чем отличия `ServletContext` и `ServletConfig`?
## В чем отличия `ServletContext` и `ServletConfig`?
+ `ServletConfig` уникален для сервлета, а `ServletContext` - для приложения;
+ `ServletConfig` используется для предоставления параметров инициализации конкретному сервлету, а `ServletContext` для предоставления параметров инициализации для всех сервлетов приложения;
+ для `ServletConfig` возможности модифицировать атрибуты отсутствуют, атрибуты в объекте `ServletContext` можно изменять.
[к оглавлению](#servlets-jsp-jstl)
##Для чего нужен интерфейс `ServletResponse`?
## Для чего нужен интерфейс `ServletResponse`?
Интерфейс `ServletResponse` используется для отправки данных клиенту. Все методы данного инструмента служат именно этой цели:
+ `String getCharacterEncoding()` - возвращает MIME тип кодировки (к примеру - UTF8), в которой будет выдаваться информация;
@ -495,12 +495,12 @@ public class ExampleServlet extends HttpServlet {
[к оглавлению](#servlets-jsp-jstl)
##Для чего нужен интерфейс `ServletRequest`?
## Для чего нужен интерфейс `ServletRequest`?
Интерфейс `ServletRequest` используется для получения параметров соединения, запроса, а также заголовков, входящего потока данных и т.д.
[к оглавлению](#servlets-jsp-jstl)
##Что такое `Request Dispatcher`?
## Что такое `Request Dispatcher`?
Интерфейс `RequestDispatcher` используется для передачи запроса другому ресурсу, при этом существует возможность добавления данных полученных из этого ресурса к собственному ответу сервлета. Так же этот интерфейс используется для внутренней коммуникации между сервлетами в одном контексте.
В интерфейса реализовано два метода:
@ -512,7 +512,7 @@ public class ExampleServlet extends HttpServlet {
[к оглавлению](#servlets-jsp-jstl)
##Как из одного сервлета вызвать другой сервлет?
## Как из одного сервлета вызвать другой сервлет?
Для вызова сервлета из того же приложения необходимо использовать механизм внутренней коммуникации сервлетов (_inter-servlet communication mechanisms_) через вызовы методов `RequestDispatcher`:
+ `forward()` - передаёт выполнение запроса в другой сервлет;
@ -522,7 +522,7 @@ public class ExampleServlet extends HttpServlet {
[к оглавлению](#servlets-jsp-jstl)
##Чем отличается `sendRedirect()` от `forward()`?
## Чем отличается `sendRedirect()` от `forward()`?
__`forward()`__:
+ Выполняется на стороне сервера;
@ -545,53 +545,53 @@ __`sendRedirect()`__:
[к оглавлению](#servlets-jsp-jstl)
##Для чего используются атрибуты сервлетов и как происходит работа с ними?
## Для чего используются атрибуты сервлетов и как происходит работа с ними?
Атрибуты сервлетов используются для внутренней коммуникации сервлетов.
В веб-приложении существует возможность работы с атрибутами используя методы `setAttribute()`, `getAttribute()`, `removeAttribute()`, `getAttributeNames()`, которые предоставлены интерфейсами `ServletRequest`, `HttpSession` и `ServletContext` (для областей видимости _request_, _session_, _context_ соответственно).
[к оглавлению](#servlets-jsp-jstl)
##Каким образом можно допустить в сервлете deadlock?
## Каким образом можно допустить в сервлете deadlock?
Можно получить блокировку, например, допустив циклические вызовы метода `doPost()` в методе `doGet()` и метода `doGet()` в методе `doPost()`.
[к оглавлению](#servlets-jsp-jstl)
##Как получить реальное расположение сервлета на сервере?
## Как получить реальное расположение сервлета на сервере?
Реальный путь к расположению сервлета на сервере можно получить из объекта `ServletContext`:
`getServletContext().getRealPath(request.getServletPath())`.
[к оглавлению](#servlets-jsp-jstl)
##Как получить информацию о сервере из сервлета?
## Как получить информацию о сервере из сервлета?
Информацию о сервере можно получить из объекта `ServletContext`:
`getServletContext().getServerInfo()`.
[к оглавлению](#servlets-jsp-jstl)
##Как получить IP адрес клиента на сервере?
## Как получить IP адрес клиента на сервере?
IP адрес клиента можно получить вызвав `request.getRemoteAddr()`.
[к оглавлению](#servlets-jsp-jstl)
##Какие классы-обертки для сервлетов вы знаете?
## Какие классы-обертки для сервлетов вы знаете?
Собственные обработчики `ServletRequest` и `ServletResponse` можно реализовать добавив новые или переопределив существующие методы у классов-обёрток `ServletRequestWrapper` (`HttpServletRequestWrapper`) и `ServletResponseWrapper` (`HttpServletRequestWrapper`).
[к оглавлению](#servlets-jsp-jstl)
##В чем отличия `GenericServlet` и `HttpServlet`?
## В чем отличия `GenericServlet` и `HttpServlet`?
Абстрактный класс `GenericServlet` — независимая от используемого протокола реализация интерфейса `Servlet`, а абстрактный класс `HttpServlet` в свою очередь расширяет `GenericServlet` для протокола HTTP..
[к оглавлению](#servlets-jsp-jstl)
##Почему `HttpServlet` класс объявлен как абстрактный?
## Почему `HttpServlet` класс объявлен как абстрактный?
Класс `HTTPServlet` предоставляет лишь общую реализацию сервлета для HTTP протокола. Реализация ключевых методов `doGet()` и `doPost()`, содержащих основную бизнес-логику перекладывается на разработчика и по умолчанию возвращает `HTTP 405 Method Not Implemented error`.
[к оглавлению](#servlets-jsp-jstl)
##Какие основные методы присутствуют в классе `HttpServlet`?
## Какие основные методы присутствуют в классе `HttpServlet`?
+ `doGet()` - для обработки HTTP запросов `GET`;
+ `doPost()` - для обработки HTTP запросов `POST`;
+ `doPut()` - для обработки HTTP запросов `PUT`;
@ -602,59 +602,59 @@ IP адрес клиента можно получить вызвав `request.g
[к оглавлению](#servlets-jsp-jstl)
##Стоит ли волноваться о многопоточной безопасности работая с сервлетами?
## Стоит ли волноваться о многопоточной безопасности работая с сервлетами?
Методы `init()` и `destroy()` вызываются один раз за жизненный цикл сервлета — поэтому по поводу них беспокоиться не стоит.
Методы `doGet()`, `doPost()`, `service()` вызываются на каждый запрос клиента и т.к. сервлеты используют многопоточность, то здесь задумываться о потокобезопасной работе обязательноЮ при этом правила использования многопоточности остаются теми же: локальные переменные этих методов будут созданы отдельно для каждого потока, а при использовании глобальных разделяемых ресурсов необходимо использовать синхронизацию или другие приёмы многопоточного программирования.
[к оглавлению](#servlets-jsp-jstl)
##Какой метод HTTP не является неизменяемым?
## Какой метод HTTP не является неизменяемым?
HTTP метод называется неизменяемым, если он на один и тот же запрос всегда возвращает одинаковый результат. HTTP методы `GET`, `PUT`, `DELETE`, `HEAD` и `OPTIONS` являются неизменяемыми, поэтому необходимо реализовывать приложение так, чтобы эти методы возвращали одинаковый результат постоянно. К изменяемым методам относится метод `POST`, который и используется для реализации чего-либо, что изменяется при каждом запросе.
К примеру, для доступа к статической HTML странице используется метод `GET`, т.к. он всегда возвращает одинаковый результат. При необходимости сохранять какую-либо информацию, например в базе данных, нужно использовать `POST` метод.
[к оглавлению](#servlets-jsp-jstl)
##Какие есть методы отправки данных с клиента на сервер?
## Какие есть методы отправки данных с клиента на сервер?
+ `GET` - используется для запроса содержимого указанного ресурса, изображения или гипертекстового документа. Вместе с за просом могут передаваться дополнительные параметры как часть URI, значения могут выбираться из полей формы или передаваться непосредственно через URL. При этом запросы кэшируются и имеют ограничения на размер. Этот метод является основным методом взаимодействия браузера клиента и веб-сервера.
+ `POST` - используется для передачи пользовательских данных в содержимом HTTP-запроса на сервер. Пользовательские данные упакованы в тело запроса согласно полю заголовка Content-Type и/или включены в URI запроса. При использовании метода POST под URI подразумевается ресурс, который будет обрабатывать запрос.
[к оглавлению](#servlets-jsp-jstl)
##В чем разница между методами `GET` и `POST`?
## В чем разница между методами `GET` и `POST`?
+ `GET` передает данные серверу используя URL, тогда как `POST` передает данные, используя тело HTTP запроса. Длина URL ограничена 1024 символами, это и будет верхним ограничением для данных, которые можно отослать через `GET`. `POST` может отправлять гораздо большие объемы данных. Лимит устанавливается web-server и составляет обычно около 2 Mb.
+ Передача данных методом `POST` более безопасна, чем методом `GET`, так как секретные данные (например пароль) не отображаются напрямую в web-клиенте пользователя, в отличии от URL, который виден почти всегда. Иногда это преимущество превращается в недостатком - вы не сможете послать данные за кого-то другого.
+ `GET`метод является неизменяемым, тогда как `POST` — изменяемый.
[к оглавлению](#servlets-jsp-jstl)
##В чем разница между `PrintWriter` и `ServletOutputStream`?
## В чем разница между `PrintWriter` и `ServletOutputStream`?
`PrintWriter` — класс для работы с символьным потоком, экземпляр которого можно получить через метод `ServletResponse` `getWriter()`;
`ServletOutputStream` — класс для работы байтовым потоком. Для получения его экземпляра используется метод `ServletResponse` `getOutputStream()`.
[к оглавлению](#servlets-jsp-jstl)
##Можно ли одновременно использовать в сервлете `PrintWriter` и `ServletOutputStream`?
## Можно ли одновременно использовать в сервлете `PrintWriter` и `ServletOutputStream`?
Так сделать не получится, т.к. при попытке одновременного вызова `getWriter()` и `getOutputStream()` будет выброшено исключение `java.lang.IllegalStateException` с сообщением, что уже был вызван другой метод.
[к оглавлению](#servlets-jsp-jstl)
##Расскажите об интерфейсе `SingleThreadModel`.
## Расскажите об интерфейсе `SingleThreadModel`.
Интерфейс `SingleThreadModel` является маркерным - в нем не объявлен ни один метод, однако, если сервлет реализует этот интерфейс, то метод `service()` этого сервлета гарантированно не будет одновременно выполняться в двух потоках. Контейнер сервлетов либо синхронизирует обращения к единственному экземпляру, либо обеспечивает поддержку пула экземпляров и перенаправление запроса свободному сервлету.
Другими словами, контейнер гарантирует отсутствие конфликтов при одновременном обращении к переменным или методам экземпляра сервлета. Однако существуют также и другие разделяемые ресурсы, которые даже при использовании этого интерфейса, остаются всё так же доступны обработчикам запросов в других потоках. Т.о. пользы от использования этого интерфейса немного и в спецификации Servlet 2.4 он был объявлен `deprecated`.
[к оглавлению](#servlets-jsp-jstl)
##Что означает _URL encoding_? Как это осуществить в Java?
## Что означает _URL encoding_? Как это осуществить в Java?
__URL Encoding__ — процесс преобразования данных в форму CGI (Common Gateway Interface), не содержащую пробелов и нестандартных символов, которые заменяются в процессе кодирования на специальные escape-символы. В Java для кодирования строки используется метод `java.net.URLEncoder.encode(String str, String unicode)`. Обратная операция декодирования возможна через использование метода `java.net.URLDecoder.decode(String str, String unicode)`.
> `Hello мир!` преобразовывается в `Hello%20%D0%BC%D0%B8%D1%80!`.
[к оглавлению](#servlets-jsp-jstl)
##Какие различные методы управления сессией в сервлетах вы знаете?
## Какие различные методы управления сессией в сервлетах вы знаете?
При посещении клиентом Web-ресурса и выполнении вариантов запросов, контекстная информация о клиенте не хранится. В протоколе HTTP нет возможностей для сохранения и изменения информации о предыдущих посещениях клиента. Сеанс (сессия) соединение между клиентом и сервером, устанавливаемое на определенное время, за которое клиент может отправить на сервер сколько угодно запросов. Сеанс устанавливается непосредственно между клиентом и Web-сервером. Каждый клиент устанавливает с сервером свой собственный сеанс. Сеансы используются для обеспечения хранения данных во время нескольких запросов Web-страницы или на обработку информации, введенной в пользовательскую форму в результате нескольких HTTP-соединений (например, клиент совершает несколько покупок в интернет-магазине; студент отвечает на несколько тестов в системе дистанционного обучения).
Существует несколько способов обеспечения уникального идентификатора сессии:
@ -669,7 +669,7 @@ __URL Encoding__ — процесс преобразования данных в
[к оглавлению](#servlets-jsp-jstl)
##Что такое _cookies_?
## Что такое _cookies_?
__Сookies («куки»)__ — небольшой фрагмент данных, отправленный web-сервером и хранимый на устройстве пользователя. Всякий раз при попытке открыть страницу сайта, web-клиент пересылает соответствующие этому сайту cookies web-серверу в составе HTTP-запроса. Применяется для сохранения данных на стороне пользователя и на практике обычно используется для:
+ аутентификации пользователя;
@ -679,7 +679,7 @@ __Сookies («куки»)__ — небольшой фрагмент данных
[к оглавлению](#servlets-jsp-jstl)
##Какие методы для работы с cookies предусмотрены в сервлетах?
## Какие методы для работы с cookies предусмотрены в сервлетах?
Servlet API предоставляет поддержку cookies через класс `javax.servlet.http.Cookie`:
+ Для получения массива cookies из запроса необходимо воспользоваться методом `HttpServletRequest.getCookies()`. Методов для добавления cookies в `HttpServletRequest` не предусмотрено.
@ -687,12 +687,12 @@ Servlet API предоставляет поддержку cookies через к
[к оглавлению](#servlets-jsp-jstl)
##Что такое _URL Rewriting_?
## Что такое _URL Rewriting_?
__URL Rewriting__ - специальная перезапись (перекодирование) оригинального URL. Данный механизм может использоваться для управления сессией в сервлетах, когда _cookies_ отключены.
[к оглавлению](#servlets-jsp-jstl)
##Зачем нужны и чем отличаются методы `encodeURL()` и `encodeRedirectURL()`?
## Зачем нужны и чем отличаются методы `encodeURL()` и `encodeRedirectURL()`?
`HttpServletResponse.encodeURL()` предоставляет способ преобразования URL в HTML гиперссылку с преобразованием спецсимволов и пробелов, а так же добавления _session id_ к URL. Такое поведение аналогично `java.net.URLEncoder.encode()`, но с добавлением дополнительного параметра `jsessionid` в конец URL.
Метод `HttpServletResponse.encodeRedirectURL()` преобразует URL для последующего использования в методе `sendRedirect()`.
@ -701,34 +701,34 @@ __URL Rewriting__ - специальная перезапись (перекод
[к оглавлению](#servlets-jsp-jstl)
##Что такое сессия»_?
## Что такое сессия»_?
__Сессия__ - это сеанс связи между клиентом и сервером, устанавливаемый на определенное время. Сеанс устанавливается непосредственно между клиентом и веб-сервером в момент получения первого запроса к веб-приложению. Каждый клиент устанавливает с сервером свой собственный сеанс, который сохраняется до окончания работы с приложением.
[к оглавлению](#servlets-jsp-jstl)
##Как уведомить объект в сессии, что сессия недействительна или закончилась?
## Как уведомить объект в сессии, что сессия недействительна или закончилась?
Чтобы быть уверенным в том, что объект будет оповещён о прекращении сессии, нужно реализовать интерфейс `javax.servlet.http.HttpSessionBindingListener`. Два метода этого интерфейса: `valueBound()` и `valueUnbound()` используются при добавлении объекта в качестве атрибута к сессии и при уничтожении сессии соответственно.
[к оглавлению](#servlets-jsp-jstl)
##Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с верной сессией?
## Какой существует эффективный способ удостоверится, что все сервлеты доступны только для пользователя с верной сессией?
Сервлет фильтры используются для перехвата всех запросов между контейнером сервлетов и сервлетом. Поэтому логично использовать соответствующий фильтр для проверки необходимой информации (например валидности сессии) в запросе.
[к оглавлению](#servlets-jsp-jstl)
##Как мы можем обеспечить _transport layer security_ для нашего веб приложения?
## Как мы можем обеспечить _transport layer security_ для нашего веб приложения?
Для обеспечения _transport layer security_ необходимо настроить поддержку SSL сервлет контейнера. Как это сделать зависит от конкретной реализации сервлет-контейнера.
[к оглавлению](#servlets-jsp-jstl)
##Как организовать подключение к базе данных, обеспечить журналирование в сервлете?
## Как организовать подключение к базе данных, обеспечить журналирование в сервлете?
При работе с большим количеством подключений к базе данных рекомендуется инициализировать их в _servlet context listener_, а также установить в качестве атрибута контекста для возможности использования другими сервлетами.
Журналирование подключается к сервлету стандартным для логгера способом (например для _log4j_ это может быть property-файл или XML-конфигурация) , а далее эта информация используется при настройке соответствующего _context listener_.
[к оглавлению](#servlets-jsp-jstl)
##Какие основные особенности появились в спецификации _Servlet 3_?
## Какие основные особенности появились в спецификации _Servlet 3_?
+ __Servlet Annotations__. До Servlet 3 вся конфигурация содержалась в `web.xml`, что приводило к ошибкам и неудобству при работе с большим количестве сервлетов. Примеры аннотаций: `@WebServlet`, `@WebInitParam`, `@WebFilter`, `@WebListener`.
+ __Web Fragments__. Одностраничное веб приложение может содержать множество модулей: все модули прописываются в `fragment.xml` в папке `META-INF\`. Это позволяет разделять веб приложение на отдельные модули, собранные как .jar-файлы в отдельной `lib\` директории.
+ __Динамическое добавление веб компонентов__. Появилась возможность программно добавлять фильтры и слушатели, используя `ServletContext` объект. Для этого применяются методы `addServlet()`, `addFilter()`, `addListener()`. Используя это нововведение стало доступным построение динамической системы, в которой необходимый объект будет создан и вызван только по необходимости.
@ -736,7 +736,7 @@ __Сессия__ - это сеанс связи между клиентом и
[к оглавлению](#servlets-jsp-jstl)
##Какие способы аутентификации доступны сервлету?
## Какие способы аутентификации доступны сервлету?
Спецификация сервлетов определяет четыре типа проверки подлинности:
+ __HTTP Basic Authentication__ - `BASIC`. При доступе к закрытым ресурсам появится окно, которое попросит ввести данные для аутентификации.
@ -756,7 +756,7 @@ __Сессия__ - это сеанс связи между клиентом и
[к оглавлению](#servlets-jsp-jstl)
##Что такое _Java Server Pages (JSP)_?
## Что такое _Java Server Pages (JSP)_?
__JSP (JavaServer Pages)__ — платформонезависимая переносимая и легко расширяемая технология разработки веб-приложений, позволяющая веб-разработчикам создавать содержимое, которое имеет как статические, так и динамические компоненты. Страница JSP содержит текст двух типов: статические исходные данные, которые могут быть оформлены в одном из текстовых форматов HTML, SVG, WML, или XML, и _JSP-элементы_, которые конструируют динамическое содержимое. Кроме этого могут использоваться _библиотеки JSP-тегов_, а также _EL (Expression Language)_, для внедрения Java-кода в статичное содержимое JSP-страниц.
Код JSP-страницы транслируется в Java-код сервлета с помощью компилятора JSP-страниц _Jasper_, и затем компилируется в байт-код JVM.
@ -765,7 +765,7 @@ JSP-страницы загружаются на сервере и управл
[к оглавлению](#servlets-jsp-jstl)
##Зачем нужен JSP?
## Зачем нужен JSP?
JSP расширяет технологию сервлетов обеспечивая возможность создания динамических страницы с HTML подобным синтаксисом.
Хотя создание представлений поддерживается и в сервлетах, но большая часть любой веб-страницы является статической, поэтому код сервлета в таком случае получается чересчур перегруженным, замусоренным и поэтому при его написании легко допустить ошибку.
@ -776,12 +776,12 @@ JSP расширяет технологию сервлетов обеспечи
[к оглавлению](#servlets-jsp-jstl)
##Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
## Опишите, как обрабатываются JSP страницы, начиная от запроса к серверу, заканчивая ответом пользователю.
Когда пользователь переходит по ссылке на страницу `page.jsp`, он отправляет http-запрос на сервер `GET /page.jsp`. Затем, на основе этого запроса и текста самой страницы, сервер генерирует java-класс, компилирует его и выполняет полученный сервлет, формирующий ответ пользователю в виде представления этой страницы, который сервер и перенаправляет обратно пользователю.
[к оглавлению](#servlets-jsp-jstl)
##Расскажите об этапах (фазах) жизненного цикла JSP.
## Расскажите об этапах (фазах) жизненного цикла JSP.
Если посмотреть код внутри созданной JSP страницы, то он будет выглядеть как HTML и не будет похож на java класс. Конвертацией JSP страниц в HTML код занимается контейнер, который так же создает и сервлет для использования в веб приложении.
Жизненный цикл JSP состоит из нескольких фаз, которыми руководит JSP контейнер:
@ -796,7 +796,7 @@ JSP расширяет технологию сервлетов обеспечи
[к оглавлению](#servlets-jsp-jstl)
##Расскажите о методах жизненного цикла JSP.
## Расскажите о методах жизненного цикла JSP.
Контейнер сервлетов (например, Tomcat, GlassFish) создает из JSP-страницы класс сервлета, наследующего свойства интерфейса `javax.servlet.jsp.HttpJspBase` и включающего следующие методы:
+ `jspInit()` — метод объявлен в JSP странице и реализуется с помощью контейнера. Этот метод вызывается один раз в жизненном цикле JSP для того, чтобы инициализировать конфигурационные параметры указанные в дескрипторе развертывания. Этот метод можно переопределить с помощью определения элемента _JSP scripting_ и указания необходимых параметров для инициализации;
@ -805,12 +805,12 @@ JSP расширяет технологию сервлетов обеспечи
[к оглавлению](#servlets-jsp-jstl)
##Какие методы жизненного цикла JSP могут быть переопределены?
## Какие методы жизненного цикла JSP могут быть переопределены?
Возможно переопределить лишь `jspInit()` и `jspDestroy()` методы.
[к оглавлению](#servlets-jsp-jstl)
##Как можно предотвратить прямой доступ к JSP странице из браузера?
## Как можно предотвратить прямой доступ к JSP странице из браузера?
Прямой доступ к директории `/WEB-INF/` из веб-приложения отсутствует. Поэтому JSP-страницы можно расположить внутри этой папки и тем самым запретить доступ к странице из браузера. Однако, по аналогии с описанием сервлетов, будет необходимо настроить дескриптор развертывания:
```xml
@ -831,20 +831,20 @@ JSP расширяет технологию сервлетов обеспечи
[к оглавлению](#servlets-jsp-jstl)
##Какая разница между _динамическим_ и _статическим_ содержимым JSP?
## Какая разница между _динамическим_ и _статическим_ содержимым JSP?
Статическое содержимое JSP (HTML, код JavaScript, изображения и т.д.) не изменяется в процессе работы веб приложения.
Динамические ресурсы созданы для того, чтобы отображать свое содержимое в зависимости от пользовательских действий. Обычно они представлены в виде выражений EL (Expression Language), библиотек JSP-тегов и пр.
[к оглавлению](#servlets-jsp-jstl)
##Как закомментировать код в JSP?
## Как закомментировать код в JSP?
+ `<!—- HTML комментарий; отображается на странице JSP —->` такие комментарии будут видны клиенту при просмотре кода страницы.
+ `<%—- JSP комментарий; не отображается на странице JSP —-%>` такие комментарии описываются в созданном сервлете и не посылаются клиенту. Для любых комментариев по коду или отладочной информации необходимо использовать именно такой тип комментариев.
[к оглавлению](#servlets-jsp-jstl)
##Какие существуют основные типы тегов JSP?
## Какие существуют основные типы тегов JSP?
+ _Выражение JSP_: `<%= expression %>` - выражение, которое будет обработано с перенаправлением результата на вывод;
+ _Скриплет JSP_: `<% code %>` - код, добавляемый в метод `service()`.
+ _Объявление JSP_: `<%! code %>` - код, добавляемый в тело класса сервлета вне метода `service()`.
@ -854,7 +854,7 @@ JSP расширяет технологию сервлетов обеспечи
[к оглавлению](#servlets-jsp-jstl)
##Что вы знаете о действиях JSP (_Action tag_ и _JSP Action Elements_).
## Что вы знаете о действиях JSP (_Action tag_ и _JSP Action Elements_).
__Action tag__ и __JSP Action Elements__ предоставляют методы работы с Java Beans, подключения ресурсов, проброса запросов и создания динамических XML элементов. Такие элементы всегда начинаются с записи `jsp:` и используются непосредственно внутри страницы JSP без необходимости подключения сторонних библиотек или дополнительных настроек.
Наиболее часто используемыми JSP Action Elements являются:
@ -867,7 +867,7 @@ __Action tag__ и __JSP Action Elements__ предоставляют метод
[к оглавлению](#servlets-jsp-jstl)
##Взаимодействие _JSP - сервлет - JSP_.
## Взаимодействие _JSP - сервлет - JSP_.
_«JSP - сервлет - JSP»_ архитектура построения приложений носит название _MVC (Model/View/Controller)_:
+ _Model_ - классы данных и бизнес-логики;
@ -878,7 +878,7 @@ _«JSP - сервлет - JSP»_ архитектура построения п
[к оглавлению](#servlets-jsp-jstl)
##Какие области видимости переменных существуют в JSP?
## Какие области видимости переменных существуют в JSP?
Область видимости объектов определяется тем контекстом в который помещается данный объект. В зависимости от той или иной области действия так же определяется время существования объекта.
В JSP предусмотрены следующие области действия переменных (объектов):
@ -900,7 +900,7 @@ _«JSP - сервлет - JSP»_ архитектура построения п
[к оглавлению](#servlets-jsp-jstl)
##Какие неявные, внутренние объекты и методы есть на JSP странице?
## Какие неявные, внутренние объекты и методы есть на JSP странице?
__JSP implicit objects (неявные объекты)__ создаются контейнером при конвертации JSP страницы в код сервлета для помощи разработчикам. Эти объекты можно использовать напрямую в скриптлетах для передачи информации в сервис методы, однако мы не можем использовать неявные объекты в JSP Declaration, т.к. такой код пойдет на уровень класса.
Существует 9 видов неявных объектов, которые можно использовать прямо на JSP странице. Семь из них объявлены как локальные переменные в начале `_jspService()` метода, а два оставшихся могут быть использованы как аргументы метода `_jspService()`.
@ -962,12 +962,12 @@ __JSP implicit objects (неявные объекты)__ создаются ко
[к оглавлению](#servlets-jsp-jstl)
##Какие неявные объекты не доступны в обычной JSP странице?
## Какие неявные объекты не доступны в обычной JSP странице?
Неявный объект исключений JSP недоступен в обычных JSP страницах и используется на страницах ошибок JSP (_errorpage_) только для того, чтобы перехватить исключение, выброшенное JSP страницей и далее предоставить какую-либо полезную информацию клиенту.
[к оглавлению](#servlets-jsp-jstl)
##Что вы знаете о `PageContext` и какие преимущества его использования?
## Что вы знаете о `PageContext` и какие преимущества его использования?
Неявный объект JSP - экземпляр класса `javax.servlet.jsp.PageContext` предоставляет доступ ко всем пространствам имён, ассоциированным с JSP-страницей, а также к различным её атрибутам.
Остальные неявные объекты добавляются к `pageContext` автоматически.
@ -985,7 +985,7 @@ __JSP implicit objects (неявные объекты)__ создаются ко
[к оглавлению](#servlets-jsp-jstl)
##Как сконфигурировать параметры инициализации для JSP?
## Как сконфигурировать параметры инициализации для JSP?
Параметры инициализации для JSP задаются в `web.xml` файле аналогично сервлетам - элементами `servlet` и `servlet-mapping`. Единственным отличием будет указание местонахождения JSP страницы:
```xml
@ -1001,12 +1001,12 @@ __JSP implicit objects (неявные объекты)__ создаются ко
[к оглавлению](#servlets-jsp-jstl)
##Почему не рекомендуется использовать скриплеты (скриптовые элементы) в JSP?
## Почему не рекомендуется использовать скриплеты (скриптовые элементы) в JSP?
JSP страницы используются в основном для целей отображения представления (_view_), а вся бизнес-логика (_controller_) и модель (_model_) должны быть реализованы в сервлетах или классах-моделях. Обязанность JSP страницы - создание HTML ответа из переданных через атрибуты параметров. Большая часть JSP содержит HTML код а для того, чтобы помочь верстальщикам понять JSP код страницы предоставляется функционал элементов _action_, _JSP EL_, _JSP Standart Tag Library_. Именно их и необходимо использовать вместо скриптлетов для создания моста между (JSP)HTML и (JSP)Java частями.
[к оглавлению](#servlets-jsp-jstl)
##Можно ли определить класс внутри JSP страницы?
## Можно ли определить класс внутри JSP страницы?
Определить класс внутри JSP страницы можно, но это считается плохой практикой:
```java
@ -1025,7 +1025,7 @@ private class ExampleTwo {
[к оглавлению](#servlets-jsp-jstl)
##Что вы знаете о Языке выражений JSP (JSP Expression Language EL)?
## Что вы знаете о Языке выражений JSP (JSP Expression Language EL)?
__JSP Expression Language (EL)__ — скриптовый язык выражений, который позволяет получить доступ к Java компонентам (JavaBeans) из JSP. Начиная с JSP 2.0 используется внутри JSP тегов для отделения Java кода от JSP для обеспечения лёгкого доступа к Java компонентам, уменьшая при этом количество кода Java в JSP-страницах, или даже полностью исключая его.
Развитие EL происходило с целью сделать его более простым для дизайнеров, которые имеют минимальные познания в языке программирования Java. До появления языка выражений, JSP имел несколько специальных тегов таких как скриптлеты (англ.), выражения и т. п. которые позволяли записывать Java код непосредственно на странице. С использованием языка выражений веб-дизайнер должен знать только то, как организовать вызов соответствующих java-методов.
@ -1041,7 +1041,7 @@ __JSP Expression Language (EL)__ — скриптовый язык выраже
[к оглавлению](#servlets-jsp-jstl)
##Какие типы EL операторов вы знаете?
## Какие типы EL операторов вы знаете?
Операторы в EL поддерживают наиболее часто используемые манипуляции данными.
Типы операторов:
@ -1053,12 +1053,12 @@ __JSP Expression Language (EL)__ — скриптовый язык выраже
[к оглавлению](#servlets-jsp-jstl)
##Назовите неявные, внутренние объекты JSP EL и их отличия от объектов JSP.
## Назовите неявные, внутренние объекты JSP EL и их отличия от объектов JSP.
Язык выражений JSP предоставляет множество неявных объектов, которые можно использовать для получения атрибутов в различных областях видимости (scopes) и для значений параметров. Важно отметить, что они отличаются от неявных объектов JSP и содержат атрибуты в заданной области видимости. Наиболее часто использующийся implicit object в JSP EL и JSP page — это объект pageContext. Ниже представлена таблица неявных объектов JSP EL.
[к оглавлению](#servlets-jsp-jstl)
##Как отключить возможность использования EL в JSP?
## Как отключить возможность использования EL в JSP?
Для игнорирования выполнения языка выражений на странице существует два способа:
+ использовать директиву `<%@ page isELIgnored = «true» %>`,
@ -1075,12 +1075,12 @@ __JSP Expression Language (EL)__ — скриптовый язык выраже
[к оглавлению](#servlets-jsp-jstl)
##Как узнать тип HTTP метода используя JSP EL?
## Как узнать тип HTTP метода используя JSP EL?
`${pageContext.request.method}`.
[к оглавлению](#servlets-jsp-jstl)
##Что такое _JSTL (JSP Standard tag library)_?
## Что такое _JSTL (JSP Standard tag library)_?
__JavaServer Pages Standard Tag Library, JSTL, Стандартная библиотека тегов JSP__ — расширение спецификации JSP (конечный результат _JSR 52_), добавляющее библиотеку JSP тегов для общих нужд, таких как разбор XML данных, условная обработка, создание циклов и поддержка интернационализации.
JSTL является альтернативой такому виду встроенной в JSP логики, как _скриплеты_ (прямые вставки Java кода). Использование стандартизованного множества тегов предпочтительнее, поскольку получаемый код легче поддерживать и проще отделять бизнес-логику от логики отображения.
@ -1114,7 +1114,7 @@ JSTL является альтернативой такому виду встр
[к оглавлению](#servlets-jsp-jstl)
##Из каких групп тегов состоит библиотека _JSTL_?
## Из каких групп тегов состоит библиотека _JSTL_?
Группы тегов JSTL согласно их функциональности:
+ _Core Tags_ предоставляют возможности итерации, обработки исключений, URL, _forward_, _redirect response_ и т.д.
@ -1125,19 +1125,19 @@ JSTL является альтернативой такому виду встр
[к оглавлению](#servlets-jsp-jstl)
##Какая разница между `<c:set>` и `<jsp:useBean>`?
## Какая разница между `<c:set>` и `<jsp:useBean>`?
Оба тега создают и помещают экземпляры в заданную область видимости, но `<jsp:useBean>` только создаёт экземпляр конкретного типа, а `<c:set>`, создав экземпляр, позволяет дополнительно извлекать значение, например, из параметров запроса, сессии и т. д.
[к оглавлению](#servlets-jsp-jstl)
##Чем отличается `<c:import>` от `<jsp:include>` и директивы `<%@include %>`?
## Чем отличается `<c:import>` от `<jsp:include>` и директивы `<%@include %>`?
По сравнению с action-тегом `<jsp:include>` и директивой `<%@include %>` тег `<c:import>` обеспечивает более совершенное включение динамических ресурсов, т.к. получает доступ к источнику, чтение информации из которого происходит непосредственно без буферизации и контент включается в исходную JSP построчно.
[к оглавлению](#servlets-jsp-jstl)
##Как можно расширить функциональность JSP?
##Что вы знаете о написании пользовательских JSP тегов?
##Приведите пример использования собственных тегов.
## Как можно расширить функциональность JSP?
## Что вы знаете о написании пользовательских JSP тегов?
## Приведите пример использования собственных тегов.
JSP можно расширить с помощью создания собственных тегов с необходимой функциональностью, которые можно добавить в библиотеку тегов на страницу JSP указав необходимое пространство имен.
> /WEB-INF/exampleTag.tld
@ -1202,27 +1202,27 @@ public class ExampleTag extends TagSupport{
Также в пользовательских тегах существует возможность задать входные параметры. Например, существует необходимость отформатировать каким-либо стилем очень длинное число. Для этого можно использовать собственный тег по типу:
`<mytags:formatNumber number="123456.789" format="#,###.00"/>`
`<mytags:formatNumber number="123456.789" format="#,## #.00"/>`
Используя входные параметры, число должно быть преобразовано на JSP странице в таком виде `123,456.79` согласно шаблону. Т.к. JSTL не предоставляет такой функциональности, необходимо создать пользовательский тег для получения необходимого результата.
[к оглавлению](#servlets-jsp-jstl)
##Как сделать перенос строки в HTML средствами JSP?
## Как сделать перенос строки в HTML средствами JSP?
Для переноса строки можно использовать тег `c:out` и атрибут `escapeXml`, который отключает обработку HTML элементов. В этом случае браузер получит следующий код в виде строки и обработает элемент `<br>` как требуется:
`<c:out value="<br> creates a new line in HTML" escapeXml="true"></c:out>`
[к оглавлению](#servlets-jsp-jstl)
##Почему не нужно конфигурировать стандартные JSP теги в `web.xml`?
## Почему не нужно конфигурировать стандартные JSP теги в `web.xml`?
Стандартные теги JSP не конфигурируются в `web.xml`, потому что tld файлы уже находятся внутри каталога `/META-INF/` в jar файлах JSTL.
Когда контейнер загружает веб-приложение и находит tld файлы в в jar файле в директории `/META-INF/`, то он автоматически настраивает их для непосредственного использования на JSP страницах. Остается только задать пространство имен на JSP странице.
[к оглавлению](#servlets-jsp-jstl)
##Как можно обработать ошибки JSP страниц?
## Как можно обработать ошибки JSP страниц?
Для обработки исключений выброшенных на JSP странице достаточно лишь задать страницу ошибки JSP и при её создании установить значение _page directive attribute_ `isErrorPage` в значение `true`. Таким образом будет предоставлен доступ к неявным объектам исключений в JSP и появится возможность передавать собственные, более информативные сообщения об ошибках клиенту. При этом настройка дескриптора развертывания выглядит так:
```xml
@ -1239,7 +1239,7 @@ public class ExampleTag extends TagSupport{
[к оглавлению](#servlets-jsp-jstl)
##Как происходит обработка ошибок с помощью JSTL?
## Как происходит обработка ошибок с помощью JSTL?
Для перехвата и обработки исключений в служебных методах класса служат JSTL Core Tags `c:catch` и `c:if`.
> Тег `c:catch` перехватывает исключение и обертывает его в переменную `exception`, доступную для обработки в теге `c:if`:
@ -1257,7 +1257,7 @@ public class ExampleTag extends TagSupport{
[к оглавлению](#servlets-jsp-jstl)
##Как конфигурируется JSP в дескрипторе развертывания.
## Как конфигурируется JSP в дескрипторе развертывания.
Для настройки различных параметров JSP страниц используется элемент `jsp-config`, который отвечает за:
+ управление элементами скриптлетов на странице;
@ -1277,24 +1277,24 @@ public class ExampleTag extends TagSupport{
[к оглавлению](#servlets-jsp-jstl)
##Можно ли использовать Javascript на JSP странице?
## Можно ли использовать Javascript на JSP странице?
Да, это возможно. Несмотря на то, что JSP это серверная технология, на выходе она всё равно создает `HTML` страницу, на которую можно добавлять Javascript и CSS.
[к оглавлению](#servlets-jsp-jstl)
##Всегда ли создается объект сессии на JSP странице, можно ли отключить его создание?
## Всегда ли создается объект сессии на JSP странице, можно ли отключить его создание?
Jsp-страница, по умолчанию, всегда создает сессию. Используя директиву `page` с атрибутом `session` можно изменить это поведение:
`<%@ page session ="false" %>`
[к оглавлению](#servlets-jsp-jstl)
##Какая разница между `JSPWriter` и сервлетным `PrintWriter`?
## Какая разница между `JSPWriter` и сервлетным `PrintWriter`?
`PrintWriter` является объектом отвечающим за запись содержания ответа на запрос. `JspWriter` использует объект `PrintWriter` для буферизации. Когда буфер заполняется или сбрасывается, `JspWriter` использует объект `PrintWriter` для записи содержания в ответ.
[к оглавлению](#servlets-jsp-jstl)
##Опишите общие практические принципы работы с JSP.
## Опишите общие практические принципы работы с JSP.
Хорошей практикой работы с технологией JSP является соблюдение следующих правил:
+ Следует избегать использования элементов скриптлетов на странице. Если элементы _action_, _JSTL_, _JSP EL_ не удовлетворяют потребностям, то желательно написать собственный тег.
@ -1313,4 +1313,4 @@ Jsp-страница, по умолчанию, всегда создает се
+ [javastudy.ru](http://javastudy.ru/interview/jee-servlet-api-questions/)
+ [java2ee.ru](http://www.java2ee.ru/servlets/)
+ [Java-online](http://java-online.ru/jsp-questions.xhtml)
+ [Codenet](http://www.codenet.ru/webmast/java/jsp.php)
+ [Codenet](http://www.codenet.ru/webmast/java/jsp.php)

72
sql.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#SQL
# SQL
+ [Что такое _«SQL»_?](#Что-такое-sql)
+ [Какие существуют операторы SQL?](#Какие-существуют-операторы-sql)
+ [Что означает `NULL` в SQL?](#Что-означает-null-в-sql)
@ -37,12 +37,12 @@
+ [Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL?](#Для-чего-используются-операторы-intersect-except-в-transact-sql)
+ [Напишите запрос...](#Напишите-запрос)
##Что такое _«SQL»_?
## Что такое _«SQL»_?
SQL, Structured query language («язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД).
[к оглавлению](#sql)
##Какие существуют операторы SQL?
## Какие существуют операторы SQL?
__операторы определения данных (Data Definition Language, DDL)__:
+ `CREATE` создает объект БД (базу, таблицу, представление, пользователя и т. д.),
@ -70,26 +70,26 @@ __операторы управления транзакциями (Transaction
[к оглавлению](#sql)
##Что означает `NULL` в SQL?
## Что означает `NULL` в SQL?
`NULL` - специальное значение (псевдозначение), которое может быть записано в поле таблицы базы данных. NULL соответствует понятию «пустое поле», то есть «поле, не содержащее никакого значения».
`NULL` означает отсутствие, неизвестность информации. Значение `NULL` не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому `NULL` не равно ни логическому значению `FALSE`, ни _пустой строке_, ни `0`. При сравнении `NULL` с любым значением будет получен результат `NULL`, а не `FALSE` и не `0`. Более того, `NULL` не равно `NULL`!
[к оглавлению](#sql)
##Что такое _«временная таблица»_? Для чего она используется?
## Что такое _«временная таблица»_? Для чего она используется?
__Временная таблица__ - это объект базы данных, который хранится и управляется системой базы данных на временной основе. Они могут быть локальными или глобальными. Используется для сохранения результатов вызова хранимой процедуры, уменьшение числа строк при соединениях, агрегирование данных из различных источников или как замена курсоров и параметризованных представлений.
[к оглавлению](#sql)
##Что такое _«представление» (view)_ и для чего оно применяется?
## Что такое _«представление» (view)_ и для чего оно применяется?
__Представление__, View - виртуальная таблица, представляющая данные одной или более таблиц альтернативным образом.
В действительности представление всего лишь результат выполнения оператора `SELECT`, который хранится в структуре памяти, напоминающей SQL таблицу. Они работают в запросах и операторах DML точно также как и основные таблицы, но не содержат никаких собственных данных. Представления значительно расширяют возможности управления данными. Это способ дать публичный доступ к некоторой (но не всей) информации в таблице.
[к оглавлению](#sql)
##Каков общий синтаксис оператора `SELECT`?
## Каков общий синтаксис оператора `SELECT`?
`SELECT` - оператор DML SQL, возвращающий набор данных (выборку) из базы данных, удовлетворяющих заданному условию. Имеет следующую структуру:
```sql
@ -105,7 +105,7 @@ SELECT
[к оглавлению](#sql)
##Что такое `JOIN`?
## Что такое `JOIN`?
__JOIN__ - оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Предназначен для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор.
Особенностями операции соединения являются следующее:
@ -126,7 +126,7 @@ FROM
[к оглавлению](#sql)
##Какие существуют типы `JOIN`?
## Какие существуют типы `JOIN`?
__(INNER) JOIN__
Результатом объединения таблиц являются записи, общие для левой и правой таблиц. Порядок таблиц для оператора не важен, поскольку оператор является симметричным.
@ -144,39 +144,39 @@ __CROSS JOIN (декартово произведение)__
[к оглавлению](#sql)
##Что лучше использовать `JOIN` или подзапросы?
## Что лучше использовать `JOIN` или подзапросы?
Обычно лучше использовать `JOIN`, поскольку в большинстве случаев он более понятен и лучше оптимизируется СУБД (но 100% этого гарантировать нельзя). Так же `JOIN` имеет заметное преимущество над подзапросами в случае, когда список выбора `SELECT` содержит столбцы более чем из одной таблицы.
Подзапросы лучше использовать в случаях, когда нужно вычислять агрегатные значения и использовать их для сравнений во внешних запросах.
[к оглавлению](#sql)
##Для чего используется оператор `HAVING`?
## Для чего используется оператор `HAVING`?
`HAVING` используется для фильтрации результата `GROUP BY` по заданным логическим условиям.
[к оглавлению](#sql)
##В чем различие между операторами `HAVING` и `WHERE`?
## В чем различие между операторами `HAVING` и `WHERE`?
`HAVING` используется как `WHERE`, но в другой части SQL-выражения и, соответственно, на другой стадии формирования ответа.
[к оглавлению](#sql)
##Для чего используется оператор `ORDER BY`?
## Для чего используется оператор `ORDER BY`?
__ORDER BY__ упорядочивает вывод запроса согласно значениям в том или ином количестве выбранных столбцов. Многочисленные столбцы упорядочиваются один внутри другого. Возможно определять возрастание `ASC` или убывание `DESC` для каждого столбца. По умолчанию установлено - возрастание.
[к оглавлению](#sql)
##Для чего используется оператор `GROUP BY`?
## Для чего используется оператор `GROUP BY`?
`GROUP BY` используется для агрегации записей результата по заданным признакам-атрибутам.
[к оглавлению](#sql)
##Как `GROUP BY` обрабатывает значение `NULL`?
## Как `GROUP BY` обрабатывает значение `NULL`?
При использовании `GROUP BY` все значения `NULL` считаются равными.
[к оглавлению](#sql)
##В чем разница между операторами `GROUP BY` и `DISTINCT`?
## В чем разница между операторами `GROUP BY` и `DISTINCT`?
`DISTINCT` указывает, что для вычислений используются только уникальные значения столбца. `NULL` считается как отдельное значение.
`GROUP BY` создает отдельную группу для всех возможных значений (включая значение `NULL`).
@ -184,7 +184,7 @@ __ORDER BY__ упорядочивает вывод запроса согласн
[к оглавлению](#sql)
##Перечислите основные агрегатные функции.
## Перечислите основные агрегатные функции.
__Агрегатных функции__ - функции, которые берут группы значений и сводят их к одиночному значению.
SQL предоставляет несколько агрегатных функций:
@ -197,19 +197,19 @@ SQL предоставляет несколько агрегатных функ
[к оглавлению](#sql)
##В чем разница между `COUNT(*)` и `COUNT({column})`?
## В чем разница между `COUNT(*)` и `COUNT({column})`?
`COUNT (*)` подсчитывает количество записей в таблице, не игнорируя значение NULL, поскольку эта функция оперирует записями, а не столбцами.
`COUNT ({column})` подсчитывает количество значений в `{column}`. При подсчете количества значений столбца эта форма функции `COUNT` не принимает во внимание значение `NULL`.
[к оглавлению](#sql)
##Что делает оператор `EXISTS`?
## Что делает оператор `EXISTS`?
`EXISTS` берет подзапрос, как аргумент, и оценивает его как `TRUE`, если подзапрос возвращает какие-либо записи и `FALSE`, если нет.
[к оглавлению](#sql)
##Для чего используются операторы `IN`, `BETWEEN`, `LIKE`?
## Для чего используются операторы `IN`, `BETWEEN`, `LIKE`?
`IN` - определяет набор значений.
```sql
@ -234,12 +234,12 @@ SELECT * FROM UNIVERSITY WHERE NAME LIKE '%o';
[к оглавлению](#sql)
##Для чего применяется ключевое слово `UNION`?
## Для чего применяется ключевое слово `UNION`?
В языке SQL ключевое слово `UNION` применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих записей. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах. Необходимо отметить, что `UNION` сам по себе не гарантирует порядок записей. Записи из второго запроса могут оказаться в начале, в конце или вообще перемешаться с записями из первого запроса. В случаях, когда требуется определенный порядок, необходимо использовать `ORDER BY`.
[к оглавлению](#sql)
##Какие ограничения на целостность данных существуют в SQL?
## Какие ограничения на целостность данных существуют в SQL?
`PRIMARY KEY` - набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей.
`CHECK` используется для ограничения множества значений, которые могут быть помещены в данный столбец. Это ограничение используется для обеспечения целостности предметной области, которую описывают таблицы в базе.
@ -250,17 +250,17 @@ SELECT * FROM UNIVERSITY WHERE NAME LIKE '%o';
[к оглавлению](#sql)
##Какие отличия между ограничениями `PRIMARY` и `UNIQUE`?
## Какие отличия между ограничениями `PRIMARY` и `UNIQUE`?
По умолчанию ограничение `PRIMARY` создает кластерный индекс на столбце, а `UNIQUE` - некластерный. Другим отличием является то, что `PRIMARY` не разрешает `NULL` записей, в то время как `UNIQUE` разрешает одну (а в некоторых СУБД несколько) `NULL` запись.
[к оглавлению](#sql)
##Может ли значение в столбце, на который наложено ограничение `FOREIGN KEY`, равняться `NULL`?
## Может ли значение в столбце, на который наложено ограничение `FOREIGN KEY`, равняться `NULL`?
Может, если на данный столбец не наложено ограничение `NOT NULL`.
[к оглавлению](#sql)
##Как создать индекс?
## Как создать индекс?
Индекс можно создать либо с помощью выражения `CREATE INDEX`:
```sql
CREATE INDEX index_name ON table_name (column_name)
@ -270,33 +270,33 @@ CREATE INDEX index_name ON table_name (column_name)
[к оглавлению](#sql)
##Что делает оператор `MERGE`?
## Что делает оператор `MERGE`?
`MERGE` позволяет осуществить слияние данных одной таблицы с данными другой таблицы. При слиянии таблиц проверяется условие, и если оно истинно, то выполняется `UPDATE`, а если нет - `INSERT`. При этом изменять поля таблицы в секции `UPDATE`, по которым идет связывание двух таблиц, нельзя.
[к оглавлению](#sql)
##В чем отличие между операторами `DELETE` и `TRUNCATE`?
## В чем отличие между операторами `DELETE` и `TRUNCATE`?
`DELETE` - оператор DML, удаляет записи из таблицы, которые удовлетворяют критерию `WHERE` при этом задействуются триггеры, ограничения и т.д.
`TRUNCATE` - DDL оператор (удаляет таблицу и создает ее заново. Причем если на эту таблицу есть ссылки `FOREGIN KEY` или таблица используется в репликации, то пересоздать такую таблицу не получится).
[к оглавлению](#sql)
##Что такое хранимая процедура»_?
## Что такое хранимая процедура»_?
__Хранимая процедура__ — объект базы данных, представляющий собой набор SQL-инструкций, который хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения.
Хранимые процедуры позволяют повысить производительность, расширяют возможности программирования и поддерживают функции безопасности данных. В большинстве СУБД при первом запуске хранимой процедуры она компилируется (выполняется синтаксический анализ и генерируется план доступа к данным) и в дальнейшем её обработка осуществляется быстрее.
[к оглавлению](#sql)
##Что такое _«триггер»_?
## Что такое _«триггер»_?
__Триггер (trigger)__ — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением, удалением или изменением данных в заданной таблице реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически и все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции.
Момент запуска триггера определяется с помощью ключевых слов `BEFORE` (триггер запускается до выполнения связанного с ним события) или `AFTER` (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись. Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова `BEFORE` и `AFTER` влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит.
[к оглавлению](#sql)
##Что такое _«курсор»_?
## Что такое _«курсор»_?
__Курсор__ — это объект базы данных, который позволяет приложениям работать с записями «по-одной», а не сразу с множеством, как это делается в обычных SQL командах.
Порядок работы с курсором такой:
@ -310,7 +310,7 @@ __Курсор__ — это объект базы данных, который
[к оглавлению](#sql)
##Опишите разницу типов данных `DATETIME` и `TIMESTAMP`.
## Опишите разницу типов данных `DATETIME` и `TIMESTAMP`.
`DATETIME` предназначен для хранения целого числа: `YYYYMMDDHHMMSS`. И это время не зависит от временной зоны настроенной на сервере.
Размер: 8 байт
@ -318,19 +318,19 @@ __Курсор__ — это объект базы данных, который
[к оглавлению](#sql)
##Для каких числовых типов недопустимо использовать операции сложения/вычитания?
## Для каких числовых типов недопустимо использовать операции сложения/вычитания?
В качестве операндов операций сложения и вычитания нельзя использовать числовой тип `BIT`.
[к оглавлению](#sql)
##Какое назначение у операторов `PIVOT` и `UNPIVOT` в Transact-SQL?
## Какое назначение у операторов `PIVOT` и `UNPIVOT` в Transact-SQL?
`PIVOT` и `UNPIVOT` являются нестандартными реляционными операторами, которые поддерживаются Transact-SQL.
Оператор `PIVOT` разворачивает возвращающее табличное значение выражение, преобразуя уникальные значения одного столбца выражения в несколько выходных столбцов, а также, в случае необходимости, объединяет оставшиеся повторяющиеся значения столбца и отображает их в выходных данных. Оператор `UNPIVOT` производит действия, обратные `PIVOT`, преобразуя столбцы возвращающего табличное значение выражения в значения столбца.
[к оглавлению](#sql)
##Расскажите об основных функциях ранжирования в Transact-SQL.
## Расскажите об основных функциях ранжирования в Transact-SQL.
Ранжирующие функции - это функции, которые возвращают значение для каждой записи группы в результирующем наборе данных. На практике они могут быть использованы, например, для простой нумерации списка, составления рейтинга или постраничной навигации.
`ROW_NUMBER` функция нумерации в Transact-SQL, которая возвращает просто номер записи.
@ -343,14 +343,14 @@ __Курсор__ — это объект базы данных, который
[к оглавлению](#sql)
##Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL?
## Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL?
Оператор `EXCEPT` возвращает уникальные записи из левого входного запроса, которые не выводятся правым входным запросом.
Оператор `INTERSECT` возвращает уникальные записи, выводимые левым и правым входными запросами.
[к оглавлению](#sql)
##Напишите запрос...
## Напишите запрос...
```sql
CREATE TABLE table (
id BIGINT(20) NOT NULL AUTO_INCREMENT,

20
test.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
##Тестирование
# Тестирование
+ [Что такое _«модульное тестирование»_?](#Что-такое-модульное-тестирование)
+ [Что такое _«интеграционное тестирование»_?](#Что-такое-интеграционное-тестирование)
+ [Чем интеграционное тестирование отличается от модульного?](#Чем-интеграционное-тестирование-отличается-от-модульного)
@ -10,7 +10,7 @@
+ [Какие аннотации фикстур существуют в JUnit?](#Какие-аннотации-фикстур-существуют-в-junit)
+ [Для чего в JUnit используется аннотация `@Ignore`?](#Для-чего-в-junit-используется-аннотация-ignore)
###Что такое _«модульное тестирование»_?
## Что такое _«модульное тестирование»_?
__Модульное/компонентное тестирование (unit testing)__ - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок.
Модульные тесты можно условно поделить на две группы:
@ -21,12 +21,12 @@ __Модульное/компонентное тестирование (unit tes
[к оглавлению](#Тестирование)
###Что такое _«интеграционное тестирование»_?
## Что такое _«интеграционное тестирование»_?
__Интеграционное тестирование (integration testing)__ — это тестирование, проверяющие работоспособность двух или более модулей системы в совокупности — то есть нескольких объектов как единого блока. В тестах взаимодействия же тестируется конкретный, определенный объект и то, как именно он взаимодействует с внешними зависимостями.
[к оглавлению](#Тестирование)
###Чем интеграционное тестирование отличается от модульного?
## Чем интеграционное тестирование отличается от модульного?
С технологической точки зрения интеграционное тестирование является количественным развитием модульного, поскольку так же, как и модульное тестирование, оперирует интерфейсами модулей и подсистем и требует создания тестового окружения, включая заглушки на месте отсутствующих модулей. Основная разница между модульным и интеграционным тестированием состоит в целях, то есть в типах обнаруживаемых дефектов, которые, в свою очередь, определяют стратегию выбора входных данных и методов анализа.
> Допустим, есть класс, который при определенных условиях взаимодействует с web-сервисом через зависимый объект. И нам надо проверить, что определенный метод зависимого объекта действительно вызывается. Если в качестве зависимого класса передать:
@ -39,7 +39,7 @@ __Интеграционное тестирование (integration testing)__
[к оглавлению](#Тестирование)
###Какие существуют виды тестовых объектов?
## Какие существуют виды тестовых объектов?
__пустышка (dummy)__ - объект, который обычно передается в тестируемый класс в качестве параметра, но не имеет поведения: с ним ничего не происходит и никакие его методы не вызываются.
> Примером dummy-объектов являются new object(), null, «Ignored String» и т.д.
@ -60,19 +60,19 @@ __фикция (mock object)__ похож на _шпиона_, но облада
[к оглавлению](#Тестирование)
###Чем _stub_ отличается от _mock_?
## Чем _stub_ отличается от _mock_?
_stub_ используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы.
_mock_ использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его.
[к оглавлению](#Тестирование)
###Что такое _«фикстуры»_?
## Что такое _«фикстуры»_?
__Фикстуры (fixtures)__ - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования.
[к оглавлению](#Тестирование)
###Какие аннотации фикстур существуют в JUnit?
## Какие аннотации фикстур существуют в JUnit?
+ `@BeforeClass` - определяет код, который должен единожды выполниться перед запуском набора тестовых методов.
+ `@AfterClass` - код, выполняемый один раз после исполнения набора тестовых методово.
@ -81,12 +81,12 @@ __Фикстуры (fixtures)__ - состояние среды тестиров
[к оглавлению](#Тестирование)
###Для чего в JUnit используется аннотация `@Ignore`?
## Для чего в JUnit используется аннотация `@Ignore`?
`@Ignore` указывает JUnit на необходимость пропустить данный тестовый метод.
[к оглавлению](#Тестирование)
##Источники
## Источники
+ [Википедия](https://ru.wikipedia.org/wiki/Тестирование_программного_обеспечения)
+ [Хабрахабр](https://habrahabr.ru/post/116372/)
+ [Интуит](http://www.intuit.ru/department/se/testing/5/2.html)

24
uml.md
View File

@ -1,19 +1,19 @@
[Вопросы для собеседования на Java Junior](README.md)
##UML
# UML
+ [Что такое _UML_?](#Что-такое-uml)
+ [Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?](#Что-такое-диаграмма-нотация-и-метамодель-в-uml)
+ [Какие существуют типы диаграмм?](#Какие-существуют-типы-диаграмм)
+ [Какие виды отношений существуют в структурной диаграмме классов?](#Какие-виды-отношений-существуют-в-структурной-диаграмме-классов)
###Что такое _UML_?
## Что такое _UML_?
__UML__ это унифицированный графический язык моделирования для описания, визуализации, проектирования и документирования объектно-ориентированных систем. UML призван поддерживать процесс моделирования на основе объектно-ориентированного подхода, организовывать взаимосвязь концептуальных и программных понятий, отражать проблемы масштабирования сложных систем.
Отличительной особенностью UML является то, что словарь этого языка образуют графические элементы. Каждому графическому символу соответствует конкретная семантика, поэтому модель, созданная одним человеком, может однозначно быть понята другим человеком или программным средством, интерпретирующим UML. Отсюда, в частности, следует, что модель системы, представленная на UML, может автоматически быть переведена на объектно-ориентированный язык программирования, то есть, при наличии хорошего инструментального средства визуального моделирования, поддерживающего UML, построив модель, мы получим и заготовку программного кода, соответствующего этой модели.
[к оглавлению](#uml)
###Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?
## Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?
__Диаграмма__ - графическое представление совокупности элементов модели в форме связного графа, вершинам и ребрам (дугам) которого приписывается определенная семантика
__Нотация__ совокупность символов и правила их применения, используются для представления понятий и связей между ними.
@ -24,8 +24,8 @@ __Метамодель__ диаграмма, определяющая нот
[к оглавлению](#uml)
###Какие существуют типы диаграмм?
####Структурные диаграммы:
## Какие существуют типы диаграмм?
## Структурные диаграммы:
__классов (Class diagram)__ описывает структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами.
__объектов (Object diagram)__ демонстрирует полный или частичный снимок моделируемой системы в заданный момент времени. На диаграмме объектов отображаются экземпляры классов (объекты) системы с указанием текущих значений их атрибутов и связей между объектами.
@ -42,7 +42,7 @@ __компонентов (Component diagram)__ показывает разбие
+ __кооперации (Collaboration diagram)__ показывает роли и взаимодействие классов в рамках кооперации.
####Диаграммы поведения:
## Диаграммы поведения:
__деятельности (Activity diagram)__ показывает разложение некоторой деятельности на её составные части. Под деятельностью понимается спецификация исполняемого поведения в виде координированного последовательного и параллельного выполнения подчинённых элементов — вложенных видов деятельности и отдельных действий, соединённых между собой потоками, которые идут от выходов одного узла к входам другого. Диаграммы деятельности используются при моделировании бизнес-процессов, технологических процессов, последовательных и параллельных вычислений.
__состояний/автомата/конечного автомата (State Machine diagram)__ представляет конечный автомат с простыми состояниями, переходами и композитными состояниями. Конечный автомат (State machine) — спецификация последовательности состояний, через которые проходит объект или взаимодействие в ответ на события своей жизни, а также ответные действия объекта на эти события. Конечный автомат прикреплён к исходному элементу (классу, кооперации или методу) и служит для определения поведения его экземпляров.
@ -61,8 +61,8 @@ __взаимодействия (Interaction diagram)__:
[к оглавлению](#uml)
###Какие виды отношений существуют в структурной диаграмме классов?
####Взаимосвязи классов
## Какие виды отношений существуют в структурной диаграмме классов?
## Взаимосвязи классов
__Обобщение (Generalization)__ показывает, что один из двух связанных классов (подтип) является частной формой другого (супертипа), который называется обобщением первого. На практике это означает, что любой экземпляр подтипа является также экземпляром супертипа. Обобщение также известно как аследование_, _«is a» взаимосвязь_ или _отношение «является»_.
> «Табурет» является подтипом «Мебели».
@ -71,7 +71,7 @@ __Реализация (Implementation)__ — отношение между дв
> «Кровать» реализует поведение «Мебели для сна»
####Взаимосвязи объектов классов
## Взаимосвязи объектов классов
__Зависимость (Dependency)__ обозначает такое отношение между классами, что изменение спецификации класса-поставщика может повлиять на работу зависимого класса, но не наоборот.
> «Расписание занятий» имеет зависимость от «Списка предметов». При изменении списка предметов расписание занятий будет вынуждено изменится. Однако изменение расписания занятий никак не влияет на список предметов.
@ -88,7 +88,7 @@ __Композиция (Composition)__ — более строгий вариа
> «Факультет» является частью «Университета» и факультет без университета существовать не может, следовательно здесь подходит композиция.
####Общие взаимосвязи
## #Общие взаимосвязи
__Зависимость__ — это слабая форма отношения использования, при котором изменение в спецификации одного влечёт за собой изменение другого, причём обратное не обязательно. Возникает, когда объект выступает, например, в форме параметра или локальной переменной. Существует несколько именованных вариантов. Зависимость может быть между экземплярами, классами или экземпляром и классом.
__Уточнение отношений__ имеет отношение к уровню детализации. Один пакет уточняет другой, если в нём содержатся те же самые элементы, но в более подробном представлении.
@ -104,6 +104,6 @@ __Мощность/кратность/мультипликатор отноше
[к оглавлению](#uml)
##Источники
## Источники
+ [Википедия](https://ru.wikipedia.org/wiki/UML)
+ [Информикус](http://www.informicus.ru/)
+ [Информикус](http://www.informicus.ru/)

46
web.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#Основы Web
# Основы Web
+ [Что такое _WWW_?](#Что-такое-www)
+ [Что такое _W3C_?](#Что-такое-w3c)
+ [Какие существуют уровни модели _OSI_?](#Какие-существуют-уровни-модели-osi)
@ -24,19 +24,19 @@
+ [Что такое _«сессия»_?](#Что-такое-сессия)
+ [Что такое _«авторизация»_ и _«аутентификация»_? Чем они отличаются?](#Что-такое-авторизация-и-аутентификация-Чем-они-отличаются)
##Что такое _WWW_?
## Что такое _WWW_?
__WWW, World Wide Web (Всемирная паутина)__ — распределённая система, предоставляющая доступ к связанным между собой документам, расположенным на различных компьютерах, подключённых к Интернету. Для обозначения этого термина также используют слово _web_.
[к оглавлению](#Основы-web)
##Что такое _W3C_?
## Что такое _W3C_?
__W3C, World Wide Web Consortium (Консорциум Всемирной паутины)__ — организация, разрабатывающая и внедряющая технологические стандарты для WWW.
W3C разрабатывает для Интернета единые принципы и стандарты, называемые рекомендациями» (W3C Recommendations)_, которые затем внедряются производителями программ и оборудования. Таким образом достигается совместимость между программными продуктами и аппаратурой различных компаний.
[к оглавлению](#Основы-web)
##Какие существуют уровни модели _OSI_?
## Какие существуют уровни модели _OSI_?
| # | Уровень (layer) | Тип данных (PDU) | Функции | Примеры |
|--:|--------------------------------------------------|:-----------------------------------------:|----------------------------------------------------------|:--------------------------:|
| 7 | Прикладной (application) | - | Доступ к сетевым службам | HTTP, FTP |
@ -49,7 +49,7 @@ W3C разрабатывает для Интернета единые принц
[к оглавлению](#Основы-web)
##Что такое _TCP/IP_?
## Что такое _TCP/IP_?
__TCP/IP__ - это два основных сетевых протокола Internet. Часто это название используют и для обозначения сетей, работающих на их основе.
__IP (Internet Protocol)__ - маршрутизируемый протокол, отвечающий за IP-адресацию, маршрутизацию, фрагментацию и восстановление пакетов. В его задачу входит продвижение пакета между сетями от одного маршрутизатора до другого и тех пор, пока пакет не попадет в сеть назначения. В отличие от протоколов прикладного и транспортного уровней, протокол IP разворачивается не только на хостах, но и на всех шлюзах (маршрутизаторах). Этот протокол работает без установления соединения и без гарантированной доставки.
@ -84,7 +84,7 @@ TCP-соединение двух узлов начинается с _handshake
[к оглавлению](#Основы-web)
##Что такое _UDP_?
## Что такое _UDP_?
__UDP, User Datagram Protocol (Протокол пользовательских датаграмм)__ — протокол, который обеспечивает доставку без требований соединения с удаленным модулем UDP и обязательного подтверждения получения.
К заголовку IP-пакета UDP добавляет всего четыре поля по 2 байта каждое:
@ -100,7 +100,7 @@ UDP используется _DNS_, _SNMP_, _DHCP_ и другими прило
[к оглавлению](#Основы-web)
##Чем отличаются _TCP_ и _UDP_?
## Чем отличаются _TCP_ и _UDP_?
__TCP__ — ориентированный на соединение протокол, что означает необходимость «рукопожатия» для установки соединения между двумя хостами. Как только соединение установлено, пользователи могут отправлять данные в обоих направлениях.
+ _Надёжность_ — TCP управляет подтверждением, повторной передачей и тайм-аутом сообщений. Производятся многочисленные попытки доставить сообщение. Если оно потеряется на пути, сервер вновь запросит потерянную часть. В TCP нет ни пропавших данных, ни (в случае многочисленных тайм-аутов) разорванных соединений.
@ -118,7 +118,7 @@ __UDP__ — более простой, основанный на сообщен
[к оглавлению](#Основы-web)
##Что такое протокол передачи данных? Какие протоколы вы знаете?
## Что такое протокол передачи данных? Какие протоколы вы знаете?
__Протокол передачи данных__ — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами. Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок при взаимодействии программного обеспечения разнесённой в пространстве аппаратуры, соединённой тем или иным интерфейсом.
Наиболее известные протоколы передачи данных:
@ -131,7 +131,7 @@ __Протокол передачи данных__ — набор соглаше
[к оглавлению](#Основы-web)
##Что такое _HTTP_ и _HTTPS_? Чем они отличаются?
## Что такое _HTTP_ и _HTTPS_? Чем они отличаются?
__HTTP, HyperText Transfer Protocol (Протокол передачи гипертекста)__ — протокол прикладного уровня передачи данных.
Основой HTTP является технология «клиент-сервер»:
@ -165,26 +165,26 @@ __Различия _HTTP_ и _HTTPS___:
[к оглавлению](#Основы-web)
##Что такое _FTP_?
## Что такое _FTP_?
__FTP, File Transfer Protocol (Протокол передачи файлов)__ — протокол передачи файлов между компьютерами в сети TCP. С его помощью можно подключаться к FTP-серверам, просматривать содержимое их каталогов и загружать файлы с сервера или на сервер. Протокол построен на архитектуре «клиент-сервер» и использует разные сетевые соединения для передачи команд и данных между клиентом и сервером.
По умолчанию использует TCP-порт `21`.
[к оглавлению](#Основы-web)
##Чем отличаются методы _GET_ и _POST_?
## Чем отличаются методы _GET_ и _POST_?
__GET__ передает данные серверу используя URL, тогда как __POST__ передает данные, используя тело HTTP запроса. Длина URL ограничена 1024 символами, это и будет верхним ограничением для данных, которые можно отослать через GET. POST может отправлять гораздо большие объемы данных. Лимит устанавливается web-server и составляет обычно около 2 Mb.
Передача данных методом POST более безопасна, чем методом GET, так как секретные данные (например пароль) не отображаются напрямую в web-клиенте пользователя, в отличии от URL, который виден почти всегда. Иногда это преимущество превращается в недостатком - вы не сможете послать данные за кого-то другого.
[к оглавлению](#Основы-web)
##Что такое _MIME тип_?
## Что такое _MIME тип_?
__MIME, Multipurpose Internet Mail Extension (Многоцелевые расширения Интернет-почты)__ — спецификация для передачи по сети файлов различного типа: изображений, музыки, текстов, видео, архивов и др. В HTML указание MIME-типа используется при передаче данных форм и вставки на страницу различных объектов.
[к оглавлению](#Основы-web)
##Что такое _Web server_?
## Что такое _Web server_?
__Web server (Веб-сервер)__ — сервер, принимающий HTTP-запросы от клиентов и выдающий им HTTP-ответы. Так называют как программное обеспечение, выполняющее функции web-сервера, так и непосредственно компьютер, на котором это программное обеспечение работает.
Web-серверы могут иметь различные дополнительные функции, например:
@ -203,12 +203,12 @@ Web-серверы могут иметь различные дополнител
[к оглавлению](#Основы-web)
##Что такое _Web application_?
## Что такое _Web application_?
__Web application (Веб-приложение)__ - клиент-серверное приложение, в котором клиентом выступает браузер, а сервером — web-сервер. Логика web application распределена между сервером и клиентом, хранение данных осуществляется, преимущественно, на сервере, а обмен информацией происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому web application является кроссплатформенным сервисом.
[к оглавлению](#Основы-web)
##Что такое _Application server_?
## Что такое _Application server_?
__Application Server (Сервер приложений)__ — программа, представляющая собой сервер, который занимается системной поддержкой приложений и обеспечивает их жизненный цикл в соответствии с правилами, определёнными в спецификациях. Может работать как полноценный самостоятельный web-сервер или быть поставщиком страниц для другого web-сервера. Обеспечивает обмен данными между приложениями и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего приложения, идентификацию и авторизацию клиентов, организацию сессии для каждого из них.
Наиболее известные серверы приложений Java:
@ -222,7 +222,7 @@ __Application Server (Сервер приложений)__ — программ
[к оглавлению](#Основы-web)
##Чем отличаются _Web server_ и _Application server_?
## Чем отличаются _Web server_ и _Application server_?
Понятие web server относится скорее к способу передачи данных (конкретно, по протоколу HTTP), в то время как понятие Application server относится к способу выполнения этих самых приложений (конкретно, удаленная обработка запросов клиентов при помощи каких-то программ, размещенных на сервере). Эти понятия нельзя ставить в один ряд. Они обозначают разные признаки программы. Какие-то программы удовлетворяют только одному признаку, какие-то - нескольким сразу.
Apache Tomcat умеет выполнять приложения? Да, значит он является application server. Apache Tomcat умеет отдавать данные по HTTP? - Да. Следовательно он является web server.
@ -233,7 +233,7 @@ Apache Tomcat умеет выполнять приложения? Да, знач
[к оглавлению](#Основы-web)
##Что такое _AJAX_? Как принципиально устроена эта технология?
## Что такое _AJAX_? Как принципиально устроена эта технология?
__AJAX, Asynchronous Javascript and XML (Асинхронный Javascript и XML)__ — подход к построению интерактивных пользовательских интерфейсов web-приложений, заключающийся в «фоновом» обмене данными браузера и web-сервера. В результате, при обновлении данных web-страница не перезагружается полностью и web-приложения становятся быстрее и удобнее.
При использовании AJAX:
@ -261,7 +261,7 @@ AJAX не является самостоятельной технологией
[к оглавлению](#Основы-web)
##Что такое _WebSocket_?
## Что такое _WebSocket_?
__WebSocket__ — протокол полнодуплексной связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и web-сервером в режиме реального времени.
Протокол _WebSocket_ определяет две URI схемы
@ -271,7 +271,7 @@ __WebSocket__ — протокол полнодуплексной связи п
[к оглавлению](#Основы-web)
##Что такое _JSON_?
## Что такое _JSON_?
__JSON, JavaScript Object Notation__ — текстовый формат обмена данными, основанный на JavaScript.
JSON представляет собой (в закодированном виде) одну из двух структур:
@ -291,14 +291,14 @@ JSON представляет собой (в закодированном вид
[к оглавлению](#Основы-web)
##Что такое _JSON схема_?
## Что такое _JSON схема_?
__JSON Schema__ — один из языков описания структуры JSON-документа, используя синтаксис JSON.
Это самоописательный язык: при его использовании для обработки данных и описания их допустимости могут использоваться одни и те же инструменты сериализации/десериализации.
[к оглавлению](#Основы-web)
##Что такое _cookies_?
## Что такое _cookies_?
__Сookies («куки»)__ — небольшой фрагмент данных, отправленный web-сервером и хранимый на устройстве пользователя. Всякий раз при попытке открыть страницу сайта, web-клиент пересылает соответствующие этому сайту cookies web-серверу в составе HTTP-запроса. Применяется для сохранения данных на стороне пользователя и на практике обычно используется для:
+ аутентификации пользователя;
@ -308,12 +308,12 @@ __Сookies («куки»)__ — небольшой фрагмент данных
[к оглавлению](#Основы-web)
##Что такое сессия»_?
## Что такое сессия»_?
__Сессия__ промежуток времени между первым и последним запросами, которые пользователь отправляет со своего устройства на сервер сайта. Завершается сессия в случае, если со стороны пользователя не поступало запросов в течение определенного промежутка времени или же при обрыве связи.
[к оглавлению](#Основы-web)
##Что такое авторизация»_ и аутентификация»_? Чем они отличаются?
## Что такое авторизация»_ и аутентификация»_? Чем они отличаются?
__Аутентификация__ - это проверка соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации (отпечатки пальцев, цвет радужки, голос и тд.), в простейшем случае - с помощью имени входа и пароля.
__Авторизация__ - это проверка и определение полномочий на выполнение некоторых действий (например, чтение файла) в соответствии с ранее выполненной аутентификацией.

24
xml.md
View File

@ -1,6 +1,6 @@
[Вопросы для собеседования на Java Junior](README.md)
#XML
# XML
+ [Что такое _XML_?](#Что-такое-xml)
+ [Что такое _DTD_?](#Что-такое-dtd)
+ [Чем _well-formed XML_ отличается от _valid XML_?](#Чем-well-formed-xml-отличается-от-valid-xml)
@ -13,14 +13,14 @@
+ [Что такое _JAXP_?](#Что-такое-jaxp)
+ [Что такое _XSLT_?](#Что-такое-xslt)
##Что такое _XML_?
## Что такое _XML_?
__XML, eXtensible Markup Language (расширяемый язык разметки)__ - язык с простым формальным синтаксисом, хорошо приспособленный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком.
XML расширяем, он не фиксирует разметку, используемую в документах и разработчик волен создавать разметку в соответствии с потребностями конкретной области, будучи ограниченным лишь синтаксическими правилами языка.
[к оглавлению](#xml)
##Что такое _DTD_?
## Что такое _DTD_?
__DTD, Document Type Definition (определение типа документа)__ — это заранее определённый свод правил, задающий связи между элементами и атрибутами.
> Например, DTD для HTML гласит, что тэг `DIV` должен быть внутри тэга `BODY` и может встречаться многократно, `TITLE` — в `HEAD` и всего один раз, а `SCRIPT` и там, и там сколь угодно раз.
@ -29,7 +29,7 @@ DTD обычно описывается непосредственно в док
[к оглавлению](#xml)
##Чем _well-formed XML_ отличается от _valid XML_?
## Чем _well-formed XML_ отличается от _valid XML_?
В зависимости от уровня соответствия стандартам документ может быть «well-formed» («правильно построенный»), либо «valid» («действительный»).
Основные признаки _well-formed XML_ следуют из формального описания стандарта:
@ -49,7 +49,7 @@ __*well-formed XML* - корректен синтаксически (может
[к оглавлению](#xml)
##Что такое «_пространство имен_» в XML?
## Что такое «_пространство имен_» в XML?
__Пространство имён XML (XML namespace)__ - это идентифицируемая с помощью ссылки URI коллекция имен, используемых в XML документах для обозначения типов элементов и именования атрибутов. Пространство имен XML отличается от тех «пространств имен», которые обычно используются в компьютерных дисциплинах, тем, что в варианте для XML оно имеет внутреннюю структуру, и, с математической точки зрения, набором не является.
> Пространства имён объявляются с помощью XML атрибута `xmlns`, значением которого должен быть _URI_ и префикса, однозначно идентифицирующего пространство имён каждого элемента.
@ -62,7 +62,7 @@ XML-документ может содержать имена элементов
[к оглавлению](#xml)
##Что такое XSD? В чём его преимущества перед XML DTD?
## Что такое XSD? В чём его преимущества перед XML DTD?
__XSD, XML Schema Definition, XML Schema (XML схема)__ — язык описания структуры XML-документа. В частности, XML Schema описывает:
+ _словарь_ - имена элементов и атрибутов;
@ -82,7 +82,7 @@ __Преимущества XSD перед DTD__ заключаются в сле
[к оглавлению](#xml)
##Какие типы существуют в XSD?
## Какие типы существуют в XSD?
__Простой тип__ - это определение типа для значения, которое может использоваться в качестве содержимого элемента или атрибута. Этот тип данных не может содержать элементы или иметь атрибуты.
```xsd
@ -104,7 +104,7 @@ __Сложный тип__ - это определение типа для эле
```
[к оглавлению](#xml)
##Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.
## Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.
__DOM (Document Object Model)__ - _объектный_ - считывает XML, воссоздавая его в памяти в виде объектной структуры при этом XML документ представляется в виде набора тегов узлов. Каждый узел может иметь неограниченное количество дочерних узлов. Каждый дочерний тоже может содержать несколько уровней потомков или не содержать их вовсе. Таким образом в итоге получается некое дерево.
> Низкая скорость работы.
@ -143,7 +143,7 @@ __StAX (Stream API for XML)__ _потоковый_ - состоящий из д
[к оглавлению](#xml)
##Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы?
## Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы?
DOM - естественный выбор, когда объектом предметной области является сам XML: когда нужно знать и иметь возможность изменять структуру документа, а также в случае многократного использования информации из документа.
@ -151,7 +151,7 @@ DOM - естественный выбор, когда объектом пред
[к оглавлению](#xml)
##Какие вы знаете способы записи XML?
## Какие вы знаете способы записи XML?
__Прямая запись__ - пишет XML тег за тегом, атрибут за атрибутом.
@ -171,12 +171,12 @@ __Запись DOM (Document Object Model)__ - создаёт полную ст
[к оглавлению](#xml)
##Что такое _JAXP_?
## Что такое _JAXP_?
__JAXP, The Java API for XML Processing (Java API для обработки XML)__ — набор API, упрощающих обработку XML данных в программах написанных на Java. Содержит реализации DOM, SAX и StAX парсеров, поддерживает XSLT и возможность работать с DTD.
[к оглавлению](#xml)
##Что такое _XSLT_?
## Что такое _XSLT_?
__XSLT, eXtensible Stylesheet Language Transformations__ — язык преобразования XML-документов.
XSLT создавался для применения в _XSL (eXtensible Stylesheet Language)_ - языке стилей для XML. Во время XSL-преобразования XSLT-процессор считывает XML-документ и таблицу(ы) стилей XSLT. На основе инструкций, которые процессор находит в таблице(ах) стилей XSLT, он вырабатывает новый XML-документ или его фрагмент.