├── .gitignore ├── README.md ├── con4md.jar ├── concurrency.md ├── core.md ├── css.md ├── db.md ├── done.png ├── examples ├── LICENSE ├── README.md ├── pom.xml └── src │ └── main │ ├── java │ └── xyz │ │ └── enhorse │ │ └── example │ │ ├── Application.java │ │ ├── concurrency │ │ ├── VolatileBehaviour.java │ │ └── WaitNotify.java │ │ └── oop │ │ └── PolymorphicTicTock.java │ └── resources │ ├── google_checkstyle.xml │ └── log4j.properties ├── html.md ├── io.md ├── java8.md ├── jcf.md ├── jdbc.md ├── log.md ├── mcon.bat ├── mcon.sh ├── oop.md ├── patterns.md ├── serialization.md ├── servlets.md ├── sql.md ├── test.md ├── uml.md ├── web.md └── xml.md /.gitignore: -------------------------------------------------------------------------------- 1 | # IntelliJ 2 | *.iml 3 | out/ 4 | .idea/ 5 | 6 | # System specific 7 | .DS_Store 8 | 9 | # Maven 10 | target/ -------------------------------------------------------------------------------- /con4md.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johnivo/java-interview/c6abf732b3fe5b4c16bf6f1ebe91f8d8cde56895/con4md.jar -------------------------------------------------------------------------------- /css.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Основы CSS 4 | + [Что такое _«CSS»_?](#Что-такое-css) 5 | + [Как в CSS обозначаются комментарии?](#Как-в-css-обозначаются-комментарии) 6 | + [Что такое _«селектор»_?](#Что-такое-селектор) 7 | + [Перечислите основные виды селекторов.](#Перечислите-основные-виды-селекторов) 8 | + [Что такое псевдокласс?](#Что-такое-псевдокласс) 9 | + [Какие существуют селекторы аттрибутов?](#Какие-существуют-селекторы-аттрибутов) 10 | + [В чем разница между `#my` и `.my`?](#В-чем-разница-между-my-и-my) 11 | + [В чем разница между `margin` и `padding`?](#В-чем-разница-между-margin-и-padding) 12 | + [В чем заключается разница между значениями `0` и `auto` в свойстве `margin`?](#В-чем-заключается-разница-между-значениями-0-и-auto-в-свойстве-margin) 13 | + [Какое свойство задает цвет фона?](#Какое-свойство-задает-цвет-фона) 14 | + [Как убрать подчеркивание для всех ссылок на странице?](#Как-убрать-подчеркивание-для-всех-ссылок-на-странице) 15 | + [Для чего используется свойство `clear`?](#Для-чего-используется-свойство-clear) 16 | + [Как сделать жирным текст во всех элементах `

`?](#Как-сделать-жирным-текст-во-всех-элементах-p) 17 | + [Как задать красный цвет для всех элементов, имеющих класс `red`?](#Как-задать-красный-цвет-для-всех-элементов-имеющих-класс-red) 18 | 19 | ## Что такое _«CSS»_? 20 | __CSS, Cascading Style Sheets (каскадные таблицы стилей)__ - формальный язык описания внешнего вида документа, написанного с использованием языка разметки, который применяется к элементам web-страницы для управления их видом и положением. 21 | 22 | Основной целью разработки CSS являлось разделение описания логической структуры web-страницы, которое производится с помощью HTML или других языков разметки от описания внешнего вида этой web-страницы, которое производится с помощью CSS. 23 | 24 | [к оглавлению](#Основы-css) 25 | 26 | ## Как в CSS обозначаются комментарии? 27 | Чтобы пометить, что текст является комментарием, применяют конструкцию `/* ... */` 28 | 29 | [к оглавлению](#Основы-css) 30 | 31 | ## Что такое _«селектор»_? 32 | __Селектор__ – это правило, на основании которого осуществляется выбор элементов в HTML документе для того, чтобы применить к ним определённые стили. 33 | 34 | ```css 35 | p { 36 | text-align: center; 37 | font-size: 20px; 38 | } 39 | /* p – это селектор, text-align и font-size – это свойства, а center и 20px – значения. */ 40 | ``` 41 | 42 | [к оглавлению](#Основы-css) 43 | 44 | ## Перечислите основные виды селекторов. 45 | 46 | + __селектор `*`__ - выбор всех элементов; 47 | + __селектор элемента__ - выбор всех элементов в HTML документе, имеющих указанный тег (например: `div`); 48 | + __селектор класса__ - выбор всех элементов в HTML документе, имеющих указанный класс (например: `.center`); 49 | + __селектор идентификатора__ - выбор элемента в HTML документе, имеющего указанный идентификатор (например: `#footer`); 50 | + __селекторы псевдоклассов__ - выбор всех элементов в HTML документе, имеющих указанный псевдокласс (например: `p:first-of-type`); 51 | + __селекторы атрибутов__ - выбор элементов в зависимости от указанного атрибута элемента или его значения (например: `[href*="youtube"]`). 52 | 53 | [к оглавлению](#Основы-css) 54 | 55 | ## Что такое псевдокласс? 56 | Псевдокласс определяет динамическое состояние элементов, которое изменяется из-за действий пользователя, или же соответствует текущему положению в дереве документа. В отличие от настоящего класса, в явном виде псеводкласс в HTML не указывается, а в CSS указывается через `:` непосредственно после селектора. 57 | 58 | Наиболее известные псевдоклассы: 59 | 60 | + `:link` применяется к непосещенным ссылкам; 61 | + `:visited` применяется к посещенным ссылкам; 62 | + `:hover` применяется, когда курсор мыши находится в пределах элемента, но не активирует его; 63 | + `:active` применяется при активации элемента; 64 | + `:focus` применяется к элементу при получении им фокуса; 65 | + `:first-child` применяется к первому дочернему элементу селектора, который расположен в дереве элементов документа. 66 | 67 | ```css 68 | a.snowman:link { 69 | color: blue; 70 | } 71 | a.snowman:visited { 72 | color: purple; 73 | } 74 | a.snowman:active { 75 | color: red; 76 | } 77 | a.snowman:hover { 78 | text-decoration: none; 79 | color: blue; 80 | background-color: yellow; 81 | } 82 | ``` 83 | 84 | [к оглавлению](#Основы-css) 85 | 86 | ## Какие существуют селекторы аттрибутов? 87 | + __`[атрибут]`__ - все элементы, имеющие указанный `атрибут`; 88 | + __`[атрибут=значение]`__ - все элементы, имеющие `атрибут`, значение которого равно `"значение"`; 89 | + __`[атрибут^=занчение]`__ - все элементы, имеющие `атрибут`, значение которого начинается с `значение`; 90 | + __`[атрибут|=значение]`__ - все элементы, имеющие `атрибут`, значение которого равно `значение` или начинается с `значение` следующим образом `значение-*` (`значение` с обязательным дефисом, после которого идёт остальное содержимое значения); 91 | + __`[атрибут$=значение]`__ - все элементы, имеющие `атрибут`, значение которого заканчивается на `значение`; 92 | + __`[атрибут*=значение]`__ - все элементы, имеющие `атрибут`, значение которого содержит подстроку `значение`; 93 | + __`[атрибут~=значение]`__ - все элементы, имеющие `атрибут`, значение которого содержит `значение` как одно из значений через пробел. 94 | 95 | [к оглавлению](#Основы-css) 96 | 97 | ## В чем разница между `#my` и `.my`? 98 | `#my` — селектор идентификатора, а `.my` — селектор класса. 99 | 100 | [к оглавлению](#Основы-css) 101 | 102 | ## В чем разница между `margin` и `padding`? 103 | `margin` — внешний отступ, а `padding` — внутренний отступ. 104 | 105 | [к оглавлению](#Основы-css) 106 | 107 | ## В чем заключается разница между значениями `0` и `auto` в свойстве `margin`? 108 | В вертикальных полях — `auto` всегда означает `0`. В горизонтальных полях — `auto` означает `0` только тогда, когда свойство `width` также `auto`. 109 | 110 | [к оглавлению](#Основы-css) 111 | 112 | ## Какое свойство задает цвет фона? 113 | Цвет фона задает свойство `background-color`. 114 | 115 | [к оглавлению](#Основы-css) 116 | 117 | ## Как убрать подчеркивание для всех ссылок на странице? 118 | ```css 119 | a { 120 | text-decoration: none; 121 | } 122 | ``` 123 | 124 | [к оглавлению](#Основы-css) 125 | 126 | ## Для чего используется свойство `clear`? 127 | `clear` устанавливает, с какой стороны элемента запрещено его обтекание другими элементами. 128 | 129 | [к оглавлению](#Основы-css) 130 | 131 | ## Как сделать жирным текст во всех элементах `

`? 132 | ```css 133 | p { 134 | font-weight: bold; 135 | } 136 | ``` 137 | 138 | [к оглавлению](#Основы-css) 139 | 140 | ## Как задать красный цвет для всех элементов, имеющих класс `red`? 141 | ```css 142 | .red { 143 | color: red; 144 | } 145 | ``` 146 | 147 | [к оглавлению](#Основы-css) 148 | 149 | # Источники 150 | + [myway-blog.ru](http://myway-blog.ru/interview-frontend-web-programmer/) 151 | + [htmlbook.ru](http://stepbystep.htmlbook.ru/?id=43) 152 | + [itchief.ru](https://itchief.ru/lessons/html-and-css/css-selectors) 153 | 154 | [Вопросы для собеседования](README.md) 155 | -------------------------------------------------------------------------------- /db.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Базы данных 4 | + [Что такое _«база данных»_?](#Что-такое-база-данных) 5 | + [Что такое _«система управления базами данных»_?](#Что-такое-система-управления-базами-данных) 6 | + [Что такое _«реляционная модель данных»_?](#Что-такое-реляционная-модель-данных) 7 | + [Дайте определение терминам _«простой»_, _«составной» (composite)_, _«потенциальный» (candidate)_ и _«альтернативный» (alternate)_ ключ.](#Дайте-определение-терминам-простой-составной-composite-потенциальный-candidate-и-альтернативный-alternate-ключ) 8 | + [Что такое _«первичный ключ» (primary key)_? Каковы критерии его выбора?](#Что-такое-первичный-ключ-primary-key-Каковы-критерии-его-выбора) 9 | + [Что такое _«внешний ключ» (foreign key)_?](#Что-такое-внешний-ключ-foreign-key) 10 | + [Что такое _«нормализация»_?](#Что-такое-нормализация) 11 | + [Какие существуют нормальные формы?](#Какие-существуют-нормальные-формы) 12 | + [Что такое _«денормализация»_? Для чего она применяется?](#Что-такое-денормализация-Для-чего-она-применяется) 13 | + [Какие существуют типы связей в базе данных? Приведите примеры.](#Какие-существуют-типы-связей-в-базе-данных-Приведите-примеры) 14 | + [Что такое _«индексы»_? Для чего их используют? В чём заключаются их преимущества и недостатки?](#Что-такое-индексы-Для-чего-их-используют-В-чём-заключаются-их-преимущества-и-недостатки) 15 | + [Какие типы индексов существуют?](#Какие-типы-индексов-существуют) 16 | + [В чем отличие между кластерными и некластерными индексами?](#В-чем-отличие-между-кластерными-и-некластерными-индексами) 17 | + [Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений?](#Имеет-ли-смысл-индексировать-данные-имеющие-небольшое-количество-возможных-значений) 18 | + [Когда полное сканирование набора данных выгоднее доступа по индексу?](#Когда-полное-сканирование-набора-данных-выгоднее-доступа-по-индексу) 19 | + [Что такое _«транзакция»_?](#Что-такое-транзакция) 20 | + [Назовите основные свойства транзакции.](#Назовите-основные-свойства-транзакции) 21 | + [Какие существуют уровни изолированности транзакций?](#Какие-существуют-уровни-изолированности-транзакций) 22 | + [Какие проблемы могут возникать при параллельном доступе с использованием транзакций?](#Какие-проблемы-могут-возникать-при-параллельном-доступе-с-использованием-транзакций) 23 | 24 | ## Что такое _«база данных»_? 25 | __База данных__ — организованный и адаптированный для обработки вычислительной системой набор информации. 26 | 27 | [к оглавлению](#Базы-данных) 28 | 29 | ## Что такое _«система управления базами данных»_? 30 | __Система управления базами данных (СУБД)__ - набор средств общего или специального назначения, обеспечивающий создание, доступ к материалам и управление базой данных. 31 | 32 | Основные функции СУБД: 33 | 34 | + управление данными 35 | + журнализация изменений данных 36 | + резервное копирование и восстановление данных; 37 | + поддержка языка определения данных и манипулирования ими. 38 | 39 | [к оглавлению](#Базы-данных) 40 | 41 | ## Что такое _«реляционная модель данных»_? 42 | __Реляционная модель данных__ — это логическая модель данных и прикладная теория построения реляционных баз данных. 43 | 44 | Реляционная модель данных включает в себя следующие компоненты: 45 | 46 | + _Структурный аспект_ — данные представляют собой набор отношений. 47 | + _Аспект целостности_ — отношения отвечают определенным условиям целостности: уровня домена (типа данных), уровня отношения и уровня базы данных. 48 | + _Аспект обработки (манипулирования)_ — поддержка операторов манипулирования отношениями (реляционная алгебра, реляционное исчисление). 49 | + _Нормальная форма_ - свойство отношения в реляционной модели данных, характеризующее его с точки зрения избыточности и определённое как совокупность требований, которым должно удовлетворять отношение. 50 | 51 | [к оглавлению](#Базы-данных) 52 | 53 | ## Дайте определение терминам _«простой»_, _«составной» (composite)_, _«потенциальный» (candidate)_ и _«альтернативный» (alternate)_ ключ. 54 | __Простой ключ__ состоит из одного атрибута (поля). __Составной__ - из двух и более. 55 | 56 | __Потенциальный ключ__ - простой или составной ключ, который уникально идентифицирует каждую запись набора данных. При этом потенциальный ключ должен обладать критерием неизбыточности: при удалении любого из полей набор полей перестает уникально идентифицировать запись. 57 | 58 | Из множества всех потенциальных ключей набора данных выбирают первичный ключ, все остальные ключи называют __альтернативными__. 59 | 60 | [к оглавлению](#Базы-данных) 61 | 62 | ## Что такое _«первичный ключ» (primary key)_? Каковы критерии его выбора? 63 | __Первичный ключ (primary key)__ в реляционной модели данных один из _потенциальных ключей_ отношения, выбранный в качестве основного ключа (ключа по умолчанию). 64 | 65 | Если в отношении имеется единственный потенциальный ключ, он является и первичным ключом. Если потенциальных ключей несколько, один из них выбирается в качестве первичного, а другие называют _«альтернативными»_. 66 | 67 | В качестве первичного обычно выбирается тот из потенциальных ключей, который наиболее удобен. Поэтому в качестве первичного ключа, как правило, выбирают тот, который имеет наименьший размер (физического хранения) и/или включает наименьшее количество атрибутов. Другой критерий выбора первичного ключа — сохранение его уникальности со временем. Поэтому в качестве первичного ключа стараются выбирать такой потенциальный ключ, который с наибольшей вероятностью никогда не утратит уникальность. 68 | 69 | [к оглавлению](#Базы-данных) 70 | 71 | ## Что такое _«внешний ключ» (foreign key)_? 72 | __Внешний ключ (foreign key)__ — подмножество атрибутов некоторого отношения A, значения которых должны совпадать со значениями некоторого потенциального ключа некоторого отношения B. 73 | 74 | [к оглавлению](#Базы-данных) 75 | 76 | ## Что такое _«нормализация»_? 77 | _Нормализация_ - это процесс преобразования отношений базы данных к виду, отвечающему нормальным формам (пошаговый, обратимый процесс замены исходной схемы другой схемой, в которой наборы данных имеют более простую и логичную структуру). 78 | 79 | Нормализация предназначена для приведения структуры базы данных к виду, обеспечивающему минимальную логическую избыточность, и не имеет целью уменьшение или увеличение производительности работы или же уменьшение или увеличение физического объёма базы данных. Конечной целью нормализации является уменьшение потенциальной противоречивости хранимой в базе данных информации. 80 | 81 | [к оглавлению](#Базы-данных) 82 | 83 | ## Какие существуют нормальные формы? 84 | __Первая нормальная форма (1NF)__ - Отношение находится в 1NF, если значения всех его атрибутов атомарны (неделимы). 85 | 86 | __Вторая нормальная форма (2NF)__ - Отношение находится в 2NF, если оно находится в 1NF, и при этом все неключевые атрибуты зависят только от ключа целиком, а не от какой-то его части. 87 | 88 | __Третья нормальная форма (3NF)__ - Отношение находится в 3NF, если оно находится в 2NF и все неключевые атрибуты не зависят друг от друга. 89 | 90 | __Четвёртая нормальная форма (4NF)__ - Отношение находится в 4NF , если оно находится в 3NF и если в нем не содержатся независимые группы атрибутов, между которыми существует отношение «многие-ко-многим». 91 | 92 | __Пятая нормальная форма (5NF)__ - Отношение находится в 5NF, когда каждая нетривиальная зависимость соединения в ней определяется потенциальным ключом (ключами) этого отношения. 93 | 94 | __Шестая нормальная форма (6NF)__ - Отношение находится в 6NF, когда она удовлетворяет всем нетривиальным зависимостям соединения, т.е. когда она неприводима, то есть не может быть подвергнута дальнейшей декомпозиции без потерь. Каждая переменная отношения, которая находится в 6NF, также находится и в 5NF. Введена как обобщение пятой нормальной формы для хронологической базы данных. 95 | 96 | __Нормальная форма Бойса-Кодда, усиленная 3 нормальная форма (BCNF)__ - Отношение находится в BCNF, когда каждая её нетривиальная и неприводимая слева функциональная зависимость имеет в качестве своего детерминанта некоторый потенциальный ключ. 97 | 98 | __Доменно-ключевая нормальная форма (DKNF)__ - Отношение находится в DKNF, когда каждое наложенное на неё ограничение является логическим следствием ограничений доменов и ограничений ключей, наложенных на данное отношение. 99 | 100 | [к оглавлению](#Базы-данных) 101 | 102 | ## Что такое _«денормализация»_? Для чего она применяется? 103 | __Денормализация базы данных__ — это процесс осознанного приведения базы данных к виду, в котором она не будет соответствовать правилам нормализации. Обычно это необходимо для повышения производительности и скорости извлечения данных, за счет увеличения избыточности данных. 104 | 105 | [к оглавлению](#Базы-данных) 106 | 107 | ## Какие существуют типы связей в базе данных? Приведите примеры. 108 | + __Один к одному__ - любому значению атрибута А соответствует только одно значение атрибута В, и наоборот. 109 | 110 | >Каждый университет гарантированно имеет 1-го ректора: _1 университет → 1 ректор_. 111 | 112 | + __Один ко многим__ - любому значению атрибута А соответствует 0, 1 или несколько значений атрибута В. 113 | 114 | >В каждом университете есть несколько факультетов: _1 университет → много факультетов_. 115 | 116 | + __Многие ко многим__ - любому значению атрибута А соответствует 0, 1 или несколько значений атрибута В, и любому значению атрибута В соответствует 0, 1 или несколько значение атрибута А. 117 | 118 | >1 профессор может преподавать на нескольких факультетах, в то же время на 1-ом факультете может преподавать несколько профессоров: _Несколько профессоров ↔ Несколько факультетов_. 119 | 120 | [к оглавлению](#Базы-данных) 121 | 122 | ## Что такое _«индексы»_? Для чего их используют? В чём заключаются их преимущества и недостатки? 123 | __Индекс (index)__ — объект базы данных, создаваемый с целью повышения производительности выборки данных. 124 | 125 | Наборы данных могут иметь большое количество записей, которые хранятся в произвольном порядке, и их поиск по заданному критерию путём последовательного просмотра набора данных запись за записью может занимать много времени. Индекс формируется из значений одного или нескольких полей и указателей на соответствующие записи набора данных, - таким образом, достигается значительный прирост скорости выборки из этих данных. 126 | 127 | Преимущества 128 | 129 | + ускорение поиска и сортировки по определенному полю или набору полей. 130 | + обеспечение уникальности данных. 131 | 132 | Недостатки 133 | 134 | + требование дополнительного места на диске и в оперативной памяти и чем больше/длиннее ключ, тем больше размер индекса. 135 | + замедление операций вставки, обновления и удаления записей, поскольку при этом приходится обновлять сами индексы. 136 | 137 | Индексы предпочтительней для: 138 | 139 | + Поля-счетчика, чтобы в том числе избежать и повторения значений в этом поле; 140 | + Поля, по которому проводится сортировка данных; 141 | + Полей, по которым часто проводится соединение наборов данных. Поскольку в этом случае данные располагаются в порядке возрастания индекса и соединение происходит значительно быстрее; 142 | + Поля, которое объявлено первичным ключом (primary key); 143 | + Поля, в котором данные выбираются из некоторого диапазона. В этом случае как только будет найдена первая запись с нужным значением, все последующие значения будут расположены рядом. 144 | 145 | Использование индексов нецелесообразно для: 146 | 147 | + Полей, которые редко используются в запросах; 148 | + Полей, которые содержат всего два или три значения, например: _мужской_, _женский пол_ или значения _«да»_, _«нет»_. 149 | 150 | [к оглавлению](#Базы-данных) 151 | 152 | ## Какие типы индексов существуют? 153 | 154 | __По порядку сортировки__ 155 | + _упорядоченные_ — индексы, в которых элементы упорядочены; 156 | + _возрастающие_; 157 | + _убывающие_; 158 | + _неупорядоченные_ — индексы, в которых элементы неупорядочены. 159 | 160 | __По источнику данных__ 161 | + _индексы по представлению (view)_; 162 | + _индексы по выражениям_. 163 | 164 | __По воздействию на источник данных__ 165 | + _кластерный индекс_ - при определении в наборе данных физическое расположение данных перестраивается в соответствии со структурой индекса. Логическая структура набора данных в этом случае представляет собой скорее словарь, чем индекс. Данные в словаре физически упорядочены, например по алфавиту. Кластерные индексы могут дать существенное увеличение производительности поиска данных даже по сравнению с обычными индексами. Увеличение производительности особенно заметно при работе с последовательными данными. 166 | + _некластерный индекс_ — наиболее типичные представители семейства индексов. В отличие от кластерных, они не перестраивают физическую структуру набора данных, а лишь организуют ссылки на соответствующие записи. Для идентификации нужной записи в наборе данных некластерный индекс организует специальные указатели, включающие в себя: информацию об идентификационном номере файла, в котором хранится запись; идентификационный номер страницы соответствующих данных; номер искомой записи на соответствующей странице; содержимое столбца. 167 | 168 | __По структуре__ 169 | + _B*-деревья_; 170 | + _B+-деревья_; 171 | + _B-деревья_; 172 | + _Хэши_. 173 | 174 | __По количественному составу__ 175 | + _простой индекс (индекс с одним ключом)_ — строится по одному полю; 176 | + _составной (многоключевой, композитный) индекс_ — строится по нескольким полям при этом важен порядок их следования; 177 | + _индекс с включенными столбцами_ — некластеризованный индекс, дополнительно содержащий кроме ключевых столбцов еще и неключевые; 178 | + _главный индекс (индекс по первичному ключу)_ — это тот индексный ключ, под управлением которого в данный момент находится набор данных. Набор данных не может быть отсортирован по нескольким индексным ключам одновременно. Хотя, если один и тот же набор данных открыт одновременно в нескольких рабочих областях, то у каждой копии набора данных может быть назначен свой главный индекс. 179 | 180 | __По характеристике содержимого__ 181 | + _уникальный индекс_ состоит из множества уникальных значений поля; 182 | + _плотный индекс_ (NoSQL) — индекс, при котором, каждом документе в индексируемой коллекции соответствует запись в индексе, даже если в документе нет индексируемого поля. 183 | + _разреженный индекс_ (NoSQL) — тот, в котором представлены только те документы, для которых индексируемый ключ имеет какое-то определённое значение (существует). 184 | + _пространственный индекс_ — оптимизирован для описания географического местоположения. Представляет из себя многоключевой индекс состоящий из широты и долготы. 185 | + _составной пространственный индекс_ — индекс, включающий в себя кроме широты и долготы ещё какие-либо мета-данные (например теги). Но географические координаты должны стоять на первом месте. 186 | + _полнотекстовый (инвертированный) индекс_ — словарь, в котором перечислены все слова и указано, в каких местах они встречаются. При наличии такого индекса достаточно осуществить поиск нужных слов в нём и тогда сразу же будет получен список документов, в которых они встречаются. 187 | + _хэш-индекс_ предполагает хранение не самих значений, а их хэшей, благодаря чему уменьшается размер (а, соответственно, и увеличивается скорость их обработки) индексов из больших полей. Таким образом, при запросах с использованием хэш-индексов, сравниваться будут не искомое со значения поля, а хэш от искомого значения с хэшами полей. 188 | Из-за нелинейнойсти хэш-функций данный индекс нельзя сортировать по значению, что приводит к невозможности использования в сравнениях больше/меньше и «is null». Кроме того, так как хэши не уникальны, то для совпадающих хэшей применяются методы разрешения коллизий. 189 | + _битовый индекс (bitmap index)_ — метод битовых индексов заключается в создании отдельных битовых карт (последовательностей 0 и 1) для каждого возможного значения столбца, где каждому биту соответствует запись с индексируемым значением, а его значение равное 1 означает, что запись, соответствующая позиции бита содержит индексируемое значение для данного столбца или свойства. 190 | + _обратный индекс (reverse index)_ — B-tree индекс, но с реверсированным ключом, используемый в основном для монотонно возрастающих значений (например, автоинкрементный идентификатор) в OLTP системах с целью снятия конкуренции за последний листовой блок индекса, т.к. благодаря переворачиванию значения две соседние записи индекса попадают в разные блоки индекса. Он не может использоваться для диапазонного поиска. 191 | + _функциональный индекс, индекс по вычисляемому полю (function-based index)_ — индекс, ключи которого хранят результат пользовательских функций. Функциональные индексы часто строятся для полей, значения которых проходят предварительную обработку перед сравнением в команде SQL. Например, при сравнении строковых данных без учета регистра символов часто используется функция UPPER. Кроме того, функциональный индекс может помочь реализовать любой другой отсутствующий тип индексов данной СУБД. 192 | + _первичный индекс_ — уникальный индекс по полю первичного ключа. 193 | + _вторичный индекс_ — индекс по другим полям (кроме поля первичного ключа). 194 | + _XML-индекс_ — вырезанное материализованное представление больших двоичных XML-объектов (BLOB) в столбце с типом данных xml. 195 | 196 | __По механизму обновления__ 197 | + _полностью перестраиваемый_ — при добавлении элемента заново перестраивается весь индекс. 198 | + _пополняемый (балансируемый)_ — при добавлении элементов индекс перестраивается частично (например одна из ветви) и периодически балансируется. 199 | 200 | __По покрытию индексируемого содержимого__ 201 | + _полностью покрывающий (полный) индекс_ — покрывает всё содержимое индексируемого объекта. 202 | + _частичный индекс (partial index)_ — это индекс, построенный на части набора данных, удовлетворяющей определенному условию самого индекса. Данный индекс создан для уменьшения размера индекса. 203 | + _инкрементный (delta) индекс_ — индексируется малая часть данных(дельта), как правило, по истечении определённого времени. Используется при интенсивной записи. Например, полный индекс перестраивается раз в сутки, а дельта-индекс строится каждый час. По сути это частичный индекс по временной метке. 204 | + _индекс реального времени (real-time index)_ — особый вид инкрементного индекса, характеризующийся высокой скоростью построения. Предназначен для часто меняющихся данных. 205 | 206 | __Индексы в кластерных системах__ 207 | + _глобальный индекс_ — индекс по всему содержимому всех сегментов БД (shard). 208 | + _сегментный индекс_ — глобальный индекс по полю-сегментируемому ключу (shard key). Используется для быстрого определения сегмента, на котором хранятся данные в процессе маршрутизации запроса в кластере БД. 209 | + _локальный индекс_ — индекс по содержимому только одного сегмента БД. 210 | 211 | [к оглавлению](#Базы-данных) 212 | 213 | ## В чем отличие между кластерными и некластерными индексами? 214 | Некластерные индексы - данные физически расположены в произвольном порядке, но логически упорядочены согласно индексу. Такой тип индексов подходит для часто изменяемого набора данных. 215 | 216 | При кластерном индексировании данные физически упорядочены, что серьезно повышает скорость выборок данных (но только в случае последовательного доступа к данным). Для одного набора данных может быть создан только один кластерный индекс. 217 | 218 | [к оглавлению](#Базы-данных) 219 | 220 | ## Имеет ли смысл индексировать данные, имеющие небольшое количество возможных значений? 221 | Примерное правило, которым можно руководствоваться при создании индекса - если объем информации (в байтах) НЕ удовлетворяющей условию выборки меньше, чем размер индекса (в байтах) по данному условию выборки, то в общем случае оптимизация приведет к замедлению выборки. 222 | 223 | [к оглавлению](#Базы-данных) 224 | 225 | ## Когда полное сканирование набора данных выгоднее доступа по индексу? 226 | Полное сканирование производится многоблочным чтением. Сканирование по индексу - одноблочным. Также, при доступе по индексу сначала идет сканирование самого индекса, а затем чтение блоков из набора данных. Число блоков, которые надо при этом прочитать из набора зависит от фактора кластеризации. Если суммарная стоимость всех необходимых одноблочных чтений больше стоимости полного сканирования многоблочным чтением, то полное сканирование выгоднее и оно выбирается оптимизатором. 227 | 228 | Таким образом, полное сканирование выбирается при слабой селективности предикатов зароса и/или слабой кластеризации данных, либо в случае очень маленьких наборов данных. 229 | 230 | [к оглавлению](#Базы-данных) 231 | 232 | ## Что такое _«транзакция»_? 233 | __Транзакция__ - это воздействие на базу данных, переводящее её из одного целостного состояния в другое и выражаемое в изменении данных, хранящихся в базе данных. 234 | 235 | [к оглавлению](#Базы-данных) 236 | 237 | ## Назовите основные свойства транзакции. 238 | __Атомарность (atomicity)__ гарантирует, что никакая транзакция не будет зафиксирована в системе частично. Будут либо выполнены все её подоперации, либо не выполнено ни одной. 239 | 240 | __Согласованность (consistency)__. Транзакция, достигающая своего нормального завершения и, тем самым, фиксирующая свои результаты, сохраняет согласованность базы данных. 241 | 242 | __Изолированность (isolation)__. Во время выполнения транзакции параллельные транзакции не должны оказывать влияние на её результат. 243 | 244 | __Долговечность (durability)__. Независимо от проблем на нижних уровнях (к примеру, обесточивание системы или сбои в оборудовании) изменения, сделанные успешно завершённой транзакцией, должны остаться сохранёнными после возвращения системы в работу. 245 | 246 | [к оглавлению](#Базы-данных) 247 | 248 | ## Какие существуют уровни изолированности транзакций? 249 | В порядке увеличения изолированности транзакций и, соответственно, надёжности работы с данными: 250 | 251 | + __Чтение неподтверждённых данных (грязное чтение) (read uncommitted, dirty read)__ — чтение незафиксированных изменений как своей транзакции, так и параллельных транзакций. Нет гарантии, что данные, изменённые другими транзакциями, не будут в любой момент изменены в результате их отката, поэтому такое чтение является потенциальным источником ошибок. Невозможны потерянные изменения, возможны неповторяемое чтение и фантомы. 252 | + __Чтение подтверждённых данных (read committed)__ — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций. Потерянные изменения и грязное чтение не допускается, возможны неповторяемое чтение и фантомы. 253 | + __Повторяемость чтения (repeatable read, snapshot)__ — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны. Потерянные изменения, грязное и неповторяемое чтение невозможны, возможны фантомы. 254 | + __Упорядочиваемость (serializable)__ — результат параллельного выполнения сериализуемой транзакции с другими транзакциями должен быть логически эквивалентен результату их какого-либо последовательного выполнения. Проблемы синхронизации не возникают. 255 | 256 | [к оглавлению](#Базы-данных) 257 | 258 | ## Какие проблемы могут возникать при параллельном доступе с использованием транзакций? 259 | При параллельном выполнении транзакций возможны следующие проблемы: 260 | 261 | + __Потерянное обновление (lost update)__ — при одновременном изменении одного блока данных разными транзакциями одно из изменений теряется; 262 | + __«Грязное» чтение (dirty read)__ — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится); 263 | + __Неповторяющееся чтение (non-repeatable read)__ — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными; 264 | + __Фантомное чтение (phantom reads)__ — одна транзакция в ходе своего выполнения несколько раз выбирает множество записей по одним и тем же критериям. Другая транзакция в интервалах между этими выборками добавляет или удаляет записи или изменяет столбцы некоторых записей, используемых в критериях выборки первой транзакции, и успешно заканчивается. В результате получится, что одни и те же выборки в первой транзакции дают разные множества записей. 265 | 266 | [к оглавлению](#Базы-данных) 267 | 268 | # Источники 269 | + [Википедия](https://ru.wikipedia.org/wiki/) 270 | + [tokarchuk.ru](http://tokarchuk.ru/2012/08/indexes-classification/) 271 | + [Quizful](http://www.quizful.net/interview/sql/) 272 | 273 | [Вопросы для собеседования](README.md) 274 | -------------------------------------------------------------------------------- /done.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/johnivo/java-interview/c6abf732b3fe5b4c16bf6f1ebe91f8d8cde56895/done.png -------------------------------------------------------------------------------- /examples/LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2016 Pavel Kalinin 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /examples/README.md: -------------------------------------------------------------------------------- 1 | # Learning Java 2 | 1. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/javarush) for the course from [Java Rush](http://javarush.ru/) 3 | 2. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/m101j) for the course [M101J: MongoDB for Java Developers](https://university.mongodb.com/courses/M101J/about) 4 | 3. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/algo) for the course [Алгоритмы: теория и практика. Методы](https://stepic.org/course/217) 5 | 4. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/djwebservice) for the course [Разработка веб сервиса на Java (часть 1)](https://stepic.org/course/146) 6 | 5. [Homeworks](https://github.com/enhorse/learningJava/tree/master/src/main/java/xyz/enhorse/stepic/hadoop) for the course [Hadoop. Система для обработки больших объемов данных](https://stepic.org/course/150) -------------------------------------------------------------------------------- /examples/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | xyz.enhorse 8 | example 9 | 1.0-SNAPSHOT 10 | 11 | jar 12 | 13 | 14 | xyz.enhorse.example.Application 15 | 16 | 1.8 17 | UTF-8 18 | UTF-8 19 | 20 | 3.6.0 21 | 3.0.0 22 | 2.17 23 | 2.5 24 | 1.5.0 25 | 26 | false 27 | src/main/resources/google_checkstyle.xml 28 | 29 | 4.12 30 | 2.5.0 31 | 1.7.22 32 | 33 | 34 | 35 | Examples 36 | 37 | 38 | Examples for Java Developer interview preparation materials 39 | 40 | https://github.com/enhorse/ 41 | 42 | 43 | 44 | Pavel Kalinin 45 | go2amd@gmail.com 46 | fairy stable 47 | https://enhorse.xyz 48 | 49 | build maintainer 50 | release manager 51 | 52 | 53 | 54 | 55 | 56 | 57 | MIT License 58 | LICENSE 59 | repo 60 | 61 | 62 | 63 | 64 | 65 | 66 | org.slf4j 67 | slf4j-log4j12 68 | ${log4j.version} 69 | 70 | 71 | 72 | junit 73 | junit 74 | ${junit.version} 75 | test 76 | 77 | 78 | org.mockito 79 | mockito-core 80 | ${mockito.version} 81 | test 82 | 83 | 84 | 85 | 86 | 87 | 88 | org.apache.maven.plugins 89 | maven-compiler-plugin 90 | ${maven.compiler.version} 91 | 92 | ${java.version} 93 | ${java.version} 94 | 95 | 96 | 97 | org.apache.maven.plugins 98 | maven-assembly-plugin 99 | ${maven.assembly.version} 100 | 101 | 102 | jar-with-dependencies 103 | 104 | 105 | 106 | ${start-class} 107 | 108 | 109 | 110 | 111 | 112 | package 113 | 114 | single 115 | 116 | 117 | 118 | 119 | 120 | org.apache.maven.plugins 121 | maven-checkstyle-plugin 122 | ${maven.checkstyle.version} 123 | 124 | true 125 | 126 | 127 | 128 | checkstyle 129 | validate 130 | 131 | check 132 | 133 | 134 | ${checkstyle.config} 135 | true 136 | true 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | org.apache.maven.plugins 148 | maven-jxr-plugin 149 | ${maven.jxr.version} 150 | 151 | 152 | 153 | 154 | -------------------------------------------------------------------------------- /examples/src/main/java/xyz/enhorse/example/Application.java: -------------------------------------------------------------------------------- 1 | package xyz.enhorse.example; 2 | 3 | public class Application { 4 | 5 | public static void main(String[] args) { 6 | System.out.println("Examples for Java Developer interview preparation materials!"); 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /examples/src/main/java/xyz/enhorse/example/concurrency/VolatileBehaviour.java: -------------------------------------------------------------------------------- 1 | package xyz.enhorse.example.concurrency; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | 6 | /** 7 | * @author enhorse 8 | * 17.01.2017 9 | */ 10 | public class VolatileBehaviour { 11 | 12 | private static final Logger LOGGER = LoggerFactory.getLogger(VolatileBehaviour.class); 13 | 14 | //private static long MY_INT = 0; 15 | private static volatile long MY_INT = 0; 16 | 17 | 18 | public static void main(String[] args) { 19 | new ChangeListener().start(); 20 | new ChangeMaker().start(); 21 | } 22 | 23 | 24 | static class ChangeListener extends Thread { 25 | 26 | @Override 27 | public void run() { 28 | long local_value = MY_INT; 29 | while (local_value < 5) { 30 | if (local_value != MY_INT) { 31 | LOGGER.info("Got Change for MY_INT : " + MY_INT); 32 | local_value = MY_INT; 33 | } 34 | } 35 | } 36 | } 37 | 38 | static class ChangeMaker extends Thread { 39 | 40 | @Override 41 | public void run() { 42 | 43 | long local_value = MY_INT; 44 | while (MY_INT < 5) { 45 | LOGGER.info("Incrementing MY_INT to " + (local_value + 1)); 46 | MY_INT = ++local_value; 47 | try { 48 | Thread.sleep(500); 49 | } catch (InterruptedException e) { 50 | e.printStackTrace(); 51 | } 52 | } 53 | } 54 | } 55 | 56 | } 57 | -------------------------------------------------------------------------------- /examples/src/main/java/xyz/enhorse/example/concurrency/WaitNotify.java: -------------------------------------------------------------------------------- 1 | package xyz.enhorse.example.concurrency; 2 | 3 | /** 4 | * @author Pavel Kalinin 5 | * 21.10.2016 6 | */ 7 | public class WaitNotify { 8 | 9 | private static final Object lock = new Object(); 10 | private static volatile boolean isTick = true; 11 | 12 | 13 | public static void main(String[] args) { 14 | int concurrency = 333; 15 | 16 | for (int i = 0; i < concurrency; i++) { 17 | new Tick(i).start(); 18 | } 19 | 20 | for (int i = 0; i < concurrency; i++) { 21 | new Tock(i).start(); 22 | } 23 | } 24 | 25 | 26 | private static class Tick extends Thread { 27 | 28 | private final int number; 29 | 30 | 31 | Tick(int number) { 32 | this.number = number; 33 | } 34 | 35 | 36 | @Override 37 | public void run() { 38 | synchronized (lock) { //use monitor of lock 39 | try { 40 | while (!isTick) { 41 | lock.wait(); //wait for our turn 42 | } 43 | System.out.printf("Tick[%03d]\n", number); 44 | isTick = false; 45 | lock.notifyAll(); //tell about that we made our job 46 | } catch (InterruptedException e) { 47 | e.printStackTrace(); 48 | } 49 | } 50 | } 51 | } 52 | 53 | private static class Tock extends Thread { 54 | 55 | private final int number; 56 | 57 | 58 | Tock(int number) { 59 | this.number = number; 60 | } 61 | 62 | 63 | @Override 64 | public void run() { 65 | synchronized (lock) { 66 | try { 67 | while (isTick) { 68 | lock.wait(); 69 | } 70 | System.out.printf(" Tock[%03d]\n", number); 71 | isTick = true; 72 | lock.notifyAll(); 73 | } catch (InterruptedException e) { 74 | e.printStackTrace(); 75 | } 76 | } 77 | } 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /examples/src/main/java/xyz/enhorse/example/oop/PolymorphicTicTock.java: -------------------------------------------------------------------------------- 1 | package xyz.enhorse.example.oop; 2 | 3 | /** 4 | * @author Pavel Kalinin 5 | * 21.10.2016 6 | */ 7 | public class PolymorphicTicTock { 8 | 9 | public static void main(String[] args) { 10 | final int times = 10; 11 | 12 | Commander commander = new Commander(TickTock.TICK); 13 | commander.run(times); 14 | } 15 | 16 | 17 | private enum TickTock { 18 | TICK("tick") { 19 | @Override 20 | TickTock opposite() { 21 | return TOCK; 22 | } 23 | }, 24 | TOCK("tock") { 25 | @Override 26 | TickTock opposite() { 27 | return TICK; 28 | } 29 | }; 30 | 31 | private String content; 32 | 33 | 34 | TickTock(final String content) { 35 | this.content = content; 36 | } 37 | 38 | 39 | void say() { 40 | System.out.println(content); 41 | } 42 | 43 | 44 | abstract TickTock opposite(); 45 | } 46 | 47 | private static class Commander { 48 | 49 | private TickTock current; 50 | 51 | 52 | Commander(final TickTock current) { 53 | this.current = current; 54 | } 55 | 56 | 57 | void once() { 58 | current.say(); 59 | current = current.opposite(); 60 | } 61 | 62 | 63 | void run(final int times) { 64 | for (int i = 0; i < (times * 2); i++) { 65 | once(); 66 | } 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /examples/src/main/resources/google_checkstyle.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 70 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 95 | 96 | 97 | 99 | 100 | 101 | 102 | 104 | 105 | 106 | 107 | 109 | 110 | 111 | 112 | 113 | 114 | 116 | 117 | 118 | 119 | 121 | 122 | 123 | 124 | 126 | 127 | 128 | 129 | 131 | 132 | 133 | 134 | 136 | 138 | 140 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | -------------------------------------------------------------------------------- /examples/src/main/resources/log4j.properties: -------------------------------------------------------------------------------- 1 | log4j.debug=false 2 | log4j.rootLogger=INFO, CONSOLE 3 | log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender 4 | log4j.appender.CONSOLE.encoding=UTF-8 5 | log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout 6 | log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} [%-5p][%-16.16t][%32.32c] - %m%n 7 | log4j.logger.xyz.enhorse=INFO -------------------------------------------------------------------------------- /html.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Основы HTML 4 | + [Что такое _«HTML»_?](#Что-такое-html) 5 | + [Что такое _«XHTML»_?](#Что-такое-xhtml) 6 | + [Что такое `DOCTYPE` и зачем он нужен?](#Что-такое-doctype-и-зачем-он-нужен) 7 | + [Для чего предназначен тег ``?](#Для-чего-предназначен-тег-head) 8 | + [Чем отличается `

` от ``?](#Чем-отличается-div-от-span) 9 | + [Как обозначаются комментарии в HTML?](#Как-обозначаются-комментарии-в-html) 10 | + [Каким образом задаётся адрес документа, на который следует перейти?](#Каким-образом-задаётся-адрес-документа-на-который-следует-перейти) 11 | + [Как сделать ссылку на адрес электронной почты?](#Как-сделать-ссылку-на-адрес-электронной-почты) 12 | + [Для чего предназначен тег ``?](#Для-чего-предназначен-тег-em) 13 | + [Для чего предназначены теги `
    `, `
      `, `
    • `?](#Для-чего-предназначены-теги-ol-ul-li) 14 | + [Для чего предназначены теги `
      `, `
      `, `
      `?](#Для-чего-предназначены-теги-dl-dt-dd) 15 | + [Для чего предназначены теги ``, ``, ``?](#Для-чего-предназначены-теги-tr-th-td) 16 | + [Обязательно ли писать атрибут `alt` в теге ``?](#Обязательно-ли-писать-атрибут-alt-в-теге-img) 17 | + [В каком регистре лучше писать HTML-код?](#В-каком-регистре-лучше-писать-html-код) 18 | + [Что такое «мнемоника (entity)»?](#Что-такое-мнемоника-entity) 19 | 20 | ## Что такое _«HTML»_? 21 | __HTML__, HyperText Markup Language («язык гипертекстовой разметки») — стандартизированный язык разметки документов в WWW. На данный момент актуальна 5 версия этого языка - HTML5. 22 | 23 | [к оглавлению](#Основы-html) 24 | 25 | ## Что такое _«XHTML»_? 26 | __XHTML__, eXtensible HyperText Markup Language («расширяемый язык гипертекстовой разметки») - более строгий вариант HTML, следующий всем ограничениям XML и, фактически являющийся приложением языка XML к области разметки гипертекста. 27 | 28 | [к оглавлению](#Основы-html) 29 | 30 | ## Что такое `DOCTYPE` и зачем он нужен? 31 | Элемент `` предназначен для указания типа текущего документа. Это необходимо, чтобы браузер понимал согласно какого стандарта необходимо интерпретировать данную web-страницу. 32 | 33 | Существует несколько видов ``, различающихся версией языка, на который они ориентированы: 34 | 35 | __HTML 4.01__ 36 | 37 | + ``: строгий синтаксис HTML; 39 | 40 | + ``: переходный синтаксис HTML; 42 | 43 | + ``: HTML с фреймами. 45 | 46 | __HTML 5__ 47 | 48 | + ``: для всех документов. 49 | 50 | __XHTML 1.0__ 51 | 52 | + ``: строгий синтаксис XHTML; 54 | 55 | + ``: переходный синтаксис XHTML; 57 | 58 | + ``: XHTML с фреймами. 60 | 61 | __XHTML 1.1__ 62 | 63 | + ``: для всех документов. 65 | 66 | [к оглавлению](#Основы-html) 67 | 68 | ## Для чего предназначен тег ``? 69 | Тег `` предназначен для хранения других элементов, цель которых — помочь браузеру в работе с данными. Также внутри этого контейнера находятся _метатеги_, которые используются для хранения информации предназначенной для браузеров и поисковых систем. Например, механизмы поисковых систем обращаются к метатегам для получения описания сайта, ключевых слов и других данных. 70 | 71 | Содержимое тега `` не отображается напрямую на web-странице, за исключением тега `` устанавливающего заголовок окна. 72 | 73 | Внутри контейнера `<head>` допускается размещать следующие элементы: `<base>`, `<basefont>`, `<bgsound>`, `<link>`, `<meta>`, `<script>`, `<style>`, `<title>`. 74 | 75 | Синтаксис: 76 | 77 | ```html 78 | <head> 79 | ... 80 | </head> 81 | ``` 82 | 83 | Специфические атрибуты: 84 | 85 | + `profile`: указывает адрес профиля метаданных. 86 | 87 | [к оглавлению](#Основы-html) 88 | 89 | ## Чем отличается `<div>` от `<span>`? 90 | `<div>` - блочный, а `<span>` - строчный элементы. Поэтому `<div>` формирует блок из того, что в нем располагается с новой строки, а `<span>` не переносит элементы, размещая их в строку. Так же стоит отметь, что согласно рекомендациям w3c линейный тег не может включать в себя блочные теги, поэтому `<div>` обычно используется для разметки блоков, а `<span>` - отрывков текста. 91 | 92 | [к оглавлению](#Основы-html) 93 | 94 | ## Как обозначаются комментарии в HTML? 95 | Комментарий в HTML-коде задаётся так: `<!-- комментарий -->` 96 | 97 | Комментарии можно использовать в любом месте страницы, кроме тега `<title>` — внутри него они не работают. Внутри тега `<style>` HTML-комментарии тоже не работают, так как в CSS код комментируется другим способом. 98 | 99 | [к оглавлению](#Основы-html) 100 | 101 | ## Каким образом задаётся адрес документа, на который следует перейти? 102 | Для создания ссылок на другие документы используется тег `<a>`. В зависимости от присутствия атрибутов `name` или `href` тег `<a>` устанавливает ссылку или якорь. Якорем называется закладка внутри страницы, которую можно указать в качестве цели ссылки. При использовании ссылки, которая указывает на якорь, происходит переход к закладке внутри web-страницы. 103 | 104 | Синтаксис: 105 | 106 | + `<a href="URL">...</a>` 107 | + `<a name="идентификатор">...</a>` 108 | 109 | Специфические атрибуты: 110 | 111 | + `accesskey`: активация ссылки с помощью комбинации клавиш; 112 | + `coords`: устанавливает координаты активной области; 113 | + `download`: предлагает скачать указанный по ссылке файл; 114 | + `href`: задает адрес документа, на который следует перейти. Адрес ссылки может быть абсолютным и относительным. Абсолютные адреса работают везде и всюду независимо от имени сайта или веб-страницы, где прописана ссылка. Относительные ссылки, как следует из их названия, построены относительно текущего документа или корня сайта; 115 | + `hreflang`: идентифицирует язык текста по ссылке; 116 | + `name`: устанавливает имя якоря внутри документа; 117 | + `rel`: отношения между ссылаемым и текущим документами; 118 | + `rev`: отношения между текущим и ссылаемым документами; 119 | + `shape`: задает форму активной области ссылки для изображений; 120 | + `tabindex`: определяет последовательность перехода между ссылками при нажатии на кнопку <kbd>Tab</kbd>; 121 | + `target`: имя окна или фрейма, куда браузер будет загружать документ; 122 | + `title`: добавляет всплывающую подсказку к тексту ссылки; 123 | + `type`: указывает MIME-тип документа, на который ведёт ссылка. 124 | 125 | [к оглавлению](#Основы-html) 126 | 127 | ## Как сделать ссылку на адрес электронной почты? 128 | Создание ссылки на адрес электронной почты делается почти также, как и ссылка на web-страницу. Только вместо URL указывается `mailto:"адрес электронной почты"` 129 | 130 | ```html 131 | <a href="mailto:user@address.net">Напиши мне!</a> 132 | ``` 133 | 134 | [к оглавлению](#Основы-html) 135 | 136 | ## Для чего предназначен тег `<em>`? 137 | Тег `<em>` предназначен для акцентирования текста. Браузеры отображают такой текст курсивным начертанием. 138 | 139 | ```html 140 | <em>Текст</em> 141 | ``` 142 | 143 | [к оглавлению](#Основы-html) 144 | 145 | 146 | ## Для чего предназначены теги `<ol>`, `<ul>`, `<li>`? 147 | Теги `<ol>`, `<ul>` и `<li>` предназначены для оформления списков. 148 | 149 | + `<ol>`: нумерованный список, т.е. каждый элемент списка начинается с числа или буквы и увеличивается по нарастающей. 150 | + `<ul>`: маркированный список, каждый элемент которого начинается с небольшого символа — маркера. 151 | + `<li>`: отдельный элемент списка. Внешний тег `<ul>` или `<ol>` устанавливает тип списка — маркированный или нумерованный. 152 | 153 | ```html 154 | <ol>Нумерованый список 155 | <li>первый</li> 156 | <li>второй</li> 157 | <li>третий</li> 158 | </ol> 159 | 160 | <ul>Маркированный список 161 | <li>первый</li> 162 | <li>второй</li> 163 | <li>третий</li> 164 | </ul> 165 | ``` 166 | 167 | [к оглавлению](#Основы-html) 168 | 169 | 170 | ## Для чего предназначены теги `<dl>`, `<dt>`, `<dd>`? 171 | Теги `<dl>`, `<dt>`, `<dd>` предназначены для создания списка определений. 172 | 173 | Каждый такой список начинается с контейнера `<dl>`, куда входит тег `<dt>` создающий термин и тег `<dd>` задающий определение этого термина. Закрывающий тег `</dd>` не обязателен, поскольку следующий тег сообщает о завершении предыдущего элемента. Тем не менее, хорошим стилем является закрывать все теги. 174 | 175 | ```html 176 | <dl>Список определений 177 | <dt>Термин</dt> 178 | <dd>Определение</dd> 179 | </dl> 180 | ``` 181 | 182 | [к оглавлению](#Основы-html) 183 | 184 | ## Для чего предназначены теги `<tr>`, `<th>`, `<td>`? 185 | 186 | `<tr>`: служит контейнером для создания строки таблицы. Каждая ячейка в пределах такой строки может задаваться с помощью тега `<th>` или `<td>`. 187 | `<th>`: предназначен для создания одной ячейки заголовка таблицы. 188 | `<td>`: предназначен для создания одной ячейки таблицы. 189 | 190 | ```html 191 | <table> 192 | <tr> 193 | <th>Заголовок</td> 194 | </tr> 195 | <tr> 196 | <td>Строка</td> 197 | </tr> 198 | </table> 199 | ``` 200 | 201 | [к оглавлению](#Основы-html) 202 | 203 | ## Обязательно ли писать атрибут `alt` в теге `<img>`? 204 | Да, писать его обязательно. 205 | 206 | Атрибут `alt` устанавливает альтернативный текст для изображений. Такой текст позволяет получить текстовую информацию о рисунке при отключенной в браузере загрузке изображений. Поскольку загрузка изображений происходит после получения браузером информации о нем, то замещающий рисунок текст появляется раньше. А уже по мере загрузки текст будет сменяться изображением. 207 | 208 | ```html 209 | <img src="forest.jpg" alt="Лес"> 210 | ``` 211 | 212 | [к оглавлению](#Основы-html) 213 | 214 | ## В каком регистре лучше писать HTML-код? 215 | Весь HTML-код рекомендуется писать в нижнем регистре: это относится к названиям элементов, названиям атрибутов, значениям атрибутов (кроме текста/`CDATA`), селекторам, свойствам и их значениям (кроме текста). 216 | 217 | Не рекомендуется 218 | ```html 219 | <A HREF="/">Домой</A> 220 | ``` 221 | 222 | Рекомендуется 223 | ```html 224 | <img src="forest.jpg" alt="Лес"> 225 | ``` 226 | 227 | [к оглавлению](#Основы-html) 228 | 229 | ## Что такое «мнемоника (entity)»? 230 | __Мнемоника (entity)__ - это конструкция из символа `&` и буквенного (или цифрового кода) после нее, предназначенная для замещения символов, которые запрещены для использования в HTML в «явном виде». 231 | 232 | ># имеет мнемонику `#` 233 | 234 | [к оглавлению](#Основы-html) 235 | 236 | # Источники 237 | + [htmlbook](http://htmlbook.ru/html/) 238 | + [Хабрахабр](https://habrahabr.ru/post/143452/) 239 | 240 | [Вопросы для собеседования](README.md) 241 | -------------------------------------------------------------------------------- /io.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Потоки ввода/вывода в Java 4 | + [В чём заключается разница между IO и NIO?](#В-чём-заключается-разница-между-io-и-nio) 5 | + [Какие особенности NIO вы знаете?](#Какие-особенности-nio-вы-знаете) 6 | + [Что такое _«каналы»_?](#Что-такое-каналы) 7 | + [Какие существуют виды потоков ввода/вывода?](#Какие-существуют-виды-потоков-вводавывода) 8 | + [Назовите основные классы потоков ввода/вывода.](#Назовите-основные-классы-потоков-вводавывода) 9 | + [В каких пакетах расположены классы потоков ввода/вывода?](#В-каких-пакетах-расположены-классы-потоков-вводавывода) 10 | + [Какие подклассы класса `InputStream` вы знаете, для чего они предназначены?](#Какие-подклассы-класса-inputstream-вы-знаете-для-чего-они-предназначены) 11 | + [Для чего используется `PushbackInputStream`?](#Для-чего-используется-pushbackinputstream) 12 | + [Для чего используется `SequenceInputStream`?](#Для-чего-используется-sequenceinputstream) 13 | + [Какой класс позволяет читать данные из входного байтового потока в формате примитивных типов данных?](#Какой-класс-позволяет-читать-данные-из-входного-байтового-потока-в-формате-примитивных-типов-данных) 14 | + [Какие подклассы класса `OutputStream` вы знаете, для чего они предназначены?](#Какие-подклассы-класса-outputstream-вы-знаете-для-чего-они-предназначены) 15 | + [Какие подклассы класса `Reader` вы знаете, для чего они предназначены?](#Какие-подклассы-класса-reader-вы-знаете-для-чего-они-предназначены) 16 | + [Какие подклассы класса `Writer` вы знаете, для чего они предназначены?](#Какие-подклассы-класса-writer-вы-знаете-для-чего-они-предназначены) 17 | + [В чем отличие класса `PrintWriter` от `PrintStream`?](#В-чем-отличие-класса-printwriter-от-printstream) 18 | + [Чем отличаются и что общего у `InputStream`, `OutputStream`, `Reader`, `Writer`?](#Чем-отличаются-и-что-общего-у-inputstream-outputstream-reader-writer) 19 | + [Какие классы позволяют преобразовать байтовые потоки в символьные и обратно?](#Какие-классы-позволяют-преобразовать-байтовые-потоки-в-символьные-и-обратно) 20 | + [Какие классы позволяют ускорить чтение/запись за счет использования буфера?](#Какие-классы-позволяют-ускорить-чтениезапись-за-счет-использования-буфера) 21 | + [Какой класс предназначен для работы с элементами файловой системы?](#Какой-класс-предназначен-для-работы-с-элементами-файловой-системы) 22 | + [Какие методы класса `File` вы знаете?](#Какие-методы-класса-file-вы-знаете) 23 | + [Что вы знаете об интерфейсе `FileFilter`?](#Что-вы-знаете-об-интерфейсе-filefilter) 24 | + [Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)?](#Как-выбрать-все-элементы-определенного-каталога-по-критерию-например-с-определенным-расширением) 25 | + [Что вы знаете о `RandomAccessFile`?](#Что-вы-знаете-о-randomaccessfile) 26 | + [Какие режимы доступа к файлу есть у `RandomAccessFile`?](#Какие-режимы-доступа-к-файлу-есть-у-randomaccessfile) 27 | + [Какие классы поддерживают чтение и запись потоков в компрессированном формате?](#Какие-классы-поддерживают-чтение-и-запись-потоков-в-компрессированном-формате) 28 | + [Существует ли возможность перенаправить потоки стандартного ввода/вывода?](#Существует-ли-возможность-перенаправить-потоки-стандартного-вводавывода) 29 | + [Какой символ является разделителем при указании пути в файловой системе?](#Какой-символ-является-разделителем-при-указании-пути-в-файловой-системе) 30 | + [Что такое _«абсолютный путь»_ и _«относительный путь»_?](#Что-такое-абсолютный-путь-и-относительный-путь) 31 | + [Что такое _«символьная ссылка»_?](#Что-такое-символьная-ссылка) 32 | 33 | [к оглавлению](#Потоки-вводавывода-в-java) 34 | 35 | ## В чём заключается разница между IO и NIO? 36 | + Java IO (input-output) является потокоориентированным, а Java NIO (new/non-blocking io) – буфер-ориентированным. Потокоориентированный ввод/вывод подразумевает чтение/запись из потока/в поток одного или нескольких байт в единицу времени поочередно. Данная информация нигде не кэшируются. Таким образом, невозможно произвольно двигаться по потоку данных вперед или назад. В Java NIO данные сначала считываются в буфер, что дает больше гибкости при обработке данных. 37 | + Потоки ввода/вывода в Java IO являются блокирующими. Это значит, что когда в потоке выполнения вызывается `read()` или `write()` метод любого класса из пакета `java.io.*`, происходит блокировка до тех пор, пока данные не будут считаны или записаны. Поток выполнения в данный момент не может делать ничего другого. Неблокирующий режим Java NIO позволяет запрашивать считанные данные из канала (channel) и получать только то, что доступно на данный момент, или вообще ничего, если доступных данных пока нет. Вместо того, чтобы оставаться заблокированным пока данные не станут доступными для считывания, поток выполнения может заняться чем-то другим. Тоже самое справедливо и для неблокирующего вывода. Поток выполнения может запросить запись в канал некоторых данных, но не дожидаться при этом пока они не будут полностью записаны. 38 | + В Java NIO имеются селекторы, которые позволяют одному потоку выполнения мониторить несколько каналов ввода. Т.е. существует возможность зарегистрировать несколько каналов с селектором, а потом использовать один поток выполнения для обслуживания каналов, имеющих доступные для обработки данные, или для выбора каналов, готовых для записи. 39 | 40 | [к оглавлению](#Потоки-вводавывода-в-java) 41 | 42 | ## Какие особенности NIO вы знаете? 43 | + __Каналы и селекторы__: NIO поддерживает различные типы каналов. Канал является абстракцией объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), что позволяет передавать данные с более высокой скоростью. Каналы не блокируются и поэтому Java предоставляет еще такие инструменты, как селектор, который позволяет выбрать готовый канал для передачи данных, и сокет, который является инструментом для блокировки. 44 | + __Буферы__: имеет буферизация для всех классов-обёрток примитивов (кроме Boolean). Появился абстрактный класс Buffer, который предоставляет такие операции, как clear, flip, mark и т.д. Его подклассы предоставляют методы для получения и установки данных. 45 | + __Кодировки__: появились кодеры и декодеры для отображения байт и символов Unicode. 46 | [к оглавлению](#Потоки-вводавывода-в-java) 47 | 48 | ## Что такое _«каналы»_? 49 | Каналы (channels) – это логические (не физические) порталы, абстракции объектов более низкого уровня файловой системы (например, отображенные в памяти файлы и блокировки файлов), через которые осуществляется ввод/вывод данных, а буферы являются источниками или приёмниками этих переданных данных. При организации вывода, данные, которые необходимо отправить, помещаются в буфер, который затем передается в канал. При вводе, данные из канала помещаются в заранее предоставленный буфер. 50 | 51 | Каналы напоминают трубопроводы, по которым эффективно транспортируются данные между буферами байтов и сущностями по ту сторону каналов. Каналы – это шлюзы, которые позволяют получить доступ к сервисам ввода/вывода операционной системы с минимальными накладными расходами, а буферы – внутренние конечные точки этих шлюзов, используемые для передачи и приема данных. 52 | 53 | [к оглавлению](#Потоки-вводавывода-в-java) 54 | 55 | ## Какие существуют виды потоков ввода/вывода? 56 | ## Назовите основные классы потоков ввода/вывода. 57 | Разделяют два вида потоков ввода/вывода: 58 | 59 | + __байтовые__ - `java.io.InputStream`, `java.io.OutputStream`; 60 | + __символьные__ - `java.io.Reader`, `java.io.Writer`. 61 | 62 | [к оглавлению](#Потоки-вводавывода-в-java) 63 | 64 | ## В каких пакетах расположены классы потоков ввода/вывода? 65 | `java.io`, `java.nio`. Для работы с потоками компрессированных данных используются классы из пакета `java.util.zip` 66 | 67 | [к оглавлению](#Потоки-вводавывода-в-java) 68 | 69 | ## Какие подклассы класса `InputStream` вы знаете, для чего они предназначены? 70 | + `InputStream` - абстрактный класс, описывающий поток ввода; 71 | + `BufferedInputStream` - буферизованный входной поток; 72 | + `ByteArrayInputStream` позволяет использовать буфер в памяти (массив байтов) в качестве источника данных для входного потока; 73 | + `DataInputStream` - входной поток для байтовых данных, включающий методы для чтения стандартных типов данных Java; 74 | + `FileInputStream` - входной поток для чтения информации из файла; 75 | + `FilterInputStream` - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства; 76 | + `ObjectInputStream` - входной поток для объектов; 77 | + `StringBufferInputStream` превращает строку (`String`) во входной поток данных `InputStream`; 78 | + `PipedInputStream` реализует понятие входного канала; 79 | + `PrintStream` - выходной поток, включающий методы `print()` и `println()`; 80 | + `PushbackInputStream` - разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток, позволяет «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации. 81 | + `SequenceInputStream` используется для слияния двух или более потоков `InputStream` в единый. 82 | 83 | [к оглавлению](#Потоки-вводавывода-в-java) 84 | 85 | ## Для чего используется `PushbackInputStream`? 86 | Разновидность буферизации, обеспечивающая чтение байта с последующим его возвратом в поток. Класс `PushbackInputStream` представляет механизм «заглянуть» во входной поток и увидеть, что оттуда поступит в следующий момент, не извлекая информации. 87 | 88 | У класса есть дополнительный метод unread(). 89 | 90 | [к оглавлению](#Потоки-вводавывода-в-java) 91 | 92 | ## Для чего используется `SequenceInputStream`? 93 | Класс `SequenceInputStream` позволяет сливать вместе несколько экземпляров класса `InputStream`. Конструктор принимает в качестве аргумента либо пару объектов класса `InputStream`, либо интерфейс `Enumeration`. 94 | 95 | Во время работы класс выполняет запросы на чтение из первого объекта класса `InputStream` и до конца, а затем переключается на второй. При использовании интерфейса работа продолжится по всем объектам класса `InputStream`. По достижении конца, связанный с ним поток закрывается. Закрытие потока, созданного объектом класса `SequenceInputStream`, приводит к закрытию всех открытых потоков. 96 | 97 | [к оглавлению](#Потоки-вводавывода-в-java) 98 | 99 | ## Какой класс позволяет читать данные из входного байтового потока в формате примитивных типов данных? 100 | Класс `DataInputStream` представляет поток ввода и предназначен для записи данных примитивных типов, таких, как `int`, `double` и т.д. Для каждого примитивного типа определен свой метод для считывания: 101 | 102 | + `boolean readBoolean()`: считывает из потока булевое однобайтовое значение 103 | + `byte readByte()`: считывает из потока 1 байт 104 | + `char readChar()`: считывает из потока значение `char` 105 | + `double readDouble()`: считывает из потока 8-байтовое значение `double` 106 | + `float readFloat()`: считывает из потока 4-байтовое значение `float` 107 | + `int readInt()`: считывает из потока целочисленное значение `int` 108 | + `long readLong()`: считывает из потока значение `long` 109 | + `short readShort()`: считывает значение `short` 110 | + `String readUTF()`: считывает из потока строку в кодировке UTF-8 111 | 112 | [к оглавлению](#Потоки-вводавывода-в-java) 113 | 114 | ## Какие подклассы класса `OutputStream` вы знаете, для чего они предназначены? 115 | + `OutputStream` - это абстрактный класс, определяющий потоковый байтовый вывод; 116 | + `BufferedOutputStream` - буферизированный выходной поток; 117 | + `ByteArrayOutputStream` - все данные, посылаемые в этот поток, размещаются в предварительно созданном буфере; 118 | + `DataOutputStream` - выходной поток байт, включающий методы для записи стандартных типов данных Java; 119 | + `FileOutputStream` - запись данных в файл на физическом носителе; 120 | + `FilterOutputStream` - абстрактный класс, предоставляющий интерфейс для классов-надстроек, которые добавляют к существующим потокам полезные свойства; 121 | + `ObjectOutputStream` - выходной поток для записи объектов; 122 | + `PipedOutputStream` реализует понятие выходного канала. 123 | 124 | [к оглавлению](#Потоки-вводавывода-в-java) 125 | 126 | ## Какие подклассы класса `Reader` вы знаете, для чего они предназначены? 127 | + `Reader` - абстрактный класс, описывающий символьный ввод; 128 | + `BufferedReader` - буферизованный входной символьный поток; 129 | + `CharArrayReader` - входной поток, который читает из символьного массива; 130 | + `FileReader` - входной поток, читающий файл; 131 | + `FilterReader` - абстрактный класс, предоставляющий интерфейс для классов-надстроек; 132 | + `InputStreamReader`- входной поток, транслирующий байты в символы; 133 | + `LineNumberReader` - входной поток, подсчитывающий строки; 134 | + `PipedReader` - входной канал; 135 | + `PushbackReader` - входной поток, позволяющий возвращать символы обратно в поток; 136 | + `StringReader` - входной поток, читающий из строки. 137 | 138 | [к оглавлению](#Потоки-вводавывода-в-java) 139 | 140 | ## Какие подклассы класса `Writer` вы знаете, для чего они предназначены? 141 | + `Writer` - абстрактный класс, описывающий символьный вывод; 142 | + `BufferedWriter` - буферизованный выходной символьный поток; 143 | + `CharArrayWriter` - выходной поток, который пишет в символьный массив; 144 | + `FileWriter` - выходной поток, пишущий в файл; 145 | + `FilterWriter` - абстрактный класс, предоставляющий интерфейс для классов-надстроек; 146 | + `OutputStreamWriter` - выходной поток, транслирующий байты в символы; 147 | + `PipedWriter` - выходной канал; 148 | + `PrintWriter` - выходной поток символов, включающий методы `print()` и `println()`; 149 | + `StringWriter` - выходной поток, пишущий в строку; 150 | 151 | [к оглавлению](#Потоки-вводавывода-в-java) 152 | 153 | ## В чем отличие класса `PrintWriter` от `PrintStream`? 154 | Прежде всего, в классе `PrintWriter` применен усовершенствованный способ работы с символами Unicode и другой механизм буферизации вывода: в классе PrintStream буфер вывода сбрасывался всякий раз, когда вызывался метод `print()` или `println()`, а при использовании класса `PrintWriter` существует возможность отказаться от автоматического сброса буферов, выполняя его явным образом при помощи метода `flush()`. 155 | 156 | Кроме того, методы класса `PrintWriter` никогда не создают исключений. Для проверки ошибок необходимо явно вызвать метод `checkError()`. 157 | 158 | [к оглавлению](#Потоки-вводавывода-в-java) 159 | 160 | ## Чем отличаются и что общего у `InputStream`, `OutputStream`, `Reader`, `Writer`? 161 | + `InputStream` и его наследники - совокупность для получения байтовых данных из различных источников; 162 | + `OutputStream` и его наследники - набор классов определяющих потоковый байтовый вывод; 163 | + `Reader` и его наследники определяют потоковый ввод символов Unicode; 164 | + `Writer` и его наследники определяют потоковый вывод символов Unicode. 165 | 166 | [к оглавлению](#Потоки-вводавывода-в-java) 167 | 168 | ## Какие классы позволяют преобразовать байтовые потоки в символьные и обратно? 169 | + `OutputStreamWriter` — «мост» между классом `OutputStream` и классом `Writer`. Символы, записанные в поток, преобразовываются в байты. 170 | + `InputStreamReader` — аналог для чтения. При помощи методов класса `Reader` читаются байты из потока `InputStream` и далее преобразуются в символы. 171 | 172 | [к оглавлению](#Потоки-вводавывода-в-java) 173 | 174 | ## Какие классы позволяют ускорить чтение/запись за счет использования буфера? 175 | + `BufferedInputStream(InputStream in)`/`BufferedInputStream(InputStream in, int size)`, 176 | + `BufferedOutputStream(OutputStream out)`/`BufferedOutputStream(OutputStream out, int size)`, 177 | + `BufferedReader(Reader r)`/`BufferedReader(Reader in, int sz)`, 178 | + `BufferedWriter(Writer out)`/`BufferedWriter(Writer out, int sz)` 179 | 180 | [к оглавлению](#Потоки-вводавывода-в-java) 181 | 182 | ## Какой класс предназначен для работы с элементами файловой системы? 183 | `File` работает непосредственно с файлами и каталогами. Данный класс позволяет создавать новые элементы и получать информацию существующих: размер, права доступа, время и дату создания, путь к родительскому каталогу. 184 | 185 | [к оглавлению](#Потоки-вводавывода-в-java) 186 | 187 | ## Какие методы класса `File` вы знаете? 188 | Наиболее используемые методы класса `File`: 189 | 190 | + `boolean createNewFile()`: делает попытку создать новый файл; 191 | + `boolean delete()`: делает попытку удалить каталог или файл; 192 | + `boolean mkdir()`: делает попытку создать новый каталог; 193 | + `boolean renameTo(File dest)`: делает попытку переименовать файл или каталог; 194 | + `boolean exists()`: проверяет, существует ли файл или каталог; 195 | + `String getAbsolutePath()`: возвращает абсолютный путь для пути, переданного в конструктор объекта; 196 | + `String getName()`: возвращает краткое имя файла или каталога; 197 | + `String getParent()`: возвращает имя родительского каталога; 198 | + `boolean isDirectory()`: возвращает значение `true`, если по указанному пути располагается каталог; 199 | + `boolean isFile()`: возвращает значение `true`, если по указанному пути находится файл; 200 | + `boolean isHidden()`: возвращает значение `true`, если каталог или файл являются скрытыми; 201 | + `long length()`: возвращает размер файла в байтах; 202 | + `long lastModified()`: возвращает время последнего изменения файла или каталога; 203 | + `String[] list()`: возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге; 204 | + `File[] listFiles()`: возвращает массив файлов и подкаталогов, которые находятся в определенном каталоге. 205 | 206 | [к оглавлению](#Потоки-вводавывода-в-java) 207 | 208 | ## Что вы знаете об интерфейсе `FileFilter`? 209 | Интерфейс `FileFilter` применяется для проверки, попадает ли объект `File` под некоторое условие. Этот интерфейс содержит единственный метод `boolean accept(File pathName)`. Этот метод необходимо переопределить и реализовать. Например: 210 | 211 | ```java 212 | public boolean accept(final File file) { 213 | return file.isExists() && file.isDirectory(); 214 | } 215 | ``` 216 | 217 | [к оглавлению](#Потоки-вводавывода-в-java) 218 | 219 | ## Как выбрать все элементы определенного каталога по критерию (например, с определенным расширением)? 220 | Метод `File.listFiles()` возвращает массив объектов `File`, содержащихся в каталоге. Метод может принимать в качестве параметра объект класса, реализующего `FileFilter`. Это позволяет включить список только те элементы, для которые метода `accept` возвращает `true` (критерием может быть длина имени файла или его расширение). 221 | 222 | [к оглавлению](#Потоки-вводавывода-в-java) 223 | 224 | ## Что вы знаете о `RandomAccessFile`? 225 | Класс `java.io.RandomAccessFile` обеспечивает чтение и запись данных в произвольном месте файла. Он не является частью иерархии `InputStream` или `OutputStream`. Это полностью отдельный класс, имеющий свои собственные (в большинстве своем _native_) методы. Объяснением этого может быть то, что `RandomAccessFile` имеет во многом отличающееся поведение по сравнению с остальными классами ввода/вывода так как позволяет, в пределах файла, перемещаться вперед и назад. 226 | 227 | `RandomAccessFile` имеет такие специфические методы как: 228 | 229 | + `getFilePointer()` для определения текущего местоположения в файле; 230 | + `seek()` для перемещения на новую позицию в файле; 231 | + `length()` для выяснения размера файла; 232 | + `setLength()` для установки размера файла; 233 | + `skipBytes()` для того, чтобы попытаться пропустить определённое число байт; 234 | + `getChannel()` для работы с уникальным файловым каналом, ассоциированным с заданным файлом; 235 | + методы для выполнения обычного и форматированного вывода из файла (`read()`, `readInt()`, `readLine()`, `readUTF()` и т.п.); 236 | + методы для обычной или форматированной записи в файл с прямым доступом (`write()`, `writeBoolean()`, `writeByte()` и т.п.). 237 | 238 | Так же следует отметить, что конструкторы `RandomAccessFile` требуют второй аргумент, указывающий необходимый режим доступа к файлу - только чтение (`"r"`), чтение и запись (`"rw"`) или иную их разновидность. 239 | 240 | [к оглавлению](#Потоки-вводавывода-в-java) 241 | 242 | ## Какие режимы доступа к файлу есть у `RandomAccessFile`? 243 | + `"r"` открывает файл только для чтения. Запуск любых методов записи данных приведет к выбросу исключения `IOException`. 244 | + `"rw"` открывает файл для чтения и записи. Если файл еще не создан, то осуществляется попытка создать его. 245 | + `"rws"` открывает файл для чтения и записи подобно `"rw"`, но требует от системы при каждом изменении содержимого файла или метаданных синхронно записывать эти изменения на физический носитель. 246 | + `"rwd"` открывает файл для чтения и записи подобно `"rws"`, но требует от системы синхронно записывать изменения на физический носитель только при каждом изменении содержимого файла. Если изменяются метаданные, синхронная запись не требуется. 247 | 248 | [к оглавлению](#Потоки-вводавывода-в-java) 249 | 250 | ## Какие классы поддерживают чтение и запись потоков в компрессированном формате? 251 | + `DeflaterOutputStream` - компрессия данных в формате deflate. 252 | + `Deflater` - компрессия данных в формат ZLIB 253 | + `ZipOutputStream` - потомок `DeflaterOutputStream` для компрессии данных в формат Zip. 254 | + `GZIPOutputStream` - потомок `DeflaterOutputStream` для компрессии данных в формат GZIP. 255 | + `InflaterInputStream` - декомпрессия данных в формате deflate. 256 | + `Inflater` - декомпрессия данных в формате ZLIB 257 | + `ZipInputStream` - потомок `InflaterInputStream` для декомпрессии данных в формате Zip. 258 | + `GZIPInputStream` - потомок `InflaterInputStream` для декомпрессии данных в формате GZIP. 259 | 260 | [к оглавлению](#Потоки-вводавывода-в-java) 261 | 262 | ## Существует ли возможность перенаправить потоки стандартного ввода/вывода? 263 | Класс `System` позволяет вам перенаправлять стандартный ввод, вывод и поток вывода ошибок, используя простой вызов статического метода: 264 | 265 | + `setIn(InputStream)` - для ввода; 266 | + `setOut(PrintStream)` - для вывода; 267 | + `setErr(PrintStream)` - для вывода ошибок. 268 | 269 | [к оглавлению](#Потоки-вводавывода-в-java) 270 | 271 | ## Какой символ является разделителем при указании пути в файловой системе? 272 | Для различных операционных систем символ разделителя различается. Для Windows это `\`, для Linux - `/`. 273 | 274 | В Java получить разделитель для текущей операционной системы можно через обращение к статическому полю `File.separator`. 275 | 276 | [к оглавлению](#Потоки-вводавывода-в-java) 277 | 278 | ## Что такое _«абсолютный путь»_ и _«относительный путь»_? 279 | __Абсолютный (полный) путь__ — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога. 280 | 281 | __Относительный путь__ представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения. 282 | 283 | [к оглавлению](#Потоки-вводавывода-в-java) 284 | 285 | ## Что такое _«символьная ссылка»_? 286 | __Символьная (символическая) ссылка__ (также «симлинк», Symbolic link) — специальный файл в файловой системе, в котором, вместо пользовательских данных, содержится путь к файлу, который должен быть открыт при попытке обратиться к данной ссылке (файлу). Целью ссылки может быть любой объект: например, другая ссылка, файл, каталог или даже несуществующий файл (в последнем случае, при попытке открыть его, должно выдаваться сообщение об отсутствии файла). 287 | 288 | Символьные ссылки используются для более удобной организации структуры файлов на компьютере, так как: 289 | 290 | + позволяют для одного файла или каталога иметь несколько имён и различных атрибутов; 291 | + свободны от некоторых ограничений, присущих жёстким ссылкам (последние действуют только в пределах одной файловой системы (одного раздела) и не могут ссылаться на каталоги). 292 | 293 | [к оглавлению](#Потоки-вводавывода-в-java) 294 | 295 | # Источники 296 | + [Quizful](http://www.quizful.net/post/java-nio-tutorial) 297 | + [Хабрахабр](https://habrahabr.ru/post/235585/) 298 | + [Освой программирование играючи](http://developer.alexanderklimov.ru/android/java/io.php) 299 | + [Metanit](http://metanit.com/java/tutorial/6.1.php) 300 | + [javastudy.ru](http://javastudy.ru/interview/input-output/) 301 | + [Bruce Eckel «Thinking in Java»](http://iais.kemsu.ru/odocs/java/Chapter11.html) 302 | 303 | [Вопросы для собеседования](README.md) 304 | -------------------------------------------------------------------------------- /jdbc.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # JDBC 4 | + [Что такое _JDBC_?](#Что-такое-jdbc) 5 | + [В чем заключаются преимущества использования JDBC?](#В-чем-заключаются-преимущества-использования-jdbc) 6 | + [Что из себя представляет JDBC URL?](#Что-из-себя-представляет-jdbc-url) 7 | + [Из каких частей стоит JDBC?](#Из-каких-частей-стоит-jdbc) 8 | + [Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java?](#Перечислите-основные-классы-и-интерфейсы-jdbc) 9 | + [Опишите основные этапы работы с базой данных с использованием JDBC.](#Опишите-основные-этапы-работы-с-базой-данных-при-использовании-jdbc) 10 | + [Как зарегистрировать драйвер JDBC?](#Как-зарегистрировать-драйвер-jdbc) 11 | + [Как установить соединение с базой данных?](#Как-установить-соединение-с-базой-данных) 12 | + [Какие уровни изоляции транзакций поддерживаются в JDBC?](#Какие-уровни-изоляции-транзакций-поддерживаются-в-jdbc) 13 | + [При помощи чего формируются запросы к базе данных?](#При-помощи-чего-формируются-запросы-к-базе-данных) 14 | + [Чем отличается Statement от PreparedStatement?](#Чем-отличается-statement-от-preparedstatement) 15 | + [Как осуществляется запрос к базе данных и обработка результатов?](#Как-осуществляется-запрос-к-базе-данных-и-обработка-результатов) 16 | + [Как вызвать хранимую процедуру?](#Как-вызвать-хранимую-процедуру) 17 | + [Как закрыть соединение с базой данных?](#Как-закрыть-соединение-с-базой-данных) 18 | 19 | ## Что такое _JDBC_? 20 | __JDBC, Java DataBase Connectivity (соединение с базами данных на Java)__ — промышленный стандарт взаимодействия Java-приложений с различными СУБД. Реализован в виде пакета `java.sql`, входящего в состав Java SE. 21 | 22 | JDBC основан на концепции драйверов, которые позволяют получать соединение с базой данных по специально описанному URL. При загрузке драйвер регистрирует себя в системе и в дальнейшем автоматически вызывается, когда программа требует URL, содержащий протокол, за который этот драйвер отвечает. 23 | 24 | [к оглавлению](#jdbc) 25 | 26 | ## В чем заключаются преимущества использования JDBC? 27 | Преимуществами JDBC считают: 28 | 29 | + Лёгкость разработки: разработчик может не знать специфики базы данных, с которой работает; 30 | + Код практически не меняется, если компания переходит на другую базу данных (количество изменений зависит исключительно от различий между диалектами SQL); 31 | + Не нужно дополнительно устанавливать клиентскую программу; 32 | + К любой базе данных можно подсоединиться через легко описываемый URL. 33 | 34 | [к оглавлению](#jdbc) 35 | 36 | ## Что из себя представляет JDBC URL? 37 | __JDBC URL__ состоит из: 38 | 39 | + `<protocol>:` (протокола) - всегда `jdbc:`. 40 | + `<subprotocol>:` (подпротокола) - это имя драйвера или имя механизма соединения с базой данных. Подпротокол может поддерживаться одним или несколькими драйверами. Лежащий на поверхности пример подпротокола - это "odbc", отведенный для URL, обозначающих имя источника данных ODBC. В случае необходимости использовать сервис имен (т.е. имя базы данных в JDBC URL не будет действительным именем базы данных), то подпротоколом может выступать сервис имен. 41 | + `<subname>` (подимени) - это идентификатор базы данных. Значение подимени может менятся в зависимости от подпротокола, и может также иметь под-подимя с синтаксисом, определяемым разработчиком драйвера. Назначение подимени - это предоставление всей информации, необходимой для поиска базы данных. Например, если база данных находится в Интернет, то в состав подимени JDBC URL должен быть включен сетевой адрес, подчиняющийся следующим соглашениям: `//<hostname>:<port>/<subsubname`. 42 | 43 | Пример JDBC URL для подключения к MySQL базе данных «Test» расположенной по адресу localhost и ожидающей соединений по порту 3306: `jdbc:mysql://localhost:3306/Test` 44 | 45 | [к оглавлению](#jdbc) 46 | 47 | ## Из каких частей стоит JDBC? 48 | JDBC состоит из двух частей: 49 | 50 | + __JDBC API__, который содержит набор классов и интерфейсов, определяющих доступ к базам данных. Эти классы и методы объявлены в двух пакетах - `java.sql` и `javax.sql`; 51 | + __JDBC-драйвер__, компонент, специфичный для каждой базы данных. 52 | 53 | JDBC превращает вызовы уровня API в «родные» команды того или иного сервера баз данных. 54 | 55 | [к оглавлению](#jdbc) 56 | 57 | ## Перечислите основные классы и интерфейсы JDBC. 58 | + `java.sql.DriverManager` - позволяет загрузить и зарегистрировать необходимый JDBC-драйвер, а затем получить соединение с базой данных. 59 | 60 | + `javax.sql.DataSource` - решает те же задачи, что и _DriverManager_, но более удобным и универсальным образом. Существуют также `javax.sql.ConnectionPoolDataSource` и `javax.sq1.XADataSource` задача которых - обеспечение поддержки пула соединений. 61 | 62 | + `java.sql.Connection` - обеспечивает формирование запросов к источнику данных и управление транзакциями. Также предусмотрены интерфейсы `javax.sql.PooledConnection` и `javax.sql.XAConnection`. 63 | 64 | + `java.sql.Statement` , `java.sql.PreparedStatement` и `java.sql.CallableStatement` - эти интерфейсы позволяют отправить запрос к источнику данных. 65 | 66 | + `java.sql.ResultSet` - объявляет методы, которые позволяют перемещаться по набору данных и считывать значения отдельных полей в текущей записи. 67 | 68 | + `java.sql.ResultSetMetaData` - позволяет получить информацию о структуре набора данных. 69 | 70 | + `java.sql.DatabaseMetaData` - позволяет получить информацию о структуре источника данных. 71 | 72 | [к оглавлению](#jdbc) 73 | 74 | ## Перечислите основные типы данных используемые в JDBC. Как они связаны с типами Java? 75 | 76 | | JDBC Type | Java Object Type | 77 | |---------------:|---------------------------| 78 | | __CHAR__ | `String` | 79 | | __VARCHAR__ | `String` | 80 | | __LONGVARCHAR__ | `String` | 81 | | __NUMERIC__ | `java.math.BigDecimal` | 82 | | __DECIMAL__ | `java.math.BigDecimal` | 83 | | __BIT__ | `Boolean` | 84 | | __TINYINT__ | `Integer` | 85 | | __SMALLINT__ | `Integer` | 86 | | __INTEGER__ | `Integer` | 87 | | __BIGINT__ | `Long` | 88 | | __REAL__ | `Float` | 89 | | __FLOAT__ | `Double` | 90 | | __DOUBLE__ | `Double` | 91 | | __BINARY__ | `byte[]` | 92 | | __VARBINARY__ | `byte[]` | 93 | | __LONGVARBINARY__ | `byte[]` | 94 | | __DATE__ | `java.sql.Date` | 95 | | __TIME__ | `java.sql.Time` | 96 | | __TIMESTAMP__ | `java.sql.Timestamp` | 97 | | __CLOB__ | `Clob` | 98 | | __BLOB__ | `Blob` | 99 | | __ARRAY__ | `Array` | 100 | | __STRUCT__ | `Struct`| 101 | | __REF__ | `Ref` | 102 | | __DISTINCT__ | сопоставление базового типа | 103 | | __JAVA_OBJECT__ | базовый класс Java | 104 | 105 | [к оглавлению](#jdbc) 106 | 107 | ## Опишите основные этапы работы с базой данных при использовании JDBC. 108 | + Регистрация драйверов; 109 | + Установление соединения с базой данных; 110 | + Создание запроса(ов) к базе данных; 111 | + Выполнение запроса(ов) к базе данных; 112 | + Обработка результата(ов); 113 | + Закрытие соединения с базой данных. 114 | 115 | [к оглавлению](#jdbc) 116 | 117 | ## Как зарегистрировать драйвер JDBC? 118 | Регистрацию драйвера можно осуществить несколькими способами: 119 | 120 | + `java.sql.DriverManager.registerDriver(%объект класса драйвера%)`. 121 | 122 | + `Class.forName(«полное имя класса драйвера»).newInstance()`. 123 | 124 | + `Class.forName(«полное имя класса драйвера»)`; 125 | 126 | [к оглавлению](#jdbc) 127 | 128 | ## Как установить соединение с базой данных? 129 | Для установки соединения с базой данных используется статический вызов `java.sql.DriverManager.getConnection(...)` . 130 | 131 | 132 | В качестве параметра может передаваться: 133 | 134 | + URL базы данных 135 | ```java 136 | static Connection getConnection(String url) 137 | ``` 138 | 139 | + URL базы данных и набор свойств для инициализации 140 | ```java 141 | static Connection getConnection(String url, Properties info) 142 | ``` 143 | 144 | + URL базы данных, имя пользователя и пароль 145 | ```java 146 | static Connection getConnection(String url, String user, String password) 147 | ``` 148 | 149 | В результате вызова будет установлено соединение с базой данных и создан объект класса `java.sql.Connection` - своеобразная «сессия», внутри контекста которой и будет происходить дальнейшая работа с базой данных. 150 | 151 | [к оглавлению](#jdbc) 152 | 153 | ## Какие уровни изоляции транзакций поддерживаются в JDBC? 154 | __Уровень изолированности транзакций__ — значение, определяющее уровень, при котором в транзакции допускаются несогласованные данные, то есть степень изолированности одной транзакции от другой. Более высокий уровень изолированности повышает точность данных, но при этом может снижаться количество параллельно выполняемых транзакций. С другой стороны, более низкий уровень изолированности позволяет выполнять больше параллельных транзакций, но снижает точность данных. 155 | 156 | Во время использования транзакций, для обеспечения целостности данных, СУБД использует блокировки, чтобы заблокировать доступ других обращений к данным, участвующим в транзакции. Такие блокировки необходимы, чтобы предотвратить: 157 | 158 | + _«грязное» чтение (dirty read)_ — чтение данных, добавленных или изменённых транзакцией, которая впоследствии не подтвердится (откатится); 159 | 160 | + _неповторяющееся чтение (non-repeatable read)_ — при повторном чтении в рамках одной транзакции ранее прочитанные данные оказываются изменёнными; 161 | 162 | + _фантомное чтение (phantom reads)_ — ситуация, когда при повторном чтении в рамках одной транзакции одна и та же выборка дает разные множества строк. 163 | 164 | Уровни изоляции транзакций определены в виде констант интерфейса `java.sql.Connection`: 165 | 166 | + `TRANSACTION_NONE` – драйвер не поддерживает транзакции; 167 | 168 | + `TRANSACTION_READ_UNCOMMITTED` – позволяет транзакциям видеть несохраненные изменения данных: разрешает грязное, непроверяющееся и фантомное чтения; 169 | 170 | + `TRANSACTION_READ_COMMITTED` – любое изменение, сделанное в транзакции, не видно вне неё, пока она не сохранена: предотвращает грязное чтение, но разрешает непроверяющееся и фантомное; 171 | 172 | + `TRANSACTION_REPEATABLE_READ` – запрещает грязное и непроверяющееся, фантомное чтение разрешено; 173 | 174 | + `TRANSACTION_SERIALIZABLE` – грязное, непроверяющееся и фантомное чтения запрещены. 175 | 176 | > __NB!__ Сервер базы данных может не поддерживать все уровни изоляции. Интерфейс `java.sql.DatabaseMetaData` предоставляет информацию об уровнях изолированности транзакций, которые поддерживаются данной СУБД. 177 | 178 | Уровень изоляции транзакции используемый СУБД можно задать с помощью метода `setTransactionIsolation()` объекта `java.sql.Connection`. Получить информацию о применяемом уровне изоляции поможет метод `getTransactionIsolation()`. 179 | 180 | [к оглавлению](#jdbc) 181 | 182 | ## При помощи чего формируются запросы к базе данных? 183 | 184 | Для выполнения запросов к базе данных в Java используются три интерфейса: 185 | 186 | + `java.sql.Statement` - для операторов SQL без параметров; 187 | + `java.sql.PreparedStatement` - для операторов SQL с параметрами и часто выполняемых операторов; 188 | + `java.sql.CallableStatement` - для исполнения хранимых в базе процедур. 189 | 190 | Объекты-носители интерфейсов создаются при помощи методов объекта `java.sql.Connection`: 191 | 192 | + `java.sql.createStatement()` возвращает объект _Statement_; 193 | + `java.sql.prepareStatement()` возвращает объект _PreparedStatement_; 194 | + `java.sql.prepareCall()` возвращает объект _CallableStatement_; 195 | 196 | [к оглавлению](#jdbc) 197 | 198 | ## Чем отличается Statement от PreparedStatement? 199 | + __Statement__: используется для простых случаев запроса без параметров. 200 | + __PreparedStatement__: предварительно компилирует запрос, который может содержать входные параметры и выполняться несколько раз с разным набором этих параметров. 201 | 202 | Перед выполнением СУБД разбирает каждый запрос, оптимизирует его и создает «план» (query plan) его выполнения. Если один и тот же запрос выполняется несколько раз, то СУБД в состоянии кэшировать план его выполнения и не производить этапов разборки и оптимизации повторно. Благодаря этому запрос выполняется быстрее. 203 | 204 | Суммируя: _PreparedStatement_ выгодно отличается от _Statement_ тем, что при повторном использовании с одним или несколькими наборами параметров позволяет получить преимущества заранее прекомпилированного и кэшированного запроса, помогая при этом избежать SQL Injection. 205 | 206 | [к оглавлению](#jdbc) 207 | 208 | ## Как осуществляется запрос к базе данных и обработка результатов? 209 | Выполнение запросов осуществляется при помощи вызова методов объекта, реализующего интерфейс `java.sql.Statement`: 210 | 211 | + __`executeQuery()`__ - для запросов, результатом которых является один набор значений, например запросов `SELECT`. Результатом выполнения является объект класса `java.sql.ResultSet`; 212 | 213 | + __`executeUpdate()`__ - для выполнения операторов `INSERT`, `UPDATE` или `DELETE`, а также для операторов _DDL (Data Definition Language)_. Метод возвращает целое число, показывающее, сколько записей было модифицировано; 214 | 215 | + __`execute()`__ – исполняет SQL-команды, которые могут возвращать различные результаты. Например, может использоваться для операции `CREATE TABLE`. Возвращает `true`, если первый результат содержит _ResultSet_ и `false`, если первый результат - это количество модифицированных записей или результат отсутствует. Чтобы получить первый результат необходимо вызвать метод `getResultSet()` или `getUpdateCount()`. Остальные результаты доступны через вызов `getMoreResults()`, который при необходимости может быть произведён многократно. 216 | 217 | Объект с интерфейсом `java.sql.ResultSet` хранит в себе результат запроса к базе данных - некий набор данных, внутри которого есть курсор, указывающий на один из элементов набора данных - текущую запись. 218 | 219 | Используя курсор можно перемещаться по набору данных при помощи метода `next()`. 220 | 221 | > __NB!__ Сразу после получения набора данных его курсор находится перед первой записью и чтобы сделать её текущей необходимо вызвать метод `next()`. 222 | 223 | Содержание полей текущей записи доступно через вызовы методов `getInt()`, `getFloat()`, `getString()`, `getDate()` и им подобных. 224 | 225 | [к оглавлению](#jdbc) 226 | 227 | ## Как вызвать хранимую процедуру? 228 | __Хранимые процедуры__ – это именованный набор операторов SQL хранящийся на сервере. Такую процедуру можно вызвать из Java-класса с помощью вызова методов объекта реализующего интерфейс `java.sql.Statement`. 229 | 230 | Выбор объекта зависит от характеристик хранимой процедуры: 231 | 232 | + без параметров → `Statement` 233 | + с входными параметрами → `PreparedStatement` 234 | + с входными и выходными параметрами → `CallableStatement` 235 | 236 | > Если неизвестно, как была определена хранимая процедура, для получения информации о хранимой процедуре (например, имен и типов параметров) можно использовать методы `java.sql.DatabaseMetaData` позволяющие получить информацию о структуре источника данных. 237 | 238 | Пример вызова хранимой процедуры с входными и выходными параметрами: 239 | 240 | ```java 241 | public vois runStoredProcedure(final Connection connection) throws Exception { 242 | // описываем хранимую процедуру 243 | String procedure = "{ call procedureExample(?, ?, ?) }"; 244 | 245 | // подготавливаем запрос 246 | CallableStatement cs = connection.prepareCall(procedure); 247 | 248 | // устанавливаем входные параметры 249 | cs.setString(1, "abcd"); 250 | cs.setBoolean(2, true); 251 | cs.setInt(3, 10); 252 | 253 | // описываем выходные параметры 254 | cs.registerOutParameter(1, java.sql.Types.VARCHAR); 255 | cs.registerOutParameter(2, java.sql.Types.INTEGER); 256 | 257 | // запускаем выполнение хранимой процедуры 258 | cs.execute(); 259 | 260 | // получаем результаты 261 | String parameter1 = cs.getString(1); 262 | int parameter2 = cs.getInt(2); 263 | 264 | // заканчиваем работу с запросом 265 | cs.close(); 266 | } 267 | ``` 268 | 269 | [к оглавлению](#jdbc) 270 | 271 | ## Как закрыть соединение с базой данных? 272 | Соединение с базой данной закрывается вызовом метода `close()` у соответствующего объекта `java.sql.Connection` или посредством использования механизма try-with-resources при создании такого объекта, появившегося в Java 7. 273 | 274 | > __NB!__ Предварительно необходимо закрыть все запросы созданные этим соединением. 275 | 276 | [к оглавлению](#jdbc) 277 | 278 | # Источники 279 | + [Википедия - JDBC](https://ru.wikipedia.org/wiki/Java_Database_Connectivity) 280 | + [IBM developerWorks®](http://www.ibm.com/developerworks/ru/library/dm-1209storedprocedures/) 281 | + [Документация к пакету java.sql](https://docs.oracle.com/javase/7/docs/api/java/sql/package-summary.html) 282 | + [Википедия - Уровень изолированности транзакции](https://ru.wikipedia.org/wiki/Уровень_изолированности_транзакций) 283 | 284 | [Вопросы для собеседования](README.md) 285 | -------------------------------------------------------------------------------- /log.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Журналирование 4 | + [Какие существуют типы логов?](#Какие-существуют-типы-логов) 5 | + [Из каких частей состоит система журналирования log4j?](#Из-каких-частей-состоит-система-журналирования-log4j) 6 | + [Что такое _Logger_ в log4j?](#Что-такое-logger-в-log4j) 7 | + [Что такое _Appender_ в log4j?](#Что-такое-appender-в-log4j) 8 | + [Что такое _Layout_ в log4j?](#Что-такое-layout-в-log4j) 9 | + [Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности.](#Перечислите-уровни-журналирования-в-log4j-Назовите-порядок-их-приоритетности) 10 | + [Какие существуют способы конфигурирования log4j?](#Какие-существуют-способы-конфигурирования-log4j) 11 | 12 | ## Какие существуют типы логов? 13 | + системы (System); 14 | + безопасности (Security); 15 | + приложения (Application, Buisness). 16 | 17 | > Пользователь входит в приложение, проверяется пароль. Это действие относится к безопасности (Security). Дальше он запускает какой-нибудь модуль. Это событие уровня приложения (Application). Модуль при старте обращается к другому модулю за какими-то дополнительными данными, производит какие-либо еще вызовы – это уже системные действия (System). 18 | 19 | [к оглавлению](#Журналирование) 20 | 21 | ## Из каких частей состоит система журналирования log4j? 22 | Система журналирования состоит из трёх основных частей: 23 | 24 | + управляющей журналированием - __logger__; 25 | + добавляющей в журнал - __appender__; 26 | + определяющей формат добавления - __layout__. 27 | 28 | [к оглавлению](#Журналирование) 29 | 30 | ## Что такое _Logger_ в log4j? 31 | __Logger__ представляет собой объект класса `org.apache.log4j.Logger`, который используется как управляющий интерфейс для журналирования сообщений с возможностью задавать уровень детализации. Именно logger проверяет нужно ли обрабатывать сообщение и если журналирование необходимо, то сообщение передаётся в appender, если нет - система завершает обработку данного сообщения. 32 | 33 | [к оглавлению](#Журналирование) 34 | 35 | ## Что такое _Appender_ в log4j? 36 | __Appender__ - это именованный объект журнала событий, реализующий интерфейс `org.apache.log4j.Appender` и добавляющий события в журнал. Appender вызывает разные вспомогательные инструменты - компоновщик, фильтр, обработчик ошибок (если они определены и необходимы). В ходе этой работы окончательно устанавливается необходимость записи сообщения, сообщению придаются окончательные содержание и форма. 37 | 38 | В log4j журнал может представлять: 39 | 40 | + консоль; 41 | + файл; 42 | + сокет; 43 | + объект класса реализующего `java.io.Writer` или `java.io.OutputStream`; 44 | + JDBC хранилище; 45 | + тему (topic) JMS; 46 | + NT Event Log; 47 | + SMTP; 48 | + Syslog; 49 | + Telnet. 50 | 51 | Наиболее часто используемые log4j appender-ы: 52 | 53 | + `org.apache.log4j.ConsoleAppender` - вывод в консоль; 54 | + `org.apache.log4j.FileAppender` - добавление в файл; 55 | + `org.apache.log4j.DailyRollingFileAppender` - добавление в файл с обновлением файла через заданный промежуток времени; 56 | + `org.apache.log4j.RollingFileAppender` - добавление в файл с обновлением файла по достижению определенного размера; 57 | + `org.apache.log4j.varia.ExternallyRolledFileAppender` - расширение _RollingFileAppender_ обновляющее файл по команде принятой с заданного порта; 58 | + `org.apache.log4j.net.SMTPAppender` - сообщение по SMTP; 59 | + `org.apache.log4j.AsyncAppender` - позволяет, используя отдельный поток, организовать асинхронную работу, когда сообщения фиксируются лишь при достижении определенного уровня заполненности промежуточного буфера. 60 | + `org.apache.log4j.nt.NTEventLogAppender` - добавление в NT Event Log; 61 | + `org.apache.log4j.net.SyslogAppender` - добавление в Syslog; 62 | + `org.apache.log4j.jdbc.JDBCAppender` - запись в хранилище JDBC; 63 | + `org.apache.log4j.lf5.LF5Appender` - сообщение передаётся в специальный GUI интерфейс LogFactor5 64 | + `org.apache.log4j.net.SocketAppender` - трансляция сообщения по указанному адресу и порту; 65 | + `org.apache.log4j.net.SocketHubAppender` - рассылка сообщения сразу нескольким удалённым серверам соединённым по заданному порту; 66 | + `org.apache.log4j.net.TelnetAppender` - отсылка сообщения по протоколу Telenet; 67 | + `org.apache.log4j.net.JMSAppender` - добавление сообщения в JMS. 68 | 69 | [к оглавлению](#Журналирование) 70 | 71 | ## Что такое _Layout_ в log4j? 72 | __Layout__ - наследник класса `org.apache.log4j.Layout` предоставляющий возможность форматирования сообщения перед добавлением в журнал. 73 | 74 | В log4j существуют следующие типы layout-ов: 75 | 76 | + `org.apache.log4j.SimpleLayout` - на выходе получается строка содержащая лишь уровень вывода и сообщение; 77 | + `org.apache.log4j.HTMLLayout` - форматирует сообщение в виде элемента HTML-таблицы; 78 | + `org.apache.log4j.xml.XMLLayout` - компанует сообщение в виде XML формате; 79 | + `org.apache.log4j.TTCCLayout` - на выходе сообщение дополняется информацией о времени, потоке, имени логгера и вложенном диагностическом контексте; 80 | + `org.apache.log4j.PatternLayout` / `org.apache.log4j.EnhancedPatternLayout` - настройка форматирования сообщения при помощи шаблона заданного пользователем. 81 | 82 | [к оглавлению](#Журналирование) 83 | 84 | ## Перечислите уровни журналирования в log4j? Назовите порядок их приоритетности. 85 | + __OFF__ - отсутствие журналирования; 86 | + __FATAL__ - фатальная ошибка; 87 | + __ERROR__ - ошибка; 88 | + __WARN__ - предупреждение; 89 | + __INFO__ - информация; 90 | + __DEBUG__ - детальная информация для отладки; 91 | + __TRACE__ – трассировка всех сообщений. 92 | 93 | Между уровнями логирования установлен следующий порядок приоритетов: 94 | 95 | `OFF < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < ALL` 96 | 97 | [к оглавлению](#Журналирование) 98 | 99 | ## Какие существуют способы конфигурирования log4j? 100 | Для того, чтобы log4j начал работать нужно предоставить ему конфигурацию. Это можно сделать несколькими путями: 101 | 102 | + Создать конфигурацию программно, т.е. получить logger, определить уровень журналирования, прикрепить appender и задать способ форматирования. 103 | + Указать файл или URL как аргумент при запуске java-машины `-Dlog4j.configuration=путь/к/файлу/конфигурации`, а затем прочитать его в программе при помощи `PropertyConfigurator.configure(...)`/ `DOMConfigurator.configure(...)` для формата `.properties` или `XML` соответственно. 104 | + Загрузить конфигурацию из файла в формате `XML` или `.properties`: log4j ищет файл конфигурации в classpath. Сначала ищется файл `log4j.xml` и, если таковой не найден, - файл `log4j.properties`. 105 | 106 | [к оглавлению](#Журналирование) 107 | 108 | # Источники 109 | + [Quizful](http://www.quizful.net/) 110 | + [Skipy](http://skipy.ru/useful/logging.html#log4j_concepts_logger) 111 | 112 | [Вопросы для собеседования](README.md) 113 | -------------------------------------------------------------------------------- /mcon.bat: -------------------------------------------------------------------------------- 1 | @java -jar con4md.jar --marker="##" %* -------------------------------------------------------------------------------- /mcon.sh: -------------------------------------------------------------------------------- 1 | java -jar con4md.jar --marker="##" $@ 2 | -------------------------------------------------------------------------------- /oop.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # ООП 4 | + [Что такое _ООП_?](#Что-такое-ООП) 5 | + [Назовите основные принципы _ООП_.](#Назовите-основные-принципы-ООП) 6 | + [Что такое _«инкапсуляция»_?](#Что-такое-инкапсуляция) 7 | + [Что такое _«наследование»_?](#Что-такое-наследование) 8 | + [Что такое _«полиморфизм»_?](#Что-такое-полиморфизм) 9 | + [Что такое _«абстракция»_?](#Что-такое-абстракция) 10 | + [Что представляет собой _«обмен сообщениями»_?](#Что-представляет-собой-обмен-сообщениями) 11 | + [Расскажите про основные понятия ООП: _«класс»_, _«объект»_, _«интерфейс»_.](#Расскажите-про-основные-понятия-ООП-класс-объект-интерфейс) 12 | + [В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании?](#В-чем-заключаются-преимущества-и-недостатки-объектно-ориентированного-подхода-в-программировании) 13 | + [Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_?](#Что-подразумевают-в-плане-принципов-ООП-выражения-является-и-имеет) 14 | + [В чем разница между _композицией_ и _агрегацией_?](#В-чем-разница-между-композицией-и-агрегацией) 15 | + [Что такое _статическое_ и _динамическое связывание_?](#Что-такое-статическое-и-динамическое-связывание) 16 | 17 | ## Что такое _ООП_? 18 | __Объектно-ориентированное программирование (ООП)__ — методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. 19 | 20 | + объектно-ориентированное программирование использует в качестве основных логических конструктивных элементов объекты, а не алгоритмы; 21 | + каждый объект является экземпляром определенного класса 22 | + классы образуют иерархии. 23 | 24 | Программа считается объектно-ориентированной, только если выполнены все три указанных требования. В частности, программирование, не использующее наследование, называется не объектно-ориентированным, а программированием с помощью абстрактных типов данных. 25 | 26 | Согласно парадигме ООП программа состоит из объектов, обменивающихся сообщениями. Объекты могут обладать состоянием, единственный способ изменить состояние объекта - послать ему сообщение, в ответ на которое, объект может изменить собственное состояние. 27 | 28 | [к оглавлению](#ООП) 29 | 30 | ## Назовите основные принципы _ООП_. 31 | + _Инкапсуляция_ - сокрытие реализации. 32 | + _Наследование_ - создание новой сущности на базе уже существующей. 33 | + _Полиморфизм_ - возможность иметь разные формы для одной и той же сущности. 34 | + _Абстракция_ - набор общих характеристик. 35 | + _Посылка сообщений_ - форма связи, взаимодействия между сущностями. 36 | + _Переиспользование_- все что перечислено выше работает на повторное использование кода. 37 | 38 | Это единственно верный порядок парадигм ООП, так как каждая последующая использует предыдущие. 39 | 40 | [к оглавлению](#ООП) 41 | 42 | ## Что такое _«инкапсуляция»_? 43 | __Инкапсуляция__ – это свойство системы, позволяющее объединить данные и методы, работающие с ними, в классе и скрыть детали реализации от пользователя, открыв только то, что необходимо при последующем использовании. 44 | 45 | Цель инкапсуляции — уйти от зависимости внешнего интерфейса класса (то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. 46 | 47 | >Представим на минутку, что мы оказались в конце позапрошлого века, когда Генри Форд ещё не придумал конвейер, а первые попытки создать автомобиль сталкивались с критикой властей по поводу того, что эти коптящие монстры загрязняют воздух и пугают лошадей. Представим, что для управления первым паровым автомобилем необходимо было знать, как устроен паровой котёл, постоянно подбрасывать уголь, следить за температурой, уровнем воды. При этом для поворота колёс использовать два рычага, каждый из которых поворачивает одно колесо в отдельности. Думаю, можно согласиться с тем, что вождение автомобиля того времени было весьма неудобным и трудным занятием. 48 | 49 | >Теперь вернёмся в сегодняшний день к современным чудесам автопрома с коробкой-автоматом. На самом деле, по сути, ничего не изменилось. Бензонасос всё так же поставляет бензин в двигатель, дифференциалы обеспечивают поворот колёс на различающиеся углы, коленвал превращает поступательное движение поршня во вращательное движение колёс. Прогресс в другом. Сейчас все эти действия скрыты от пользователя и позволяют ему крутить руль и нажимать на педаль газа, не задумываясь, что в это время происходит с инжектором, дроссельной заслонкой и распредвалом. Именно сокрытие внутренних процессов, происходящих в автомобиле, позволяет эффективно его использовать даже тем, кто не является профессионалом-автомехаником с двадцатилетним стажем. Это сокрытие в ООП носит название инкапсуляции. 50 | 51 | [к оглавлению](#ООП) 52 | 53 | ## Что такое _«наследование»_? 54 | __Наследование__ – это свойство системы, позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью. 55 | 56 | Класс, от которого производится наследование, называется _предком_, _базовым_ или _родительским_. Новый класс – _потомком_, _наследником_ или _производным_ классом. 57 | 58 | >Представим себя, на минуту, инженерами автомобильного завода. Нашей задачей является разработка современного автомобиля. У нас уже есть предыдущая модель, которая отлично зарекомендовала себя в течение многолетнего использования. Всё бы хорошо, но времена и технологии меняются, а наш современный завод должен стремиться повышать удобство и комфорт выпускаемой продукции и соответствовать современным стандартам. 59 | 60 | >Нам необходимо выпустить целый модельный ряд автомобилей: седан, универсал и малолитражный хэтч-бэк. Очевидно, что мы не собираемся проектировать новый автомобиль с нуля, а, взяв за основу предыдущее поколение, внесём ряд конструктивных изменений. Например, добавим гидроусилитель руля и уменьшим зазоры между крыльями и крышкой капота, поставим противотуманные фонари. Кроме того, в каждой модели будет изменена форма кузова. 61 | 62 | >Очевидно, что все три модификации будут иметь большинство свойств прежней модели (старый добрый двигатель 1970 года, непробиваемая ходовая часть, зарекомендовавшая себя отличным образом на отечественных дорогах, коробку передач и т.д.). При этом каждая из моделей будет реализовать некоторую новую функциональность или конструктивную особенность. В данном случае, мы имеем дело с наследованием. 63 | 64 | [к оглавлению](#ООП) 65 | 66 | ## Что такое _«полиморфизм»_? 67 | __Полиморфизм__ – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. 68 | 69 | Преимуществом полиморфизма является то, что он помогает снижать сложность программ, разрешая использование одного и того же интерфейса для задания единого набора действий. Выбор же конкретного действия, в зависимости от ситуации, возлагается на компилятор языка программирования. Отсюда следует ключевая особенность полиморфизма - использование объекта производного класса, вместо объекта базового (потомки могут изменять родительское поведение, даже если обращение к ним будет производиться по ссылке родительского типа). 70 | 71 | >Любое обучение вождению не имело бы смысла, если бы человек, научившийся водить, скажем, ВАЗ 2106 не мог потом водить ВАЗ 2110 или BMW X3. С другой стороны, трудно представить человека, который смог бы нормально управлять автомобилем, в котором педаль газа находится левее педали тормоза, а вместо руля – джойстик. 72 | 73 | >Всё дело в том, что основные элементы управления автомобиля имеют одну и ту же конструкцию и принцип действия. Водитель точно знает, что для того, чтобы повернуть налево, он должен повернуть руль, независимо от того, есть там гидроусилитель или нет. 74 | Если человеку надо доехать с работы до дома, то он сядет за руль автомобиля и будет выполнять одни и те же действия, независимо от того, какой именно тип автомобиля он использует. По сути, можно сказать, что все автомобили имеют один и тот же интерфейс, а водитель, абстрагируясь от сущности автомобиля, работает именно с этим интерфейсом. Если водителю предстоит ехать по немецкому автобану, он, вероятно выберет быстрый автомобиль с низкой посадкой, а если предстоит возвращаться из отдалённого маральника в Горном Алтае после дождя, скорее всего, будет выбран УАЗ с армейскими мостами. Но, независимо от того, каким образом будет реализовываться движение и внутреннее функционирование машины, интерфейс останется прежним. 75 | 76 | _Полиморфная переменная_, это переменная, которая может принимать значения разных типов, а _полиморфная функция_, это функция у которой хотя бы один аргумент является полиморфной переменной. 77 | Выделяют два вида полиморфных функций: 78 | 79 | + _ad hoc_, функция ведет себя по разному для разных типов аргументов (например, функция `draw()` — рисует по разному фигуры разных типов); 80 | + _параметрический_, функция ведет себя одинаково для аргументов разных типов (например, функция `add()` — одинаково кладет в контейнер элементы разных типов). 81 | 82 | [к оглавлению](#ООП) 83 | 84 | ## Что такое _«абстракция»_? 85 | _Абстрагирование_ – это способ выделить набор общих характеристик объекта, исключая из рассмотрения частные и незначимые. Соответственно, __абстракция__ – это набор всех таких характеристик. 86 | 87 | >Представьте, что водитель едет в автомобиле по оживлённому участку движения. Понятно, что в этот момент он не будет задумываться о химическом составе краски автомобиля, особенностях взаимодействия шестерёнок в коробке передач или влияния формы кузова на скорость (разве что, автомобиль стоит в глухой пробке и водителю абсолютно нечем заняться). Однако, руль, педали, указатель поворота он будет использовать регулярно. 88 | 89 | [к оглавлению](#ООП) 90 | 91 | ## Что представляет собой _«обмен сообщениями»_? 92 | Объекты взаимодействуют, посылая и получая сообщения. Сообщение — это запрос на выполнение действия, дополненный набором аргументов, которые могут понадобиться при выполнении действия. В ООП посылка сообщения (вызов метода) — это единственный путь передать управление объекту. Если объект должен «отвечать» на это сообщение, то у него должна иметься соответствующий данному сообщению метод. Так же объекты, используя свои методы, могут и сами посылать сообщения другим объектам. Обмен сообщениями реализуется с помощью динамических вызовов, что приводит к чрезвычайно позднему связыванию (extreme late binding). 93 | 94 | >Пусть требуется создать физическую модель, описывающую сталкивающиеся шары разных размеров. Традиционный подход к решению этой задачи примерно таков: определяется набор данных, описывающих каждый шар (например, его координаты, массу и ускорение); каждому шару присваивается уникальный идентификатор (например, организуется массив, значение индекса которого соответствует номеру шара), который позволит отличать каждый из шаров от всех других. Наконец, пишется подпрограмма с названием, скажем, `bounce`; эта процедура должна на основе номера шара и его начальных параметров соответствующим образом изменять данные, описывающие шар. В отличие от традиционного подхода объектно-ориентированная версия программы моделирует каждый из шаров посредством объекта. При этом объект, соответствующий конкретному шару, содержит не только его параметры, но и весь код, описывающий поведение шара при различных взаимодействиях. Так, каждый шар будет иметь собственный метод `bounce()`. Вместо того, чтобы вызывать подпрограмму `bounce` с аргументом, определяющим, скажем, шар №3, необходимо будет передать объекту «шар №3» сообщение, предписывающее ему выполнить столкновение. 95 | 96 | [к оглавлению](#ООП) 97 | 98 | ## Расскажите про основные понятия ООП: _«класс»_, _«объект»_, _«интерфейс»_. 99 | __Класс__ – это способ описания сущности, определяющий состояние и поведение, зависящее от этого состояния, а также правила для взаимодействия с данной сущностью (контракт). 100 | 101 | С точки зрения программирования класс можно рассматривать как набор данных (полей, атрибутов, членов класса) и функций для работы с ними (методов). 102 | 103 | С точки зрения структуры программы, класс является сложным типом данных. 104 | 105 | __Объект (экземпляр)__ – это отдельный представитель класса, имеющий конкретное состояние и поведение, полностью определяемое классом. Каждый объект имеет конкретные значения атрибутов и методы, работающие с этими значениями на основе правил, заданных в классе. 106 | 107 | __Интерфейс__ – это набор методов класса, доступных для использования. Интерфейсом класса будет являться набор всех его публичных методов в совокупности с набором публичных атрибутов. По сути, интерфейс специфицирует класс, чётко определяя все возможные действия над ним. 108 | 109 | [к оглавлению](#ООП) 110 | 111 | ## В чем заключаются преимущества и недостатки объектно-ориентированного подхода в программировании? 112 | Преимущества: 113 | 114 | + Объектная модель вполне естественна, поскольку в первую очередь ориентирована на человеческое восприятие мира, а не на компьютерную реализацию. 115 | + Классы позволяют проводить конструирование из полезных компонентов, обладающих простыми инструментами, что позволяет абстрагироваться от деталей реализации. 116 | + Данные и операции над ними образуют определенную сущность, и они не разносятся по всей программе, как нередко бывает в случае процедурного программирования, а описываются вместе. Локализация кода и данных улучшает наглядность и удобство сопровождения программного обеспечения. 117 | + Инкапсуляция позволяет привнести свойство модульности, что облегчает распараллеливание выполнения задачи между несколькими исполнителями и обновление версий отдельных компонентов. 118 | + Возможность создавать расширяемые системы. 119 | + Использование полиморфизма оказывается полезным при: 120 | + Обработке разнородных структур данных. Программы могут работать, не различая вида объектов, что существенно упрощает код. Новые виды могут быть добавлены в любой момент. 121 | + Изменении поведения во время исполнения. На этапе исполнения один объект может быть заменен другим, что позволяет легко, без изменения кода, адаптировать алгоритм в зависимости от того, какой используется объект. 122 | + Реализации работы с наследниками. Алгоритмы можно обобщить настолько, что они уже смогут работать более чем с одним видом объектов. 123 | + Возможности описать независимые от приложения части предметной области в виде набора универсальных классов, или фреймворка, который в дальнейшем будет расширен за счет добавления частей, специфичных для конкретного приложения. 124 | + Повторное использование кода: 125 | + Сокращается время на разработку, которое может быть отдано другим задачам. 126 | + Компоненты многоразового использования обычно содержат гораздо меньше ошибок, чем вновь разработанные, ведь они уже не раз подвергались проверке. 127 | + Когда некий компонент используется сразу несколькими клиентами, улучшения, вносимые в его код, одновременно оказывают положительное влияние и на множество работающих с ним программ. 128 | + Если программа опирается на стандартные компоненты, ее структура и пользовательский интерфейс становятся более унифицированными, что облегчает ее понимание и упрощает использование. 129 | 130 | Недостатки: 131 | 132 | + В сложных иерархиях классов поля и методы обычно наследуются с разных уровней. И не всегда легко определить, какие поля и методы фактически относятся к данному классу. 133 | + Код для обработки сообщения иногда «размазан» по многим методам (иначе говоря, обработка сообщения требует не одного, а многих методов, которые могут быть описаны в разных классах). 134 | + Документирование классов - задача более трудная, чем это было в случае процедур и модулей. Поскольку любой метод может быть переопределен, в документации должно говориться не только о том, что делает данный метод, но и о том, в каком контексте он вызывается. 135 | + Неэффективность и неэкономное распределения памяти на этапе выполнения (по причине издержек на динамическое связывание и проверки типов на этапе выполнения). 136 | + Излишняя универсальность. Часто содержится больше методов, чем это реально необходимо текущей программе. А поскольку лишние методы не могут быть удалены, они становятся мертвым грузом. 137 | 138 | [к оглавлению](#ООП) 139 | 140 | ## Что подразумевают в плане принципов ООП выражения _«является»_ и _«имеет»_? 141 | __«является»__ подразумевает наследование. 142 | __«имеет»__ подразумевает ассоциацию (агрегацию или композицию). 143 | 144 | [к оглавлению](#ООП) 145 | 146 | ## В чем разница между _композицией_ и _агрегацией_? 147 | Ассоциация обозначает связь между объектами. Композиция и агрегация — частные случаи ассоциации «часть-целое». 148 | 149 | Агрегация предполагает, что объекты связаны взаимоотношением «part-of» (часть). Композиция более строгий вариант агрегации. Дополнительно к требованию «part-of» накладывается условие, что экземпляр «части» может входить только в одно целое (или никуда не входить), в то время как в случае агрегации экземпляр «части» может входить в несколько целых. 150 | 151 | >Например, книга состоит из страниц и мы не можем вырвать страницу из книги и вложить в другую книгу. Страницы четко привязаны к конкретной книге, поэтому это композиция. 152 | В тоже время мы можем взять и перенести книгу из одной библиотеки в другую - это уже агрегация. 153 | 154 | [к оглавлению](#ООП) 155 | 156 | ## Что такое _статическое_ и _динамическое связывание_? 157 | Присоединение вызова метода к телу метода называется связыванием. Если связывание проводится компилятором (компоновщиком) перед запуском программы, то оно называется _статическим_ или _ранним связыванием (early binding)_. 158 | 159 | В свою очередь, _позднее связывание (late binding)_ это связывание, проводимое непосредственно во время выполнения программы, в зависимости от типа объекта. Позднее связывание также называют _динамическим (dynamic)_ или _связыванием на стадии выполнения (runtime binding)_. В языках, реализующих позднее связывание, должен существовать механизм определения фактического типа объекта во время работы программы, для вызова подходящего метода. Иначе говоря, компилятор не знает тип объекта, но механизм вызова методов определяет его и вызывает соответствующее тело метода. Механизм позднего связывания зависит от конкретного языка, но нетрудно предположить, что для его реализации в объекты должна включаться какая-то дополнительная информация. 160 | 161 | Для всех методов Java используется механизм позднего (динамического) связывания, если только метод не был объявлен как `final` (приватные методы являются `final` по умолчанию). 162 | 163 | [к оглавлению](#ООП) 164 | 165 | # Источники 166 | + [DevColibri](http://devcolibri.com/720) 167 | + [Хабрахабр](https://habrahabr.ru/post/87119/) 168 | + [Википедия](https://ru.wikipedia.org/wiki/Объектно-ориентированное_программирование) 169 | 170 | [Вопросы для собеседования](README.md) 171 | -------------------------------------------------------------------------------- /patterns.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Шаблоны проектирования 4 | + [Что такое _«шаблон проектирования»_?](#Что-такое-шаблон-проектирования) 5 | + [Назовите основные характеристики шаблонов.](#Назовите-основные-характеристики-шаблонов) 6 | + [Типы шаблонов проектирования.](#Типы-шаблонов-проектирования) 7 | + [Приведите примеры основных шаблонов проектирования.](#Приведите-примеры-основных-шаблонов-проектирования) 8 | + [Приведите примеры порождающих шаблонов проектирования.](#Приведите-примеры-порождающих-шаблонов-проектирования) 9 | + [Приведите примеры структурных шаблонов проектирования.](#Приведите-примеры-структурных-шаблонов-проектирования) 10 | + [Приведите примеры поведенческих шаблонов проектирования.](#Приведите-примеры-поведенческих-шаблонов-проектирования) 11 | + [Что такое _«антипаттерн»_? Какие антипаттерны вы знаете?](#Что-такое-антипаттерн-Какие-антипаттерны-вы-знаете) 12 | + [Что такое _Dependency Injection_?](#Что-такое-dependency-injection) 13 | 14 | ## Что такое _«шаблон проектирования»_? 15 | __Шаблон (паттерн) проектирования (design pattern)__ — это проверенное и готовое к использованию решение. Это не класс и не библиотека, которую можно подключить к проекту, это нечто большее - он не зависит от языка программирования, не является законченным образцом, который может быть прямо преобразован в код и может быть реализован по разному в разных языках программирования. 16 | 17 | Плюсы использования шаблонов: 18 | + снижение сложности разработки за счёт готовых абстракций для решения целого класса проблем. 19 | + облегчение коммуникации между разработчиками, позволяя ссылаться на известные шаблоны. 20 | + унификация деталей решений: модулей и элементов проекта. 21 | + возможность отыскав удачное решение, пользоваться им снова и снова. 22 | + помощь в выборе выбрать наиболее подходящего варианта проектирования. 23 | 24 | Минусы: 25 | + слепое следование некоторому выбранному шаблону может привести к усложнению программы. 26 | + желание попробовать некоторый шаблон в деле без особых на то оснований. 27 | 28 | [к оглавлению](#Шаблоны-проектирования) 29 | 30 | ## Назовите основные характеристики шаблонов. 31 | + __Имя__ - все шаблоны имеют уникальное имя, служащее для их идентификации; 32 | + __Назначение__ назначение данного шаблона; 33 | + __Задача__ - задача, которую шаблон позволяет решить; 34 | + __Способ решения__ - способ, предлагаемый в шаблоне для решения задачи в том контексте, где этот шаблон был найден; 35 | + __Участники__ - сущности, принимающие участие в решении задачи; 36 | + __Следствия__ - последствия от использования шаблона как результат действий, выполняемых в шаблоне; 37 | + __Реализация__ - возможный вариант реализации шаблона. 38 | 39 | [к оглавлению](#Шаблоны-проектирования) 40 | 41 | ## Типы шаблонов проектирования. 42 | + Основные (Fundamental) - основные строительные блоки других шаблонов. Большинство других шаблонов использует эти шаблоны в той или иной форме. 43 | + Порождающие шаблоны (Creational) — шаблоны проектирования, которые абстрагируют процесс создание экземпляра. Они позволяют сделать систему независимой от способа создания, композиции и представления объектов. Шаблон, порождающий классы, использует наследование, чтобы изменять созданный объект, а шаблон, порождающий объекты, делегирует создание объектов другому объекту. 44 | + Структурные шаблоны (Structural) определяют различные сложные структуры, которые изменяют интерфейс уже существующих объектов или его реализацию, позволяя облегчить разработку и оптимизировать программу. 45 | + Поведенческие шаблоны (Behavioral) определяют взаимодействие между объектами, увеличивая таким образом его гибкость. 46 | 47 | [к оглавлению](#Шаблоны-проектирования) 48 | 49 | ## Приведите примеры основных шаблонов проектирования. 50 | + __Делегирование (Delegation pattern)__ - Сущность внешне выражает некоторое поведение, но в реальности передаёт ответственность за выполнение этого поведения связанному объекту. 51 | + __Функциональный дизайн (Functional design)__ - Гарантирует, что каждая сущность имеет только одну обязанность и исполняет её с минимумом побочных эффектов на другие. 52 | + __Неизменяемый интерфейс (Immutable interface)__ - Создание неизменяемого объекта. 53 | + __Интерфейс (Interface)__ - Общий метод структурирования сущностей облегчающий их понимание. 54 | + __Интерфейс-маркер (Marker interface)__ - В качестве атрибута (как пометки объектной сущности) применяется наличие или отсутствие реализации интерфейса-маркера. В современных языках программирования вместо этого применяются атрибуты или аннотации. 55 | + __Контейнер свойств (Property container)__ - Позволяет добавлять дополнительные свойства сущности в контейнер внутри себя, вместо расширения новыми свойствами. 56 | + __Канал событий (Event channel)__ - Создаёт централизованный канал для событий. Использует сущность-представитель для подписки и сущность-представитель для публикации события в канале. Представитель существует отдельно от реального издателя или подписчика. Подписчик может получать опубликованные события от более чем одной сущности, даже если он зарегистрирован только на одном канале. 57 | 58 | [к оглавлению](#Шаблоны-проектирования) 59 | 60 | ## Приведите примеры порождающих шаблонов проектирования. 61 | + __Абстрактная фабрика (Abstract factory)__ - Класс, который представляет собой интерфейс для создания других классов. 62 | + __Строитель (Builder)__ - Класс, который представляет собой интерфейс для создания сложного объекта. 63 | + __Фабричный метод (Factory method)__ - Делегирует создание объектов наследникам родительского класса. Это позволяет использовать в коде программы не специфические классы, а манипулировать абстрактными объектами на более высоком уровне. 64 | + __Прототип (Prototype)__ - Определяет интерфейс создания объекта через клонирование другого объекта вместо создания через конструктор. 65 | + __Одиночка (Singleton)__ - Класс, который может иметь только один экземпляр. 66 | 67 | [к оглавлению](#Шаблоны-проектирования) 68 | 69 | ## Приведите примеры структурных шаблонов проектирования. 70 | + __Адаптер (Adapter)__ - Объект, обеспечивающий взаимодействие двух других объектов, один из которых использует, а другой предоставляет несовместимый с первым интерфейс. 71 | + __Мост (Bridge)__ - Структура, позволяющая изменять интерфейс обращения и интерфейс реализации класса независимо. 72 | + __Компоновщик (Composite)__ - Объект, который объединяет в себе объекты, подобные ему самому. 73 | + __Декоратор (Decorator)__ - Класс, расширяющий функциональность другого класса без использования наследования. 74 | + __Фасад (Facade)__ - Объект, который абстрагирует работу с несколькими классами, объединяя их в единое целое. 75 | + __Приспособленец (Flyweight)__ - Это объект, представляющий себя как уникальный экземпляр в разных местах программы, но по факту не являющийся таковым. 76 | + __Заместитель (Proxy)__ - Объект, который является посредником между двумя другими объектами, и который реализует/ограничивает доступ к объекту, к которому обращаются через него. 77 | 78 | [к оглавлению](#Шаблоны-проектирования) 79 | 80 | ## Приведите примеры поведенческих шаблонов проектирования. 81 | + __Цепочка обязанностей (Chain of responsibility)__ - Предназначен для организации в системе уровней ответственности. 82 | + __Команда (Command)__ - Представляет действие. Объект команды заключает в себе само действие и его параметры. 83 | + __Интерпретатор (Interpreter)__ - Решает часто встречающуюся, но подверженную изменениям, задачу. 84 | + __Итератор (Iterator)__ - Представляет собой объект, позволяющий получить последовательный доступ к элементам объекта-агрегата без использования описаний каждого + __из объектов, входящих в состав агрегации. 85 | + __Посредник (Mediator)__ - Обеспечивает взаимодействие множества объектов, формируя при этом слабую связанность и избавляя объекты от необходимости явно ссылаться друг на друга. 86 | + __Хранитель (Memento)__ - Позволяет не нарушая инкапсуляцию зафиксировать и сохранить внутренние состояния объекта так, чтобы позднее восстановить его в этих состояниях. 87 | + __Наблюдатель (Observer)__ - Определяет зависимость типа «один ко многим» между объектами таким образом, что при изменении состояния одного объекта все зависящие от него оповещаются об этом событии. 88 | + __Состояние (State)__ - Используется в тех случаях, когда во время выполнения программы объект должен менять своё поведение в зависимости от своего состояния. 89 | + __Стратегия (Strategy)__ - Предназначен для определения семейства алгоритмов, инкапсуляции каждого из них и обеспечения их взаимозаменяемости. 90 | + __Шаблонный метод (Template method)__ - Определяет основу алгоритма и позволяет наследникам переопределять некоторые шаги алгоритма, не изменяя его структуру в целом. 91 | + __Посетитель (Visitor)__ - Описывает операцию, которая выполняется над объектами других классов. При изменении класса Visitor нет необходимости изменять обслуживаемые классы. 92 | 93 | [к оглавлению](#Шаблоны-проектирования) 94 | 95 | ## Что такое _«антипаттерн»_? Какие антипаттерны вы знаете? 96 | __Антипаттерн (anti-pattern)__ — это распространённый подход к решению класса часто встречающихся проблем, являющийся неэффективным, рискованным или непродуктивным. 97 | 98 | __Poltergeists (полтергейсты)__ - это классы с ограниченной ответственностью и ролью в системе, чьё единственное предназначение — передавать информацию в другие классы. Их эффективный жизненный цикл непродолжителен. Полтергейсты нарушают стройность архитектуры программного обеспечения, создавая избыточные (лишние) абстракции, они чрезмерно запутанны, сложны для понимания и трудны в сопровождении. Обычно такие классы задумываются как классы-контроллеры, которые существуют только для вызова методов других классов, зачастую в предопределенной последовательности. 99 | 100 | Признаки появления и последствия антипаттерна 101 | + Избыточные межклассовые связи. 102 | + Временные ассоциации. 103 | + Классы без состояния (содержащие только методы и константы). 104 | + Временные объекты и классы (с непродолжительным временем жизни). 105 | + Классы с единственным методом, который предназначен только для создания или вызова других классов посредством временной ассоциации. 106 | + Классы с именами методов в стиле «управления», такие как startProcess. 107 | 108 | Типичные причины 109 | + Отсутствие объектно-ориентированной архитектуры (архитектор не понимает объектно-ориентированной парадигмы). 110 | + Неправильный выбор пути решения задачи. 111 | + Предположения об архитектуре приложения на этапе анализа требований (до объектно-ориентированного анализа) могут также вести к проблемам на подобии этого антипаттерна. 112 | 113 | __Внесенная сложность (Introduced complexity)__: Необязательная сложность дизайна. Вместо одного простого класса выстраивается целая иерархия интерфейсов и классов. Типичный пример «Интерфейс - Абстрактный класс - Единственный класс реализующий интерфейс на основе абстрактного». 114 | 115 | __Инверсия абстракции (Abstraction inversion)__: Сокрытие части функциональности от внешнего использования, в надежде на то, что никто не будет его использовать. 116 | 117 | __Неопределённая точка зрения (Ambiguous viewpoint)__: Представление модели без спецификации её точки рассмотрения. 118 | 119 | __Большой комок грязи (Big ball of mud)__: Система с нераспознаваемой структурой. 120 | 121 | __Божественный объект (God object)__: Концентрация слишком большого количества функций в одной части системы (классе). 122 | 123 | __Затычка на ввод данных (Input kludge)__: Забывчивость в спецификации и выполнении поддержки возможного неверного ввода. 124 | 125 | __Раздувание интерфейса (Interface bloat)__: Разработка интерфейса очень мощным и очень сложным для реализации. 126 | 127 | __Волшебная кнопка (Magic pushbutton)__: Выполнение результатов действий пользователя в виде неподходящего (недостаточно абстрактного) интерфейса. Например, написание прикладной логики в обработчиках нажатий на кнопку. 128 | 129 | __Перестыковка (Re-Coupling)__: Процесс внедрения ненужной зависимости. 130 | 131 | __Дымоход (Stovepipe System)__: Редко поддерживаемая сборка плохо связанных компонентов. 132 | 133 | __Состояние гонки (Race hazard)__: непредвидение возможности наступления событий в порядке, отличном от ожидаемого. 134 | 135 | __Членовредительство (Mutilation)__: Излишнее «затачивание» объекта под определенную очень узкую задачу таким образом, что он не способен будет работать с никакими иными, пусть и очень схожими задачами. 136 | 137 | __Сохранение или смерть (Save or die)__: Сохранение изменений лишь при завершении приложения. 138 | 139 | [к оглавлению](#Шаблоны-проектирования) 140 | 141 | ## Что такое _Dependency Injection_? 142 | __Dependency Injection (внедрение зависимости)__ - это набор паттернов и принципов разработки програмного обеспечения, которые позволяют писать слабосвязный код. В полном соответствии с принципом единой обязанности объект отдаёт заботу о построении требуемых ему зависимостей внешнему, специально предназначенному для этого общему механизму. 143 | 144 | [к оглавлению](#Шаблоны-проектирования) 145 | 146 | # Источники 147 | + [Википедия](https://ru.wikipedia.org/wiki/Шаблон_проектирования) 148 | + [Javenue](http://www.javenue.info/post/56) 149 | 150 | [Вопросы для собеседования](README.md) 151 | -------------------------------------------------------------------------------- /serialization.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Сериализация 4 | + [Что такое _«сериализация»_?](#Что-такое-сериализация) 5 | + [Опишите процесс сериализации/десериализации с использованием `Serializable`.](#Опишите-процесс-сериализациидесериализации-с-использованием-serializable) 6 | + [Как изменить стандартное поведение сериализации/десериализации?](#Как-изменить-стандартное-поведение-сериализациидесериализации) 7 | + [Как исключить поля из сериализации?](#Как-исключить-поля-из-сериализации) 8 | + [Что обозначает ключевое слово `transient`?](#Что-обозначает-ключевое-слово-transient) 9 | + [Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final`](#Какое-влияние-оказывают-на-сериализуемость-модификаторы-полей-static-и-final) 10 | + [Как не допустить сериализацию?](#Как-не-допустить-сериализацию) 11 | + [Как создать собственный протокол сериализации?](#Как-создать-собственный-протокол-сериализации) 12 | + [Какая роль поля `serialVersionUID` в сериализации?](#Какая-роль-поля-serialversionuid-в-сериализации) 13 | + [Когда стоит изменять значение поля `serialVersionUID`?](#Когда-стоит-изменять-значение-поля-serialversionuid) 14 | + [В чем проблема сериализации Singleton?](#В-чем-проблема-сериализации-singleton) 15 | + [Какие существуют способы контроля за значениями десериализованного объекта](#Какие-существуют-способы-контроля-за-значениями-десериализованного-объекта) 16 | 17 | ## Что такое _«сериализация»_? 18 | __Сериализация (Serialization)__ - процесс преобразования структуры данных в линейную последовательность байтов для дальнейшей передачи или сохранения. Сериализованные объекты можно затем восстановить (десериализовать). 19 | 20 | В Java, согласно спецификации Java Object Serialization существует два стандартных способа сериализации: стандартная сериализация, через использование интерфейса `java.io.Serializable` и «расширенная» сериализация - `java.io.Externalizable`. 21 | 22 | Сериализация позволяет в определенных пределах изменять класс. Вот наиболее важные изменения, с которыми спецификация Java Object Serialization может справляться автоматически: 23 | 24 | + добавление в класс новых полей; 25 | + изменение полей из статических в нестатические; 26 | + изменение полей из транзитных в нетранзитные. 27 | 28 | Обратные изменения (из нестатических полей в статические и из нетранзитных в транзитные) или удаление полей требуют определенной дополнительной обработки в зависимости от того, какая степень обратной совместимости необходима. 29 | 30 | [к оглавлению](#Сериализация) 31 | 32 | ## Опишите процесс сериализации/десериализации с использованием `Serializable`. 33 | При использовании Serializable применяется алгоритм сериализации, который с помощью рефлексии (Reflection API) выполняет: 34 | 35 | + запись в поток метаданных о классе, ассоциированном с объектом (имя класса, идентификатор `SerialVersionUID`, идентификаторы полей класса); 36 | + рекурсивную запись в поток описания суперклассов до класса `java.lang.Object` (не включительно); 37 | + запись примитивных значений полей сериализуемого экземпляра, начиная с полей самого верхнего суперкласса; 38 | + рекурсивную запись объектов, которые являются полями сериализуемого объекта. 39 | 40 | При этом ранее сериализованные объекты повторно не сериализуются, что позволяет алгоритму корректно работать с циклическими ссылками. 41 | 42 | Для выполнения десериализации под объект выделяется память, после чего его поля заполняются значениями из потока. Конструктор объекта при этом не вызывается. Однако при десериализации будет вызван конструктор без параметров родительского несериализуемого класса, а его отсутствие повлечёт ошибку десериализации. 43 | 44 | [к оглавлению](#Сериализация) 45 | 46 | ## Как изменить стандартное поведение сериализации/десериализации? 47 | + Реализовать интерфейс `java.io.Externalizable`, который позволяет применение пользовательской логики сериализации. Способ сериализации и десериализации описывается в методах `writeExternal()`` и `readExternal()`. Во время десериализации вызывается конструктор без параметров, а потом уже на созданном объекте вызывается метод `readExternal`. 48 | + Если у сериализуемого объекта реализован один из следующих методов, то механизм сериализации будет использовать его, а не метод по умолчанию : 49 | + `writeObject()` - запись объекта в поток; 50 | + `readObject()` - чтение объекта из потока; 51 | + `writeReplace()` - позволяет заменить себя экземпляром другого класса перед записью; 52 | + `readResolve()` - позволяет заменить на себя другой объект после чтения. 53 | 54 | [к оглавлению](#Сериализация) 55 | 56 | ## Как исключить поля из сериализации? 57 | Для управления сериализацией при определении полей можно использовать ключевое слово `transient`, таким образом исключив поля из общего процесса сериализации. 58 | 59 | [к оглавлению](#Сериализация) 60 | 61 | ## Что обозначает ключевое слово `transient`? 62 | Поля класса, помеченные модификатором `transient`, не сериализуются. 63 | 64 | Обычно в таких полях хранится промежуточное состояние объекта, которое, к примеру, проще вычислить. Другой пример такого поля - ссылка на экземпляр объекта, который не требует сериализации или не может быть сериализован. 65 | 66 | [к оглавлению](#Сериализация) 67 | 68 | ## Какое влияние оказывают на сериализуемость модификаторы полей `static` и `final` 69 | При стандартной сериализации поля, имеющие модификатор static, не сериализуются. Соответственно, после десериализации это поле значения не меняет. При использовании реализации `Externalizable` сериализовать и десериализовать статическое поле можно, но не рекомендуется этого делать, т.к. это может сопровождаться трудноуловимыми ошибками. 70 | 71 | Поля с модификатором `final` сериализуются как и обычные. За одним исключением – их невозможно десериализовать при использовании `Externalizable`, поскольку `final` поля должны быть инициализированы в конструкторе, а после этого в `readExternal()` изменить значение этого поля будет невозможно. Соответственно, если необходимо сериализовать объект с `final` полем необходимо использовать только стандартную сериализацию. 72 | 73 | [к оглавлению](#Сериализация) 74 | 75 | ## Как не допустить сериализацию? 76 | Чтобы не допустить автоматическую сериализацию можно переопределить `private` методы для создания исключительной ситуации `NotSerializableException`. 77 | 78 | ```java 79 | private void writeObject(ObjectOutputStream out) throws IOException { 80 | throw new NotSerializableException(); 81 | } 82 | 83 | private void readObject(ObjectInputStream in) throws IOException { 84 | throw new NotSerializableException(); 85 | } 86 | ``` 87 | 88 | Любая попытка записать или прочитать этот объект теперь приведет к возникновению исключительной ситуации. 89 | 90 | [к оглавлению](#Сериализация) 91 | 92 | ## Как создать собственный протокол сериализации? 93 | Для создания собственного протокола сериализации достаточно реализовать интерфейс `Externalizable`, который содержит два метода: 94 | 95 | ```java 96 | public void writeExternal(ObjectOutput out) throws IOException; 97 | public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException; 98 | ``` 99 | 100 | [к оглавлению](#Сериализация) 101 | 102 | ## Какая роль поля `serialVersionUID` в сериализации? 103 | `serialVersionUID` используется для указании версии сериализованных данных. 104 | 105 | Когда мы не объявляем `serialVersionUID` в нашем классе явно, среда выполнения Java делает это за нас, но этот процесс чувствителен ко многим метаданным класса включая количество полей, тип полей, модификаторы доступа полей, интерфейсов, которые реализованы в классе и пр. 106 | 107 | Рекомендуется явно объявлять `serialVersionUID` т.к. при добавлении, удалении атрибутов класса динамически сгенерированное значение может измениться и в момент выполнения будет выброшено исключение `InvalidClassException`. 108 | 109 | ```java 110 | private static final long serialVersionUID = 20161013L; 111 | ``` 112 | [к оглавлению](#Сериализация) 113 | 114 | ## Когда стоит изменять значение поля `serialVersionUID`? 115 | `serialVersionUID` нужно изменять при внесении в класс несовместимых изменений, например при удалении какого-либо его атрибута. 116 | 117 | [к оглавлению](#Сериализация) 118 | 119 | ## В чем проблема сериализации Singleton? 120 | Проблема в том что после десериализации мы получим другой объект. Таким образом, сериализация дает возможность создать Singleton еще раз, что недопустимо. Существует два способа избежать этого: 121 | 122 | + явный запрет сериализации. 123 | + определение метода с сигнатурой `(default/public/private/protected/) Object readResolve() throws ObjectStreamException`, назначением которого станет возврат замещающего объекта вместо объекта, на котором он вызван. 124 | 125 | [к оглавлению](#Сериализация) 126 | 127 | ## Какие существуют способы контроля за значениями десериализованного объекта 128 | Если есть необходимость выполнения контроля за значениями десериализованного объекта, то можно использовать интерфейс `ObjectInputValidation` с переопределением метода `validateObject()`. 129 | 130 | ```java 131 | // Если вызвать метод validateObject() после десериализации объекта, то будет вызвано исключение InvalidObjectException при значении возраста за пределами 39...60. 132 | public class Person implements java.io.Serializable, 133 | java.io.ObjectInputValidation { 134 | ... 135 | @Override 136 | public void validateObject() throws InvalidObjectException { 137 | if ((age < 39) || (age > 60)) 138 | throw new InvalidObjectException("Invalid age"); 139 | } 140 | } 141 | ``` 142 | 143 | Так же существуют способы подписывания и шифрования, позволяющие убедиться, что данные не были изменены: 144 | 145 | + с помощью описания логики в `writeObject()` и `readObject()`. 146 | 147 | + поместить в оберточный класс `javax.crypto.SealedObject` и/или `java.security.SignedObject`. Данные классы являются сериализуемыми, поэтому при оборачивании объекта в `SealedObject` создается подобие «подарочной упаковки» вокруг исходного объекта. Для шифрования необходимо создать симметричный ключ, управление которым должно осуществляться отдельно. Аналогично, для проверки данных можно использовать класс `SignedObject`, для работы с которым также нужен симметричный ключ, управляемый отдельно. 148 | 149 | [к оглавлению](#Сериализация) 150 | 151 | # Источники 152 | + [IBM developerWorks](https://www.ibm.com/developerworks/ru/library/j-5things1/) 153 | + [Java-online.ru](http://java-online.ru/blog-serialization.xhtml) 154 | + [Изучите секреты Java Serialization API](http://ccfit.nsu.ru/~deviv/courses/oop/java_ser_rus.html) 155 | + [JavaRush](http://bit.ly/1xwRA2D) 156 | + [Записки трезвого практика](http://www.skipy.ru/technics/serialization.html) 157 | 158 | [Вопросы для собеседования](README.md) 159 | -------------------------------------------------------------------------------- /sql.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # SQL 4 | + [Что такое _«SQL»_?](#Что-такое-sql) 5 | + [Какие существуют операторы SQL?](#Какие-существуют-операторы-sql) 6 | + [Что означает `NULL` в SQL?](#Что-означает-null-в-sql) 7 | + [Что такое _«временная таблица»_? Для чего она используется?](#Что-такое-временная-таблица-Для-чего-она-используется) 8 | + [Что такое _«представление» (view)_ и для чего оно применяется?](#Что-такое-представление-view-и-для-чего-оно-применяется) 9 | + [Каков общий синтаксис оператора `SELECT`?](#Каков-общий-синтаксис-оператора-select) 10 | + [Что такое `JOIN`?](#Что-такое-join) 11 | + [Какие существуют типы `JOIN`?](#Какие-существуют-типы-join) 12 | + [Что лучше использовать `JOIN` или подзапросы?](#Что-лучше-использовать-join-или-подзапросы) 13 | + [Для чего используется оператор `HAVING`?](#Для-чего-используется-оператор-having) 14 | + [В чем различие между операторами `HAVING` и `WHERE`?](#В-чем-различие-между-операторами-having-и-where) 15 | + [Для чего используется оператор `ORDER BY`?](#Для-чего-используется-оператор-order-by) 16 | + [Для чего используется оператор `GROUP BY`?](#Для-чего-используется-оператор-group-by) 17 | + [Как `GROUP BY` обрабатывает значение `NULL`?](#Как-group-by-обрабатывает-значение-null) 18 | + [В чем разница между операторами `GROUP BY` и `DISTINCT`?](#В-чем-разница-между-операторами-group-by-и-distinct) 19 | + [Перечислите основные агрегатные функции.](#Перечислите-основные-агрегатные-функции) 20 | + [В чем разница между `COUNT(*)` и `COUNT({column})`?](#В-чем-разница-между-count-и-countcolumn) 21 | + [Что делает оператор `EXISTS`?](#Что-делает-оператор-exists) 22 | + [Для чего используются операторы `IN`, `BETWEEN`, `LIKE`?](#Для-чего-используются-операторы-in-between-like) 23 | + [Для чего применяется ключевое слово `UNION`?](#Для-чего-применяется-ключевое-слово-union) 24 | + [Какие ограничения на целостность данных существуют в SQL?](#Какие-ограничения-на-целостность-данных-существуют-в-sql) 25 | + [Какие отличия между ограничениями `PRIMARY` и `UNIQUE`?](#Какие-отличия-между-ограничениями-primary-и-unique) 26 | + [Может ли значение в столбце, на который наложено ограничение `FOREIGN KEY`, равняться `NULL`?](#Может-ли-значение-в-столбце-на-который-наложено-ограничение-foreign-key-равняться-null) 27 | + [Как создать индекс?](#Как-создать-индекс) 28 | + [Что делает оператор `MERGE`?](#Что-делает-оператор-merge) 29 | + [В чем отличие между операторами `DELETE` и `TRUNCATE`?](#В-чем-отличие-между-операторами-delete-и-truncate) 30 | + [Что такое _«хранимая процедура»_?](#Что-такое-хранимая-процедура) 31 | + [Что такое _«триггер»_?](#Что-такое-триггер) 32 | + [Что такое _«курсор»_?](#Что-такое-курсор) 33 | + [Опишите разницу типов данных `DATETIME` и `TIMESTAMP`.](#Опишите-разницу-типов-данных-datetime-и-timestamp) 34 | + [Для каких числовых типов недопустимо использовать операции сложения/вычитания?](#Для-каких-числовых-типов-недопустимо-использовать-операции-сложениявычитания) 35 | + [Какое назначение у операторов `PIVOT` и `UNPIVOT` в Transact-SQL?](#Какое-назначение-у-операторов-pivot-и-unpivot-в-transact-sql) 36 | + [Расскажите об основных функциях ранжирования в Transact-SQL.](#Расскажите-об-основных-функциях-ранжирования-в-transact-sql) 37 | + [Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL?](#Для-чего-используются-операторы-intersect-except-в-transact-sql) 38 | + [Напишите запрос...](#Напишите-запрос) 39 | 40 | ## Что такое _«SQL»_? 41 | SQL, Structured query language («язык структурированных запросов») — формальный непроцедурный язык программирования, применяемый для создания, модификации и управления данными в произвольной реляционной базе данных, управляемой соответствующей системой управления базами данных (СУБД). 42 | 43 | [к оглавлению](#sql) 44 | 45 | ## Какие существуют операторы SQL? 46 | __операторы определения данных (Data Definition Language, DDL)__: 47 | 48 | + `CREATE` создает объект БД (базу, таблицу, представление, пользователя и т. д.), 49 | + `ALTER` изменяет объект, 50 | + `DROP` удаляет объект; 51 | 52 | __операторы манипуляции данными (Data Manipulation Language, DML)__: 53 | 54 | + `SELECT` выбирает данные, удовлетворяющие заданным условиям, 55 | + `INSERT` добавляет новые данные, 56 | + `UPDATE` изменяет существующие данные, 57 | + `DELETE` удаляет данные; 58 | 59 | __операторы определения доступа к данным (Data Control Language, DCL)__: 60 | 61 | + `GRANT` предоставляет пользователю (группе) разрешения на определенные операции с объектом, 62 | + `REVOKE` отзывает ранее выданные разрешения, 63 | + `DENY` задает запрет, имеющий приоритет над разрешением; 64 | 65 | __операторы управления транзакциями (Transaction Control Language, TCL)__: 66 | 67 | + `COMMIT` применяет транзакцию, 68 | + `ROLLBACK` откатывает все изменения, сделанные в контексте текущей транзакции, 69 | + `SAVEPOINT` разбивает транзакцию на более мелкие. 70 | 71 | [к оглавлению](#sql) 72 | 73 | ## Что означает `NULL` в SQL? 74 | `NULL` - специальное значение (псевдозначение), которое может быть записано в поле таблицы базы данных. NULL соответствует понятию «пустое поле», то есть «поле, не содержащее никакого значения». 75 | 76 | `NULL` означает отсутствие, неизвестность информации. Значение `NULL` не является значением в полном смысле слова: по определению оно означает отсутствие значения и не принадлежит ни одному типу данных. Поэтому `NULL` не равно ни логическому значению `FALSE`, ни _пустой строке_, ни `0`. При сравнении `NULL` с любым значением будет получен результат `NULL`, а не `FALSE` и не `0`. Более того, `NULL` не равно `NULL`! 77 | 78 | [к оглавлению](#sql) 79 | 80 | ## Что такое _«временная таблица»_? Для чего она используется? 81 | __Временная таблица__ - это объект базы данных, который хранится и управляется системой базы данных на временной основе. Они могут быть локальными или глобальными. Используется для сохранения результатов вызова хранимой процедуры, уменьшение числа строк при соединениях, агрегирование данных из различных источников или как замена курсоров и параметризованных представлений. 82 | 83 | [к оглавлению](#sql) 84 | 85 | ## Что такое _«представление» (view)_ и для чего оно применяется? 86 | __Представление__, View - виртуальная таблица, представляющая данные одной или более таблиц альтернативным образом. 87 | 88 | В действительности представление – всего лишь результат выполнения оператора `SELECT`, который хранится в структуре памяти, напоминающей SQL таблицу. Они работают в запросах и операторах DML точно также как и основные таблицы, но не содержат никаких собственных данных. Представления значительно расширяют возможности управления данными. Это способ дать публичный доступ к некоторой (но не всей) информации в таблице. 89 | 90 | [к оглавлению](#sql) 91 | 92 | ## Каков общий синтаксис оператора `SELECT`? 93 | `SELECT` - оператор DML SQL, возвращающий набор данных (выборку) из базы данных, удовлетворяющих заданному условию. Имеет следующую структуру: 94 | 95 | ```sql 96 | SELECT 97 | [DISTINCT | DISTINCTROW | ALL] 98 | select_expression,... 99 | FROM table_references 100 | [WHERE where_definition] 101 | [GROUP BY {unsigned_integer | column | formula}] 102 | [HAVING where_definition] 103 | [ORDER BY {unsigned_integer | column | formula} [ASC | DESC], ...] 104 | ``` 105 | 106 | [к оглавлению](#sql) 107 | 108 | ## Что такое `JOIN`? 109 | __JOIN__ - оператор языка SQL, который является реализацией операции соединения реляционной алгебры. Предназначен для обеспечения выборки данных из двух таблиц и включения этих данных в один результирующий набор. 110 | 111 | Особенностями операции соединения являются следующее: 112 | 113 | + в схему таблицы-результата входят столбцы обеих исходных таблиц (таблиц-операндов), то есть схема результата является «сцеплением» схем операндов; 114 | + каждая строка таблицы-результата является «сцеплением» строки из одной таблицы-операнда со строкой второй таблицы-операнда; 115 | + при необходимости соединения не двух, а нескольких таблиц, операция соединения применяется несколько раз (последовательно). 116 | 117 | ```sql 118 | SELECT 119 | field_name [,... n] 120 | FROM 121 | Table1 122 | {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN 123 | Table2 124 | {ON <condition> | USING (field_name [,... n])} 125 | ``` 126 | 127 | [к оглавлению](#sql) 128 | 129 | ## Какие существуют типы `JOIN`? 130 | __(INNER) JOIN__ 131 | Результатом объединения таблиц являются записи, общие для левой и правой таблиц. Порядок таблиц для оператора не важен, поскольку оператор является симметричным. 132 | 133 | __LEFT (OUTER) JOIN__ 134 | Производит выбор всех записей первой таблицы и соответствующих им записей второй таблицы. Если записи во второй таблице не найдены, то вместо них подставляется пустой результат (`NULL`). Порядок таблиц для оператора важен, поскольку оператор не является симметричным. 135 | 136 | __RIGHT (OUTER) JOIN__ 137 | `LEFT JOIN` с операндами, расставленными в обратном порядке. Порядок таблиц для оператора важен, поскольку оператор не является симметричным. 138 | 139 | __FULL (OUTER) JOIN__ 140 | Результатом объединения таблиц являются все записи, которые присутствуют в таблицах. Порядок таблиц для оператора не важен, поскольку оператор является симметричным. 141 | 142 | __CROSS JOIN (декартово произведение)__ 143 | При выборе каждая строка одной таблицы объединяется с каждой строкой второй таблицы, давая тем самым все возможные сочетания строк двух таблиц. Порядок таблиц для оператора не важен, поскольку оператор является симметричным. 144 | 145 | [к оглавлению](#sql) 146 | 147 | ## Что лучше использовать `JOIN` или подзапросы? 148 | Обычно лучше использовать `JOIN`, поскольку в большинстве случаев он более понятен и лучше оптимизируется СУБД (но 100% этого гарантировать нельзя). Так же `JOIN` имеет заметное преимущество над подзапросами в случае, когда список выбора `SELECT` содержит столбцы более чем из одной таблицы. 149 | 150 | Подзапросы лучше использовать в случаях, когда нужно вычислять агрегатные значения и использовать их для сравнений во внешних запросах. 151 | 152 | [к оглавлению](#sql) 153 | 154 | ## Для чего используется оператор `HAVING`? 155 | `HAVING` используется для фильтрации результата `GROUP BY` по заданным логическим условиям. 156 | 157 | [к оглавлению](#sql) 158 | 159 | ## В чем различие между операторами `HAVING` и `WHERE`? 160 | `HAVING` используется как `WHERE`, но в другой части SQL-выражения и, соответственно, на другой стадии формирования ответа. 161 | 162 | [к оглавлению](#sql) 163 | 164 | ## Для чего используется оператор `ORDER BY`? 165 | __ORDER BY__ упорядочивает вывод запроса согласно значениям в том или ином количестве выбранных столбцов. Многочисленные столбцы упорядочиваются один внутри другого. Возможно определять возрастание `ASC` или убывание `DESC` для каждого столбца. По умолчанию установлено - возрастание. 166 | 167 | [к оглавлению](#sql) 168 | 169 | ## Для чего используется оператор `GROUP BY`? 170 | `GROUP BY` используется для агрегации записей результата по заданным признакам-атрибутам. 171 | 172 | [к оглавлению](#sql) 173 | 174 | ## Как `GROUP BY` обрабатывает значение `NULL`? 175 | При использовании `GROUP BY` все значения `NULL` считаются равными. 176 | 177 | [к оглавлению](#sql) 178 | 179 | ## В чем разница между операторами `GROUP BY` и `DISTINCT`? 180 | `DISTINCT` указывает, что для вычислений используются только уникальные значения столбца. `NULL` считается как отдельное значение. 181 | `GROUP BY` создает отдельную группу для всех возможных значений (включая значение `NULL`). 182 | 183 | Если нужно удалить только дубликаты лучше использовать `DISTINCT`, `GROUP BY` лучше использовать для определения групп записей, к которым могут применяться агрегатные функции. 184 | 185 | [к оглавлению](#sql) 186 | 187 | ## Перечислите основные агрегатные функции. 188 | __Агрегатных функции__ - функции, которые берут группы значений и сводят их к одиночному значению. 189 | 190 | SQL предоставляет несколько агрегатных функций: 191 | 192 | `COUNT` - производит подсчет записей, удовлетворяющих условию запроса; 193 | `SUM` - вычисляет арифметическую сумму всех значений колонки; 194 | `AVG` - вычисляет среднее арифметическое всех значений; 195 | `MAX` - определяет наибольшее из всех выбранных значений; 196 | `MIN` - определяет наименьшее из всех выбранных значений. 197 | 198 | [к оглавлению](#sql) 199 | 200 | ## В чем разница между `COUNT(*)` и `COUNT({column})`? 201 | `COUNT (*)` подсчитывает количество записей в таблице, не игнорируя значение NULL, поскольку эта функция оперирует записями, а не столбцами. 202 | 203 | `COUNT ({column})` подсчитывает количество значений в `{column}`. При подсчете количества значений столбца эта форма функции `COUNT` не принимает во внимание значение `NULL`. 204 | 205 | [к оглавлению](#sql) 206 | 207 | ## Что делает оператор `EXISTS`? 208 | `EXISTS` берет подзапрос, как аргумент, и оценивает его как `TRUE`, если подзапрос возвращает какие-либо записи и `FALSE`, если нет. 209 | 210 | [к оглавлению](#sql) 211 | 212 | ## Для чего используются операторы `IN`, `BETWEEN`, `LIKE`? 213 | `IN` - определяет набор значений. 214 | 215 | ```sql 216 | SELECT * FROM Persons WHERE name IN ('Ivan','Petr','Pavel'); 217 | ``` 218 | 219 | `BETWEEN` определяет диапазон значений. В отличие от `IN`, `BETWEEN` чувствителен к порядку, и первое значение в предложении должно быть первым по алфавитному или числовому порядку. 220 | 221 | ```sql 222 | SELECT * FROM Persons WHERE age BETWEEN 20 AND 25; 223 | ``` 224 | 225 | `LIKE` применим только к полям типа `CHAR` или `VARCHAR`, с которыми он используется чтобы находить подстроки. В качестве условия используются _символы шаблонизации (wildkards_) - специальные символы, которые могут соответствовать чему-нибудь: 226 | 227 | + `_` замещает любой одиночный символ. Например, `'b_t'` будет соответствовать словам `'bat'` или `'bit'`, но не будет соответствовать `'brat'`. 228 | 229 | + `%` замещает последовательность любого числа символов. Например `'%p%t'` будет соответствовать словам `'put'`, `'posit'`, или `'opt'`, но не `'spite'`. 230 | 231 | ```sql 232 | SELECT * FROM UNIVERSITY WHERE NAME LIKE '%o'; 233 | ``` 234 | 235 | [к оглавлению](#sql) 236 | 237 | ## Для чего применяется ключевое слово `UNION`? 238 | В языке SQL ключевое слово `UNION` применяется для объединения результатов двух SQL-запросов в единую таблицу, состоящую из схожих записей. Оба запроса должны возвращать одинаковое число столбцов и совместимые типы данных в соответствующих столбцах. Необходимо отметить, что `UNION` сам по себе не гарантирует порядок записей. Записи из второго запроса могут оказаться в начале, в конце или вообще перемешаться с записями из первого запроса. В случаях, когда требуется определенный порядок, необходимо использовать `ORDER BY`. 239 | 240 | [к оглавлению](#sql) 241 | 242 | ## Какие ограничения на целостность данных существуют в SQL? 243 | `PRIMARY KEY` - набор полей (1 или более), значения которых образуют уникальную комбинацию и используются для однозначной идентификации записи в таблице. Для таблицы может быть создано только одно такое ограничение. Данное ограничение используется для обеспечения целостности сущности, которая описана таблицей. 244 | 245 | `CHECK` используется для ограничения множества значений, которые могут быть помещены в данный столбец. Это ограничение используется для обеспечения целостности предметной области, которую описывают таблицы в базе. 246 | 247 | `UNIQUE` обеспечивает отсутствие дубликатов в столбце или наборе столбцов. 248 | 249 | `FOREIGN KEY` защищает от действий, которые могут нарушить связи между таблицами. `FOREIGN KEY` в одной таблице указывает на `PRIMARY KEY` в другой. Поэтому данное ограничение нацелено на то, чтобы не было записей `FOREIGN KEY`, которым не отвечают записи `PRIMARY KEY`. 250 | 251 | [к оглавлению](#sql) 252 | 253 | ## Какие отличия между ограничениями `PRIMARY` и `UNIQUE`? 254 | По умолчанию ограничение `PRIMARY` создает кластерный индекс на столбце, а `UNIQUE` - некластерный. Другим отличием является то, что `PRIMARY` не разрешает `NULL` записей, в то время как `UNIQUE` разрешает одну (а в некоторых СУБД несколько) `NULL` запись. 255 | 256 | [к оглавлению](#sql) 257 | 258 | ## Может ли значение в столбце, на который наложено ограничение `FOREIGN KEY`, равняться `NULL`? 259 | Может, если на данный столбец не наложено ограничение `NOT NULL`. 260 | 261 | [к оглавлению](#sql) 262 | 263 | ## Как создать индекс? 264 | Индекс можно создать либо с помощью выражения `CREATE INDEX`: 265 | ```sql 266 | CREATE INDEX index_name ON table_name (column_name) 267 | ``` 268 | 269 | либо указав ограничение целостности в виде уникального `UNIQUE` или первичного `PRIMARY` ключа в операторе создания таблицы `CREATE TABLE`. 270 | 271 | [к оглавлению](#sql) 272 | 273 | ## Что делает оператор `MERGE`? 274 | `MERGE` позволяет осуществить слияние данных одной таблицы с данными другой таблицы. При слиянии таблиц проверяется условие, и если оно истинно, то выполняется `UPDATE`, а если нет - `INSERT`. При этом изменять поля таблицы в секции `UPDATE`, по которым идет связывание двух таблиц, нельзя. 275 | 276 | [к оглавлению](#sql) 277 | 278 | ## В чем отличие между операторами `DELETE` и `TRUNCATE`? 279 | `DELETE` - оператор DML, удаляет записи из таблицы, которые удовлетворяют критерию `WHERE` при этом задействуются триггеры, ограничения и т.д. 280 | 281 | `TRUNCATE` - DDL оператор (удаляет таблицу и создает ее заново. Причем если на эту таблицу есть ссылки `FOREGIN KEY` или таблица используется в репликации, то пересоздать такую таблицу не получится). 282 | 283 | [к оглавлению](#sql) 284 | 285 | ## Что такое _«хранимая процедура»_? 286 | __Хранимая процедура__ — объект базы данных, представляющий собой набор SQL-инструкций, который хранится на сервере. Хранимые процедуры очень похожи на обыкновенные процедуры языков высокого уровня, у них могут быть входные и выходные параметры и локальные переменные, в них могут производиться числовые вычисления и операции над символьными данными, результаты которых могут присваиваться переменным и параметрам. В хранимых процедурах могут выполняться стандартные операции с базами данных (как DDL, так и DML). Кроме того, в хранимых процедурах возможны циклы и ветвления, то есть в них могут использоваться инструкции управления процессом исполнения. 287 | 288 | Хранимые процедуры позволяют повысить производительность, расширяют возможности программирования и поддерживают функции безопасности данных. В большинстве СУБД при первом запуске хранимой процедуры она компилируется (выполняется синтаксический анализ и генерируется план доступа к данным) и в дальнейшем её обработка осуществляется быстрее. 289 | 290 | [к оглавлению](#sql) 291 | 292 | ## Что такое _«триггер»_? 293 | __Триггер (trigger)__ — это хранимая процедура особого типа, которую пользователь не вызывает непосредственно, а исполнение которой обусловлено действием по модификации данных: добавлением, удалением или изменением данных в заданной таблице реляционной базы данных. Триггеры применяются для обеспечения целостности данных и реализации сложной бизнес-логики. Триггер запускается сервером автоматически и все производимые им модификации данных рассматриваются как выполняемые в транзакции, в которой выполнено действие, вызвавшее срабатывание триггера. Соответственно, в случае обнаружения ошибки или нарушения целостности данных может произойти откат этой транзакции. 294 | 295 | Момент запуска триггера определяется с помощью ключевых слов `BEFORE` (триггер запускается до выполнения связанного с ним события) или `AFTER` (после события). В случае, если триггер вызывается до события, он может внести изменения в модифицируемую событием запись. Кроме того, триггеры могут быть привязаны не к таблице, а к представлению (VIEW). В этом случае с их помощью реализуется механизм «обновляемого представления». В этом случае ключевые слова `BEFORE` и `AFTER` влияют лишь на последовательность вызова триггеров, так как собственно событие (удаление, вставка или обновление) не происходит. 296 | 297 | [к оглавлению](#sql) 298 | 299 | ## Что такое _«курсор»_? 300 | __Курсор__ — это объект базы данных, который позволяет приложениям работать с записями «по-одной», а не сразу с множеством, как это делается в обычных SQL командах. 301 | 302 | Порядок работы с курсором такой: 303 | 304 | + Определить курсор (`DECLARE`) 305 | + Открыть курсор (`OPEN`) 306 | + Получить запись из курсора (`FETCH`) 307 | + Обработать запись... 308 | + Закрыть курсор (`CLOSE`) 309 | + Удалить ссылку курсора (`DEALLOCATE`). Когда удаляется последняя ссылка курсора, SQL освобождает структуры данных, составляющие курсор. 310 | 311 | [к оглавлению](#sql) 312 | 313 | ## Опишите разницу типов данных `DATETIME` и `TIMESTAMP`. 314 | `DATETIME` предназначен для хранения целого числа: `YYYYMMDDHHMMSS`. И это время не зависит от временной зоны настроенной на сервере. 315 | Размер: 8 байт 316 | 317 | `TIMESTAMP` хранит значение равное количеству секунд, прошедших с полуночи 1 января 1970 года по усреднённому времени Гринвича. При получении из базы отображается с учётом часового пояса. Размер: 4 байта 318 | 319 | [к оглавлению](#sql) 320 | 321 | ## Для каких числовых типов недопустимо использовать операции сложения/вычитания? 322 | В качестве операндов операций сложения и вычитания нельзя использовать числовой тип `BIT`. 323 | 324 | [к оглавлению](#sql) 325 | 326 | ## Какое назначение у операторов `PIVOT` и `UNPIVOT` в Transact-SQL? 327 | `PIVOT` и `UNPIVOT` являются нестандартными реляционными операторами, которые поддерживаются Transact-SQL. 328 | 329 | Оператор `PIVOT` разворачивает возвращающее табличное значение выражение, преобразуя уникальные значения одного столбца выражения в несколько выходных столбцов, а также, в случае необходимости, объединяет оставшиеся повторяющиеся значения столбца и отображает их в выходных данных. Оператор `UNPIVOT` производит действия, обратные `PIVOT`, преобразуя столбцы возвращающего табличное значение выражения в значения столбца. 330 | 331 | [к оглавлению](#sql) 332 | 333 | ## Расскажите об основных функциях ранжирования в Transact-SQL. 334 | Ранжирующие функции - это функции, которые возвращают значение для каждой записи группы в результирующем наборе данных. На практике они могут быть использованы, например, для простой нумерации списка, составления рейтинга или постраничной навигации. 335 | 336 | `ROW_NUMBER` – функция нумерации в Transact-SQL, которая возвращает просто номер записи. 337 | 338 | `RANK` возвращает ранг каждой записи. В данном случае, в отличие от `ROW_NUMBER`, идет уже анализ значений и в случае нахождения одинаковых возвращает одинаковый ранг с пропуском следующего. 339 | 340 | `DENSE_RANK` так же возвращает ранг каждой записи, но в отличие от `RANK` в случае нахождения одинаковых значений возвращает ранг без пропуска следующего. 341 | 342 | `NTILE` – функция Transact-SQL, которая делит результирующий набор на группы по определенному столбцу. 343 | 344 | [к оглавлению](#sql) 345 | 346 | ## Для чего используются операторы `INTERSECT`, `EXCEPT` в Transact-SQL? 347 | Оператор `EXCEPT` возвращает уникальные записи из левого входного запроса, которые не выводятся правым входным запросом. 348 | 349 | Оператор `INTERSECT` возвращает уникальные записи, выводимые левым и правым входными запросами. 350 | 351 | [к оглавлению](#sql) 352 | 353 | ## Напишите запрос... 354 | ```sql 355 | CREATE TABLE table ( 356 | id BIGINT(20) NOT NULL AUTO_INCREMENT, 357 | created TIMESTAMP NOT NULL DEFAULT 0, 358 | PRIMARY KEY (id) 359 | ); 360 | ``` 361 | 362 | Требуется написать запрос который вернет максимальное значение `id` и значение `created` для этого `id`: 363 | 364 | ```sql 365 | SELECT id, created FROM table where id = (SELECT MAX(id) FROM table); 366 | ``` 367 | 368 | --- 369 | 370 | ```sql 371 | CREATE TABLE track_downloads ( 372 | download_id BIGINT(20) NOT NULL AUTO_INCREMENT, 373 | track_id INT NOT NULL, 374 | user_id BIGINT(20) NOT NULL, 375 | download_time TIMESTAMP NOT NULL DEFAULT 0, 376 | PRIMARY KEY (download_id) 377 | ); 378 | ``` 379 | 380 | Напишите SQL-запрос, возвращающий все пары `(download_count, user_count)`, удовлетворяющие следующему условию: `user_count` — общее ненулевое число пользователей, сделавших ровно `download_count` скачиваний `19 ноября 2010 года`: 381 | 382 | ```sql 383 | SELECT DISTINCT download_count, COUNT(*) AS user_count 384 | FROM ( 385 | SELECT COUNT(*) AS download_count 386 | FROM track_downloads WHERE download_time="2010-11-19" 387 | GROUP BY user_id) 388 | AS download_count 389 | GROUP BY download_count; 390 | ``` 391 | 392 | [к оглавлению](#sql) 393 | 394 | # Источники 395 | + [Википедия](https://ru.wikipedia.org/wiki/SQL) 396 | + [Quizful](http://www.quizful.net/interview/sql) 397 | 398 | [Вопросы для собеседования](README.md) 399 | -------------------------------------------------------------------------------- /test.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Тестирование 4 | + [Что такое _«модульное тестирование»_?](#Что-такое-модульное-тестирование) 5 | + [Что такое _«интеграционное тестирование»_?](#Что-такое-интеграционное-тестирование) 6 | + [Чем интеграционное тестирование отличается от модульного?](#Чем-интеграционное-тестирование-отличается-от-модульного) 7 | + [Какие существуют виды тестовых объектов?](#Какие-существуют-виды-тестовых-объектов) 8 | + [Чем _stub_ отличается от _mock_?](#Чем-stub-отличается-от-mock) 9 | + [Что такое _«фикстуры»_?](#Что-такое-фикстуры) 10 | + [Какие аннотации фикстур существуют в JUnit?](#Какие-аннотации-фикстур-существуют-в-junit) 11 | + [Для чего в JUnit используется аннотация `@Ignore`?](#Для-чего-в-junit-используется-аннотация-ignore) 12 | 13 | ## Что такое _«модульное тестирование»_? 14 | __Модульное/компонентное тестирование (unit testing)__ - процесс в программировании, позволяющий проверить на корректность отдельные модули исходного кода программы. Идея состоит в том, чтобы писать тесты для каждой нетривиальной функции или метода. Это позволяет достаточно быстро проверить, не привело ли очередное изменение кода к регрессии, то есть к появлению ошибок в уже оттестированных местах программы, а также облегчает обнаружение и устранение таких ошибок. 15 | 16 | Модульные тесты можно условно поделить на две группы: 17 | 18 | + _тесты состояния (state based)_, проверяющие что вызываемый метод объекта отработал корректно, проверяя состояние тестируемого объекта после вызова метода. 19 | 20 | + _тесты взаимодействия (interaction tests)_, в которых тестируемый объект производит манипуляции с другими объектами. Применяются, когда требуется удостовериться, что тестируемый объект корректно взаимодействует с другими объектами. 21 | 22 | [к оглавлению](#Тестирование) 23 | 24 | ## Что такое _«интеграционное тестирование»_? 25 | __Интеграционное тестирование (integration testing)__ — это тестирование, проверяющие работоспособность двух или более модулей системы в совокупности — то есть нескольких объектов как единого блока. В тестах взаимодействия же тестируется конкретный, определенный объект и то, как именно он взаимодействует с внешними зависимостями. 26 | 27 | [к оглавлению](#Тестирование) 28 | 29 | ## Чем интеграционное тестирование отличается от модульного? 30 | С технологической точки зрения интеграционное тестирование является количественным развитием модульного, поскольку так же, как и модульное тестирование, оперирует интерфейсами модулей и подсистем и требует создания тестового окружения, включая заглушки на месте отсутствующих модулей. Основная разница между модульным и интеграционным тестированием состоит в целях, то есть в типах обнаруживаемых дефектов, которые, в свою очередь, определяют стратегию выбора входных данных и методов анализа. 31 | 32 | > Допустим, есть класс, который при определенных условиях взаимодействует с web-сервисом через зависимый объект. И нам надо проверить, что определенный метод зависимого объекта действительно вызывается. Если в качестве зависимого класса передать: 33 | 34 | > + реальный класс, работающий с web-сервисом, то это будет интеграционное тестирование. 35 | 36 | > + заглушку, то это будет тестирование состояния. 37 | 38 | > + шпиона, а в конце теста проверить, что определенный метод зависимого объекта действительно был вызван, то это будет тест взаимодействия. 39 | 40 | [к оглавлению](#Тестирование) 41 | 42 | ## Какие существуют виды тестовых объектов? 43 | __пустышка (dummy)__ - объект, который обычно передается в тестируемый класс в качестве параметра, но не имеет поведения: с ним ничего не происходит и никакие его методы не вызываются. 44 | 45 | > Примером dummy-объектов являются new object(), null, «Ignored String» и т.д. 46 | 47 | __фальшивка (fake object)__ применяется в основном для ускорения запуска ресурсоёмких тестов и является заменой тяжеловесного внешнего зависимого объекта его легковесной реализацией. 48 | 49 | > Основные примеры — эмулятор базы данных (fake database) или фальшивый web-сервис. 50 | 51 | __заглушка (test stub)__ используется для получения данных из внешней зависимости, подменяя её. При этом заглушка игнорирует все данные поступающие из тестируемого объекта, возвращая заранее определённый результат. 52 | 53 | > Тестируемый объект использует чтение из конфигурационного файла? Тогда передаем ему заглушку `ConfigFileStub` возвращающую тестовые строки конфигурации без обращения к файловой системе. 54 | 55 | __шпион (test spy)__ - разновидность заглушки, которая умеет протоколировать сделанные к ней обращения из тестируемой системы, чтобы проверить их правильность в конце теста. При этом фиксируется количество, состав и содержание параметров вызовов. 56 | 57 | > Если существует необходимость проверки, что определённый метод тестируемого класса вызывался ровно 1 раз, то шпион - имменно то, что нам нужно. 58 | 59 | __фикция (mock object)__ похож на _шпиона_, но обладает расширенной функциональностью, заранее заданными поведением и реакцией на вызовы. 60 | 61 | [к оглавлению](#Тестирование) 62 | 63 | ## Чем _stub_ отличается от _mock_? 64 | _stub_ используется как заглушка сервисов, методов, классов и т.д. с заранее запрограммированным ответом на вызовы. 65 | 66 | _mock_ использует подмену результатов вызова, проверяет сам факт взаимодействия, протоколирует и контролирует его. 67 | 68 | [к оглавлению](#Тестирование) 69 | 70 | ## Что такое _«фикстуры»_? 71 | __Фикстуры (fixtures)__ - состояние среды тестирования, которое требуется для успешного выполнения теста. Основная задача фикстур заключается в подготовке тестового окружения с заранее фиксированным/известным состоянием, чтобы гарантировать повторяемость процесса тестирования. 72 | 73 | [к оглавлению](#Тестирование) 74 | 75 | ## Какие аннотации фикстур существуют в JUnit? 76 | 77 | + `@BeforeClass` - определяет код, который должен единожды выполниться перед запуском набора тестовых методов. 78 | + `@AfterClass` - код, выполняемый один раз после исполнения набора тестовых методово. 79 | + `@Before` - определяет код, который должен выполняться каждый раз перд запуском любого тестовым методом. 80 | + `@After` - код, выполняемый каждый раз после исполнения любого тестового метода. 81 | 82 | [к оглавлению](#Тестирование) 83 | 84 | ## Для чего в JUnit используется аннотация `@Ignore`? 85 | `@Ignore` указывает JUnit на необходимость пропустить данный тестовый метод. 86 | 87 | [к оглавлению](#Тестирование) 88 | 89 | # Источники 90 | + [Википедия](https://ru.wikipedia.org/wiki/Тестирование_программного_обеспечения) 91 | + [Хабрахабр](https://habrahabr.ru/post/116372/) 92 | + [Интуит](http://www.intuit.ru/department/se/testing/5/2.html) 93 | 94 | [Вопросы для собеседования](README.md) 95 | -------------------------------------------------------------------------------- /uml.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # UML 4 | + [Что такое _UML_?](#Что-такое-uml) 5 | + [Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML?](#Что-такое-диаграмма-нотация-и-метамодель-в-uml) 6 | + [Какие существуют типы диаграмм?](#Какие-существуют-типы-диаграмм) 7 | + [Какие виды отношений существуют в структурной диаграмме классов?](#Какие-виды-отношений-существуют-в-структурной-диаграмме-классов) 8 | 9 | ## Что такое _UML_? 10 | __UML__ – это унифицированный графический язык моделирования для описания, визуализации, проектирования и документирования объектно-ориентированных систем. UML призван поддерживать процесс моделирования на основе объектно-ориентированного подхода, организовывать взаимосвязь концептуальных и программных понятий, отражать проблемы масштабирования сложных систем. 11 | 12 | Отличительной особенностью UML является то, что словарь этого языка образуют графические элементы. Каждому графическому символу соответствует конкретная семантика, поэтому модель, созданная одним человеком, может однозначно быть понята другим человеком или программным средством, интерпретирующим UML. Отсюда, в частности, следует, что модель системы, представленная на UML, может автоматически быть переведена на объектно-ориентированный язык программирования, то есть, при наличии хорошего инструментального средства визуального моделирования, поддерживающего UML, построив модель, мы получим и заготовку программного кода, соответствующего этой модели. 13 | 14 | [к оглавлению](#uml) 15 | 16 | ## Что такое _«диаграмма»_, _«нотация»_ и _«метамодель»_ в UML? 17 | __Диаграмма__ - графическое представление совокупности элементов модели в форме связного графа, вершинам и ребрам (дугам) которого приписывается определенная семантика 18 | 19 | __Нотация__ – совокупность символов и правила их применения, используются для представления понятий и связей между ними. 20 | Нотация диаграммы определяет способ представления, ассоциации, множественности. Причем эти понятия должны быть точно определены. 21 | 22 | __Метамодель__ – диаграмма, определяющая нотацию. 23 | Метамодель помогает понять, что такое хорошо организованная, т.е. синтаксически правильная, модель. 24 | 25 | [к оглавлению](#uml) 26 | 27 | ## Какие существуют типы диаграмм? 28 | ## Структурные диаграммы: 29 | __классов (Class diagram)__ описывает структуру системы, демонстрирующая классы системы, их атрибуты, методы и зависимости между классами. 30 | 31 | __объектов (Object diagram)__ демонстрирует полный или частичный снимок моделируемой системы в заданный момент времени. На диаграмме объектов отображаются экземпляры классов (объекты) системы с указанием текущих значений их атрибутов и связей между объектами. 32 | 33 | __компонентов (Component diagram)__ показывает разбиение программной системы на структурные компоненты и связи (зависимости) между компонентами. 34 | 35 | + __развёртывания/размещения (Deployment diagram)__ служит для моделирования работающих узлов и артефактов, развёрнутых на них. 36 | 37 | + __пакетов (Package diagram)__ используется для организации элементов в группы по какому-либо признаку с целью упрощения структуры и организации работы с моделью системы. 38 | 39 | + __профилей (Profile diagram)__ действует на уровне метамодели и показывает стереотип класса или пакета. 40 | 41 | + __композитной/составной структуры (Composite structure diagram)__ демонстрирует внутреннюю структуру класса и, по возможности, взаимодействие элементов (частей) его внутренней структуры. 42 | 43 | + __кооперации (Collaboration diagram)__ показывает роли и взаимодействие классов в рамках кооперации. 44 | 45 | ## Диаграммы поведения: 46 | __деятельности (Activity diagram)__ показывает разложение некоторой деятельности на её составные части. Под деятельностью понимается спецификация исполняемого поведения в виде координированного последовательного и параллельного выполнения подчинённых элементов — вложенных видов деятельности и отдельных действий, соединённых между собой потоками, которые идут от выходов одного узла к входам другого. Диаграммы деятельности используются при моделировании бизнес-процессов, технологических процессов, последовательных и параллельных вычислений. 47 | 48 | __состояний/автомата/конечного автомата (State Machine diagram)__ представляет конечный автомат с простыми состояниями, переходами и композитными состояниями. Конечный автомат (State machine) — спецификация последовательности состояний, через которые проходит объект или взаимодействие в ответ на события своей жизни, а также ответные действия объекта на эти события. Конечный автомат прикреплён к исходному элементу (классу, кооперации или методу) и служит для определения поведения его экземпляров. 49 | 50 | __вариантов использования/прецедентов (Use case diagram)__ отражает отношения существующие между актёрами и вариантами использования. Основная задача — представлять собой единое средство, дающее возможность заказчику, конечному пользователю и разработчику совместно обсуждать функциональность и поведение системы. 51 | 52 | __взаимодействия (Interaction diagram)__: 53 | 54 | + __коммуникации (Communication diagram)__ изображает взаимодействия между частями композитной структуры или ролями кооперации при этом явно указываются отношения между элементами (объектами), а время как отдельное измерение не используется (применяются порядковые номера вызовов). 55 | 56 | + __последовательности (Sequence diagram)__ показывает взаимодействия объектов, упорядоченные по времени их проявления. 57 | 58 | + __обзора взаимодействия (Interaction overview diagram)__ — разновидность диаграммы деятельности, включающая фрагменты диаграммы последовательности и конструкции потока управления. 59 | 60 | + __синхронизации (Timing diagram)__ — альтернативное представление диаграммы последовательности, явным образом показывающее изменения состояния на линии жизни с заданной шкалой времени. Может быть полезна в приложениях реального времени. 61 | 62 | [к оглавлению](#uml) 63 | 64 | ## Какие виды отношений существуют в структурной диаграмме классов? 65 | ## Взаимосвязи классов 66 | __Обобщение (Generalization)__ показывает, что один из двух связанных классов (подтип) является частной формой другого (супертипа), который называется обобщением первого. На практике это означает, что любой экземпляр подтипа является также экземпляром супертипа. Обобщение также известно как _наследование_, _«is a» взаимосвязь_ или _отношение «является»_. 67 | 68 | > «Табурет» является подтипом «Мебели». 69 | 70 | __Реализация (Implementation)__ — отношение между двумя элементами модели, в котором один элемент (клиент) реализует поведение, заданное другим (поставщиком). Реализация — отношение целое-часть. Поставщик, как правило является абстрактным классом или классом-интерфейсом. 71 | 72 | > «Кровать» реализует поведение «Мебели для сна» 73 | 74 | ## Взаимосвязи объектов классов 75 | __Зависимость (Dependency)__ обозначает такое отношение между классами, что изменение спецификации класса-поставщика может повлиять на работу зависимого класса, но не наоборот. 76 | 77 | > «Расписание занятий» имеет зависимость от «Списка предметов». При изменении списка предметов расписание занятий будет вынуждено изменится. Однако изменение расписания занятий никак не влияет на список предметов. 78 | 79 | __Ассоциация (Association)__ показывает, что объекты одной сущности (класса) связаны с объектами другой сущности таким образом, что можно перемещаться от объектов одного класса к другому. Является общим случаем композиции и агрегации. 80 | 81 | > «Студент» и «Университет» имеют ассоциацию т.к. студент может учиться в университете и этой ассоциации можно присвоить имя «учится в». 82 | 83 | __Агрегация (Aggregation)__ — это разновидность ассоциации в отношении между целым и его частями. Как тип ассоциации агрегация может быть именованной. Одно отношение агрегации не может включать более двух классов (контейнер и содержимое). Агрегация встречается, когда один класс является коллекцией или контейнером других. Причём по умолчанию, агрегацией называют агрегацию по ссылке, то есть когда время существования содержащихся классов не зависит от времени существования содержащего их класса. Если контейнер будет уничтожен, то его содержимое — нет. 84 | 85 | > «Студент» не является неотъемлемой частью «Группы», но в то же время, группа состоит из студентов, поэтому следует использовать агрегацию. 86 | 87 | __Композиция (Composition)__ — более строгий вариант агрегации. Известна также как агрегация по значению. Композиция имеет жёсткую зависимость времени существования экземпляров класса контейнера и экземпляров содержащихся классов. Если контейнер будет уничтожен, то всё его содержимое будет также уничтожено. 88 | 89 | > «Факультет» является частью «Университета» и факультет без университета существовать не может, следовательно здесь подходит композиция. 90 | 91 | ## #Общие взаимосвязи 92 | __Зависимость__ — это слабая форма отношения использования, при котором изменение в спецификации одного влечёт за собой изменение другого, причём обратное не обязательно. Возникает, когда объект выступает, например, в форме параметра или локальной переменной. Существует несколько именованных вариантов. Зависимость может быть между экземплярами, классами или экземпляром и классом. 93 | 94 | __Уточнение отношений__ имеет отношение к уровню детализации. Один пакет уточняет другой, если в нём содержатся те же самые элементы, но в более подробном представлении. 95 | 96 | __Мощность/кратность/мультипликатор отношения__ означает число связей между каждым экземпляром класса (объектом) в начале линии с экземпляром класса в её конце. Различают следующие типичные случаи: 97 | 98 | | нотация | объяснение | пример | 99 | |:----------:|:--------------------------:|:---------------------------------------------:| 100 | | 0..1 | Ноль или один экземпляр | кошка имеет или не имеет хозяина | 101 | | 1 | Обязательно один экземпляр | у кошки одна мать | 102 | | 0..* или * | Ноль или более экземпляров | у кошки могут быть, а может и не быть котят | 103 | | 1..* | Один или более экземпляров | у кошки есть хотя бы одно место, где она спит | 104 | 105 | [к оглавлению](#uml) 106 | 107 | # Источники 108 | + [Википедия](https://ru.wikipedia.org/wiki/UML) 109 | + [Информикус](http://www.informicus.ru/) 110 | 111 | [Вопросы для собеседования](README.md) 112 | -------------------------------------------------------------------------------- /web.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # Основы Web 4 | + [Что такое _WWW_?](#Что-такое-www) 5 | + [Что такое _W3C_?](#Что-такое-w3c) 6 | + [Какие существуют уровни модели _OSI_?](#Какие-существуют-уровни-модели-osi) 7 | + [Что такое _TCP/IP_?](#Что-такое-tcpip) 8 | + [Что такое _UDP_?](#Что-такое-udp) 9 | + [Чем отличаются _TCP_ и _UDP_?](#Чем-отличаются-tcp-и-udp) 10 | + [Что такое протокол передачи данных? Какие протоколы вы знаете?](#Что-такое-протокол-передачи-данных-Какие-протоколы-вы-знаете) 11 | + [Что такое _HTTP_ и _HTTPS_? Чем они отличаются?](#Что-такое-http-и-https-Чем-они-отличаются) 12 | + [Что такое _FTP_?](#Что-такое-ftp) 13 | + [Чем отличаются методы _GET_ и _POST_?](#Чем-отличаются-методы-get-и-post) 14 | + [Что такое _MIME тип_?](#Что-такое-mime-тип) 15 | + [Что такое _Web server_?](#Что-такое-web-server) 16 | + [Что такое _Web application_?](#Что-такое-web-application) 17 | + [Что такое _Application server_?](#Что-такое-application-server) 18 | + [Чем отличаются _Web server_ и _Application server_?](#Чем-отличаются-web-server-и-application-server) 19 | + [Что такое _AJAX_? Как принципиально устроена эта технология?](#Что-такое-ajax-Как-принципиально-устроена-эта-технология) 20 | + [Что такое _WebSocket_?](#Что-такое-websocket) 21 | + [Что такое _JSON_?](#Что-такое-json) 22 | + [Что такое _JSON схема_?](#Что-такое-json-схема) 23 | + [Что такое _cookies_?](#Что-такое-cookies) 24 | + [Что такое _«сессия»_?](#Что-такое-сессия) 25 | + [Что такое _«авторизация»_ и _«аутентификация»_? Чем они отличаются?](#Что-такое-авторизация-и-аутентификация-Чем-они-отличаются) 26 | 27 | ## Что такое _WWW_? 28 | __WWW, World Wide Web (Всемирная паутина)__ — распределённая система, предоставляющая доступ к связанным между собой документам, расположенным на различных компьютерах, подключённых к Интернету. Для обозначения этого термина также используют слово _web_. 29 | 30 | [к оглавлению](#Основы-web) 31 | 32 | ## Что такое _W3C_? 33 | __W3C, World Wide Web Consortium (Консорциум Всемирной паутины)__ — организация, разрабатывающая и внедряющая технологические стандарты для WWW. 34 | 35 | W3C разрабатывает для Интернета единые принципы и стандарты, называемые _«рекомендациями» (W3C Recommendations)_, которые затем внедряются производителями программ и оборудования. Таким образом достигается совместимость между программными продуктами и аппаратурой различных компаний. 36 | 37 | [к оглавлению](#Основы-web) 38 | 39 | ## Какие существуют уровни модели _OSI_? 40 | | # | Уровень (layer) | Тип данных (PDU) | Функции | Примеры | 41 | |--:|--------------------------------------------------|:-----------------------------------------:|----------------------------------------------------------|:--------------------------:| 42 | | 7 | Прикладной (application) | - | Доступ к сетевым службам | HTTP, FTP | 43 | | 6 | Представительский (представления) (presentation) | - | Представление и шифрование данных | ASCII, JPEG | 44 | | 5 | Сеансовый (session) | - | Управление сеансом связи | RPC, PAP | 45 | | 4 | Транспортный (transport) | Сегменты(segment) / Дейтаграммы(datagram) | Прямая связь между конечными пунктами и надежность | TCP, UDP | 46 | | 3 | Сетевой (network) | Пакеты (packet) | Определение маршрута и логическая адресация | IP, AppleTalk | 47 | | 2 | Канальный (data link) | Биты (bit) / Кадры (frame) | Физическая адресация | Ethernet, IEEE 802.2, L2TP | 48 | | 1 | Физический (physical) | Биты (bit) | Работа со средой передачи, сигналами и двоичными данными | USB, витая пара | 49 | 50 | [к оглавлению](#Основы-web) 51 | 52 | ## Что такое _TCP/IP_? 53 | __TCP/IP__ - это два основных сетевых протокола Internet. Часто это название используют и для обозначения сетей, работающих на их основе. 54 | 55 | __IP (Internet Protocol)__ - маршрутизируемый протокол, отвечающий за IP-адресацию, маршрутизацию, фрагментацию и восстановление пакетов. В его задачу входит продвижение пакета между сетями – от одного маршрутизатора до другого и тех пор, пока пакет не попадет в сеть назначения. В отличие от протоколов прикладного и транспортного уровней, протокол IP разворачивается не только на хостах, но и на всех шлюзах (маршрутизаторах). Этот протокол работает без установления соединения и без гарантированной доставки. 56 | 57 | В настоящее время используются следующие две версии протокола IP: 58 | 59 | + _IPv6_ — IP-адрес имеет разрядность 128 бит и записывается в виде восьми 16-битных полей, с использованием шестнадцатеричной системы счисления и с возможностью сокращения двух и более последовательных нулевых полей до `::`, например: `2001:db8:42::1337:cafe` 60 | + _IPv4_ — IP-адрес имеет разрядность 32 бита и записывается в виде четырех десятичных чисел в диапазоне 0 … 255 через точку, например: `192.0.2.34`. 61 | 62 | __TCP (Transfer Control Protocol)__ - протокол, обеспечивающий надежную, требующую логического соединения связь между двумя компьютерами. Отвечает за установление соединения, упорядочивание посылаемых пакетов и восстановление пакетов, потерянных в процессе передачи. 63 | 64 | Стек протоколов _TCP/IP_ включает в себя четыре уровня: 65 | 66 | 1. _канальный уровень (link layer)_ - например Ethernet, IEEE 802.11 Wireless Ethernet, физическая среда и принципы кодирования информации 67 | 2. _сетевой уровень (Internet layer)_ - например IP 68 | 3. _транспортный уровень (transport layer)_ - например TCP, UDP 69 | 4. _прикладной уровень (application layer)_ - например HTTP, FTP, DNS 70 | 71 | TCP-соединение двух узлов начинается с _handshake (рукопожатия)_: 72 | 73 | + Узел _A_ посылает узлу _B_ специальный пакет `SYN` — приглашение к соединению 74 | + _B_ отвечает пакетом `SYN-ACK` — согласием об установлении соединения 75 | + _A_ посылает пакет `ACK` — подтверждение, что согласие получено 76 | 77 | После этого _TCP соединение_ считается установленным и приложения, работающие в этих узлах, могут посылать друг другу пакеты с данными. 78 | 79 | В заголовке _TCP/IP_ пакета указывается: 80 | 81 | + IP-адрес отправителя 82 | + IP-адрес получателя 83 | + Номер порта 84 | 85 | [к оглавлению](#Основы-web) 86 | 87 | ## Что такое _UDP_? 88 | __UDP, User Datagram Protocol (Протокол пользовательских датаграмм)__ — протокол, который обеспечивает доставку без требований соединения с удаленным модулем UDP и обязательного подтверждения получения. 89 | 90 | К заголовку IP-пакета UDP добавляет всего четыре поля по 2 байта каждое: 91 | 92 | 1. _поле порта источника (source port)_ 93 | 2. _поле порта пункта назначения (destination port)_ 94 | 3. _поле длины (length)_ 95 | 4. _поле контрольной суммы (checksum)_ 96 | 97 | Поля «порт источника» и «контрольная сумма» не являются обязательными для использования в IPv4. В IPv6 необязательно только поле «порт отправителя». 98 | 99 | UDP используется _DNS_, _SNMP_, _DHCP_ и другими приложениями. 100 | 101 | [к оглавлению](#Основы-web) 102 | 103 | ## Чем отличаются _TCP_ и _UDP_? 104 | __TCP__ — ориентированный на соединение протокол, что означает необходимость «рукопожатия» для установки соединения между двумя хостами. Как только соединение установлено, пользователи могут отправлять данные в обоих направлениях. 105 | 106 | + _Надёжность_ — TCP управляет подтверждением, повторной передачей и тайм-аутом сообщений. Производятся многочисленные попытки доставить сообщение. Если оно потеряется на пути, сервер вновь запросит потерянную часть. В TCP нет ни пропавших данных, ни (в случае многочисленных тайм-аутов) разорванных соединений. 107 | + _Упорядоченность_ — если два сообщения последовательно отправлены, первое сообщение достигнет приложения-получателя первым. Если участки данных приходят в неверном порядке, TCP отправляет неупорядоченные данные в буфер до тех пор, пока все данные не могут быть упорядочены и переданы приложению. 108 | + _Тяжеловесность_ — TCP необходимо три пакета для установки соединения перед тем, как отправить данные. TCP следит за надёжностью и перегрузками. 109 | + _Потоковость_ — данные читаются как поток байтов, не передается никаких особых обозначений для границ сообщения или сегментов. 110 | 111 | __UDP__ — более простой, основанный на сообщениях протокол без установления соединения. Протоколы такого типа не устанавливают выделенного соединения между двумя хостами. Связь достигается путём передачи информации в одном направлении от источника к получателю без проверки готовности или состояния получателя. 112 | 113 | + _Ненадёжность_ — когда сообщение посылается, неизвестно, достигнет ли оно своего назначения — оно может потеряться по пути. Нет таких понятий как подтверждение, повторная передача, тайм-аут. 114 | + _Неупорядоченность_ — если два сообщения отправлены одному получателю, то порядок их достижения цели не может быть предугадан. 115 | + _Легковесность_ — никакого упорядочивания сообщений, никакого отслеживания соединений и т. д. Это лишь транспортный уровень. 116 | + _Датаграммы_ — пакеты посылаются по отдельности и проверяются на целостность только если они прибыли. Пакеты имеют определенные границы, которые соблюдаются после получения, то есть операция чтения на получателе выдаст сообщение таким, каким оно было изначально послано. 117 | + _Отсутствие контроля перегрузок_ — для приложений с большой пропускной способностью существует шанс вызвать коллапс перегрузок, если только они не реализуют меры контроля на прикладном уровне. 118 | 119 | [к оглавлению](#Основы-web) 120 | 121 | ## Что такое протокол передачи данных? Какие протоколы вы знаете? 122 | __Протокол передачи данных__ — набор соглашений интерфейса логического уровня, которые определяют обмен данными между различными программами. Эти соглашения задают единообразный способ передачи сообщений и обработки ошибок при взаимодействии программного обеспечения разнесённой в пространстве аппаратуры, соединённой тем или иным интерфейсом. 123 | 124 | Наиболее известные протоколы передачи данных: 125 | 126 | + HTTP (Hyper Text Transfer Protocol) 127 | + FTP (File Transfer Protocol) 128 | + POP3 (Post Office Protocol) 129 | + SMTP (Simple Mail Transfer Protocol) 130 | + TELNET (TErminaL NETwork) 131 | 132 | [к оглавлению](#Основы-web) 133 | 134 | ## Что такое _HTTP_ и _HTTPS_? Чем они отличаются? 135 | __HTTP, HyperText Transfer Protocol (Протокол передачи гипертекста)__ — протокол прикладного уровня передачи данных. 136 | 137 | Основой HTTP является технология «клиент-сервер»: 138 | 139 | + _Потребители (клиенты)_, которые инициируют соединение и посылают запрос; 140 | + _Поставщики (серверы)_, которые ожидают соединения для получения запроса, производят необходимые действия и возвращают обратно сообщение с результатом. 141 | 142 | Для идентификации ресурсов HTTP использует глобальные URI. 143 | 144 | HTTP не сохраняет своего состояния. Это означает отсутствие сохранения промежуточного состояния между парами «запрос-ответ». 145 | 146 | Структура протокола: 147 | 148 | 1. _Стартовая строка (starting line)_ — определяет тип сообщения; 149 | 2. _Заголовки (headers)_ — характеризуют тело сообщения, параметры передачи и прочие сведения; 150 | 3. _Тело сообщения (message body)_ — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой. 151 | 152 | Заголовки и тело сообщения могут отсутствовать, но стартовая строка является обязательным элементом, так как указывает на тип запроса/ответа. 153 | 154 | __HTTPS, HyperText Transfer Protocol Secure__ — расширение протокола HTTP, поддерживающее шифрование. Данные, передаваемые по протоколу HTTPS, «упаковываются» в криптографический протокол SSL или TLS, что обеспечивает защиту от атак, основанных на прослушивании сетевого соединения (при условии, что будут использоваться шифрующие средства и сертификат сервера проверен и ему доверяют). 155 | 156 | __Различия _HTTP_ и _HTTPS___: 157 | 158 | + HTTPS является расширением HTTP. 159 | 160 | + HTTP использует не зашифрованное соединение. Соединение по HTTPS поддерживает шифрование. 161 | 162 | + Работа по HTTP быстрей и менее ресурсоёмко, т.к. шифрование HTTPS требует дополнительных затрат. 163 | 164 | + Порты по умолчанию: в случае HTTP это TCP-порт `80`, для HTTPS - TCP-порт `443`. 165 | 166 | [к оглавлению](#Основы-web) 167 | 168 | ## Что такое _FTP_? 169 | __FTP, File Transfer Protocol (Протокол передачи файлов)__ — протокол передачи файлов между компьютерами в сети TCP. С его помощью можно подключаться к FTP-серверам, просматривать содержимое их каталогов и загружать файлы с сервера или на сервер. Протокол построен на архитектуре «клиент-сервер» и использует разные сетевые соединения для передачи команд и данных между клиентом и сервером. 170 | 171 | По умолчанию использует TCP-порт `21`. 172 | 173 | [к оглавлению](#Основы-web) 174 | 175 | ## Чем отличаются методы _GET_ и _POST_? 176 | __GET__ передает данные серверу используя URL, тогда как __POST__ передает данные, используя тело HTTP запроса. Длина URL ограничена 1024 символами, это и будет верхним ограничением для данных, которые можно отослать через GET. POST может отправлять гораздо большие объемы данных. Лимит устанавливается web-server и составляет обычно около 2 Mb. 177 | 178 | Передача данных методом POST более безопасна, чем методом GET, так как секретные данные (например пароль) не отображаются напрямую в web-клиенте пользователя, в отличии от URL, который виден почти всегда. Иногда это преимущество превращается в недостатком - вы не сможете послать данные за кого-то другого. 179 | 180 | [к оглавлению](#Основы-web) 181 | 182 | ## Что такое _MIME тип_? 183 | __MIME, Multipurpose Internet Mail Extension (Многоцелевые расширения Интернет-почты)__ — спецификация для передачи по сети файлов различного типа: изображений, музыки, текстов, видео, архивов и др. В HTML указание MIME-типа используется при передаче данных форм и вставки на страницу различных объектов. 184 | 185 | [к оглавлению](#Основы-web) 186 | 187 | ## Что такое _Web server_? 188 | __Web server (Веб-сервер)__ — сервер, принимающий HTTP-запросы от клиентов и выдающий им HTTP-ответы. Так называют как программное обеспечение, выполняющее функции web-сервера, так и непосредственно компьютер, на котором это программное обеспечение работает. 189 | 190 | Web-серверы могут иметь различные дополнительные функции, например: 191 | 192 | + автоматизация работы web-страниц; 193 | + ведение журнала обращений пользователей к ресурсам; 194 | + аутентификация и авторизация пользователей; 195 | + поддержка динамически генерируемых страниц; 196 | + поддержка HTTPS для защищённых соединений с клиентами. 197 | 198 | Наиболее известные web-серверы: 199 | 200 | + Apache 201 | + Microsoft IIS 202 | + nginx 203 | 204 | [к оглавлению](#Основы-web) 205 | 206 | ## Что такое _Web application_? 207 | __Web application (Веб-приложение)__ - клиент-серверное приложение, в котором клиентом выступает браузер, а сервером — web-сервер. Логика web application распределена между сервером и клиентом, хранение данных осуществляется, преимущественно, на сервере, а обмен информацией происходит по сети. Одним из преимуществ такого подхода является тот факт, что клиенты не зависят от конкретной операционной системы пользователя, поэтому web application является кроссплатформенным сервисом. 208 | 209 | [к оглавлению](#Основы-web) 210 | 211 | ## Что такое _Application server_? 212 | __Application Server (Сервер приложений)__ — программа, представляющая собой сервер, который занимается системной поддержкой приложений и обеспечивает их жизненный цикл в соответствии с правилами, определёнными в спецификациях. Может работать как полноценный самостоятельный web-сервер или быть поставщиком страниц для другого web-сервера. Обеспечивает обмен данными между приложениями и клиентами, берёт на себя выполнение таких функций, как создание программной среды для функционирующего приложения, идентификацию и авторизацию клиентов, организацию сессии для каждого из них. 213 | 214 | Наиболее известные серверы приложений Java: 215 | 216 | + Apache Tomcat 217 | + Jetty 218 | + JBoss 219 | + GlassFish 220 | + IBM WebSphere 221 | + Oracle Weblogic 222 | 223 | [к оглавлению](#Основы-web) 224 | 225 | ## Чем отличаются _Web server_ и _Application server_? 226 | Понятие web server относится скорее к способу передачи данных (конкретно, по протоколу HTTP), в то время как понятие Application server относится к способу выполнения этих самых приложений (конкретно, удаленная обработка запросов клиентов при помощи каких-то программ, размещенных на сервере). Эти понятия нельзя ставить в один ряд. Они обозначают разные признаки программы. Какие-то программы удовлетворяют только одному признаку, какие-то - нескольким сразу. 227 | 228 | Apache Tomcat умеет выполнять приложения? Да, значит он является application server. Apache Tomcat умеет отдавать данные по HTTP? - Да. Следовательно он является web server. 229 | 230 | Возьмите какую-нибудь базу данных, в которой на хранимых процедурах описана сложная логика и можно в ответ на SQL-запросы отправлять даже sms. Такую базу данных можно назвать application server, но web server - уже нет, потому что все это не работает с клиентом по HTTP протоколу. 231 | 232 | Возьмите чистый Apache, в котором не включены никакие модули для поддержки языков программирования. Он умеет отдавать только статичные файлы и картинки по протоколу HTTP. Это web server, но не application server. Включите модуль для поддержки PHP и разместите там программу на PHP, которая делает запросы к базе данных и динамически формирует страницы. Теперь Apache стал и application server. 233 | 234 | [к оглавлению](#Основы-web) 235 | 236 | ## Что такое _AJAX_? Как принципиально устроена эта технология? 237 | __AJAX, Asynchronous Javascript and XML (Асинхронный Javascript и XML)__ — подход к построению интерактивных пользовательских интерфейсов web-приложений, заключающийся в «фоновом» обмене данными браузера и web-сервера. В результате, при обновлении данных web-страница не перезагружается полностью и web-приложения становятся быстрее и удобнее. 238 | 239 | При использовании AJAX: 240 | 241 | 1. Пользователь заходит на web-страницу и взаимодействует с каким-нибудь её элементом. 242 | 2. Скрипт на языке JavaScript определяет, какая информация необходима для обновления страницы. 243 | 3. Браузер отправляет соответствующий запрос на web-сервер. 244 | 4. Web-сервер возвращает только ту часть документа, на которую пришёл запрос. 245 | 5. Скрипт вносит изменения с учётом полученной информации (без полной перезагрузки страницы). 246 | 247 | AJAX базируется на двух основных принципах: 248 | 249 | 1. использование технологии динамического обращения к серверу «на лету» (без перезагрузки страницы полностью) через динамическое создание: 250 | + _дочерних фреймов_; 251 | + _тега `<script>`_; 252 | + _тега `<img>`_. 253 | 2. использование _DHTML_ для динамического изменения содержания страницы; 254 | 255 | AJAX не является самостоятельной технологией, это концепция использования нескольких смежных технологий: 256 | 257 | + _(X)HTML_, _CSS_ для подачи и стилизации информации; 258 | + _DOM-модель_, операции над которой производятся Javascript на стороне клиента, для обеспечения динамического отображения и взаимодействия с информацией; 259 | + _XMLHttpRequest_ или другой транспорт (_IFrame_, _SCRIPT-тег_, _..._) для асинхронного обмена данными с web-сервером; 260 | + _JSON_ или любой другой подходящий формат (_форматированный HTML_, _текст_, _XML_, _..._) для обмена данными. 261 | 262 | [к оглавлению](#Основы-web) 263 | 264 | ## Что такое _WebSocket_? 265 | __WebSocket__ — протокол полнодуплексной связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и web-сервером в режиме реального времени. 266 | 267 | Протокол _WebSocket_ определяет две URI схемы 268 | 269 | + `ws:` - нешифрованное соединение 270 | + `wss:` - шифрованное соединение 271 | 272 | [к оглавлению](#Основы-web) 273 | 274 | ## Что такое _JSON_? 275 | __JSON, JavaScript Object Notation__ — текстовый формат обмена данными, основанный на JavaScript. 276 | 277 | JSON представляет собой (в закодированном виде) одну из двух структур: 278 | 279 | + _Набор пар «ключ:значение»_; 280 | + _Упорядоченный набор значений_. 281 | 282 | Ключом может быть только строка (регистрозависимая: имена с буквами в разных регистрах считаются разными). 283 | 284 | В качестве значений могут быть использованы: 285 | 286 | + _Объект_ — неупорядоченное множество пар «ключ:значение», заключённое в фигурные скобки `{ }`. Ключ описывается строкой, между ним и значением стоит символ `:`. Пары ключ-значение отделяются друг от друга запятыми; 287 | + _Массив (одномерный)_ — упорядоченное множество значений. Массив заключается в квадратные скобки `[ ]`. Значения разделяются запятыми. 288 | + _Число_; 289 | + _Литералы_ `true`, `false` и `null`; 290 | + _Строка_ — упорядоченное множество из нуля или более символов Unicode, заключенное в кавычки `" "`. Символы могут быть указаны с использованием escape-последовательностей, начинающихся с обратной косой черты `\`, или записаны шестнадцатеричным кодом в кодировке UTF-8 в виде `\uFFFF`. 291 | 292 | [к оглавлению](#Основы-web) 293 | 294 | ## Что такое _JSON схема_? 295 | __JSON Schema__ — один из языков описания структуры JSON-документа, используя синтаксис JSON. 296 | 297 | Это самоописательный язык: при его использовании для обработки данных и описания их допустимости могут использоваться одни и те же инструменты сериализации/десериализации. 298 | 299 | [к оглавлению](#Основы-web) 300 | 301 | ## Что такое _cookies_? 302 | __Сookies («куки»)__ — небольшой фрагмент данных, отправленный web-сервером и хранимый на устройстве пользователя. Всякий раз при попытке открыть страницу сайта, web-клиент пересылает соответствующие этому сайту cookies web-серверу в составе HTTP-запроса. Применяется для сохранения данных на стороне пользователя и на практике обычно используется для: 303 | 304 | + аутентификации пользователя; 305 | + хранения персональных предпочтений и настроек пользователя; 306 | + отслеживания состояния сеанса доступа пользователя; 307 | + ведения разнообразной статистики. 308 | 309 | [к оглавлению](#Основы-web) 310 | 311 | ## Что такое _«сессия»_? 312 | __Сессия__ – промежуток времени между первым и последним запросами, которые пользователь отправляет со своего устройства на сервер сайта. Завершается сессия в случае, если со стороны пользователя не поступало запросов в течение определенного промежутка времени или же при обрыве связи. 313 | 314 | [к оглавлению](#Основы-web) 315 | 316 | ## Что такое _«авторизация»_ и _«аутентификация»_? Чем они отличаются? 317 | __Аутентификация__ - это проверка соответствия субъекта и того, за кого он пытается себя выдать, с помощью некой уникальной информации (отпечатки пальцев, цвет радужки, голос и тд.), в простейшем случае - с помощью имени входа и пароля. 318 | 319 | __Авторизация__ - это проверка и определение полномочий на выполнение некоторых действий (например, чтение файла) в соответствии с ранее выполненной аутентификацией. 320 | 321 | Очевидно, что это разные понятия, но при этом без первого не может быть второго и наоборот. То есть имея разрешение на работу, вы не сможете оказаться на рабочем месте без предъявления пропуска, равно как и нет смысла в демонстрации пропуска, если вы не планируете работать. Именно тот факт, что одного не бывает без другого, и вызывает у людей заблуждение, что это одно и то же. 322 | 323 | [к оглавлению](#Основы-web) 324 | 325 | # Источники 326 | + [Википедия](https://ru.wikipedia.org/) 327 | 328 | [Вопросы для собеседования](README.md) 329 | -------------------------------------------------------------------------------- /xml.md: -------------------------------------------------------------------------------- 1 | [Вопросы для собеседования](README.md) 2 | 3 | # XML 4 | + [Что такое _XML_?](#Что-такое-xml) 5 | + [Что такое _DTD_?](#Что-такое-dtd) 6 | + [Чем _well-formed XML_ отличается от _valid XML_?](#Чем-well-formed-xml-отличается-от-valid-xml) 7 | + [Что такое «_пространство имен_» в XML?](#Что-такое-пространство-имен-в-xml) 8 | + [Что такое XSD? В чём его преимущества перед XML DTD?](#Что-такое-xsd-В-чём-его-преимущества-перед-xml-dtd) 9 | + [Какие типы существуют в XSD?](#Какие-типы-существуют-в-xsd) 10 | + [Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода.](#Какие-вы-знаете-методы-чтения-xml-Опишите-сильные-и-слабые-стороны-каждого-метода) 11 | + [Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы?](#Когда-следует-использовать-dom-а-когда-sax-stax-анализаторы)? 12 | + [Какие вы знаете способы записи XML?](#Какие-вы-знаете-способы-записи-xml) 13 | + [Что такое _JAXP_?](#Что-такое-jaxp) 14 | + [Что такое _XSLT_?](#Что-такое-xslt) 15 | 16 | ## Что такое _XML_? 17 | __XML, eXtensible Markup Language (расширяемый язык разметки)__ - язык с простым формальным синтаксисом, хорошо приспособленный для создания и обработки документов программами и одновременно удобный для чтения и создания документов человеком. 18 | 19 | XML расширяем, он не фиксирует разметку, используемую в документах и разработчик волен создавать разметку в соответствии с потребностями конкретной области, будучи ограниченным лишь синтаксическими правилами языка. 20 | 21 | [к оглавлению](#xml) 22 | 23 | ## Что такое _DTD_? 24 | __DTD, Document Type Definition (определение типа документа)__ — это заранее определённый свод правил, задающий связи между элементами и атрибутами. 25 | 26 | > Например, DTD для HTML гласит, что тэг `DIV` должен быть внутри тэга `BODY` и может встречаться многократно, `TITLE` — в `HEAD` и всего один раз, а `SCRIPT` – и там, и там сколь угодно раз. 27 | 28 | DTD обычно описывается непосредственно в документе в виде строки-формулировки, начинающейся с `<!DOCTYPE ... >` или отдельном файле. 29 | 30 | [к оглавлению](#xml) 31 | 32 | ## Чем _well-formed XML_ отличается от _valid XML_? 33 | В зависимости от уровня соответствия стандартам документ может быть «well-formed» («правильно построенный»), либо «valid» («действительный»). 34 | 35 | Основные признаки _well-formed XML_ следуют из формального описания стандарта: 36 | 37 | + Документ имеет ровно один корневой элемент, в котором лежат все остальные. То есть, `<document>...</document><appendix>...</appendix>` - это не XML-документ. 38 | + Все открытые теги обязаны быть закрыты. HTML, например, допускает не закрывать многие теги (`<p>`, `<body>`, `<li>`, `<td>` и многие другие). В XML так делать нельзя. 39 | + Для одиночных тегов (типа `<br>`) , чтобы отличать их от открывающих, предусмотрена специальная запись: `<br/>`. Но можно написать и полностью `<br></br>`. 40 | + Имена тегов регистрозависимые. Если вы открываете тег `<SiteDescription>`, то его надо закрывать именно таким же, `</sitedescription>` не допускается. 41 | + Теги не могут нарушать вложенность. Вот такого не должно быть: `<em><b>...</em></b>`. 42 | + Все атрибуты тегов обязаны быть заключены в двойные кавычки (`"`). 43 | + Есть три символа - `<`, `>` и `&`, которые обязаны быть экранированы везде с помощью `<`, `>` и `&`. Внутри атрибутов надо экранировать еще и двойную кавычку с помощью `"`. 44 | + Все символы в документе обязаны соответствовать заявленной кодировке. 45 | 46 | Документ является _valid_, если он сформирован с соблюдением всех синтаксических правил корректности конкретного XML, т.е. соответствует _DTD_. 47 | 48 | __*well-formed XML* - корректен синтаксически (может быть разобран парсером), а _valid XML_ - корректен как синтаксически так и семантически (удовлетворяет правилам заранее описанных словаря и грамматики (DTD)).__ 49 | 50 | [к оглавлению](#xml) 51 | 52 | ## Что такое «_пространство имен_» в XML? 53 | __Пространство имён XML (XML namespace)__ - это идентифицируемая с помощью ссылки URI коллекция имен, используемых в XML документах для обозначения типов элементов и именования атрибутов. Пространство имен XML отличается от тех «пространств имен», которые обычно используются в компьютерных дисциплинах, тем, что в варианте для XML оно имеет внутреннюю структуру, и, с математической точки зрения, набором не является. 54 | 55 | > Пространства имён объявляются с помощью XML атрибута `xmlns`, значением которого должен быть _URI_ и префикса, однозначно идентифицирующего пространство имён каждого элемента. 56 | 57 | Все имена элементов в пределах пространства имён должны быть уникальны. 58 | 59 | В общем случае пространство имён XML не требует, чтобы был определён его словарь. 60 | 61 | XML-документ может содержать имена элементов и атрибутов из нескольких словарей XML. В каждом словаре задано своё пространство имён — так разрешается проблема неоднозначности имён элементов и атрибутов. 62 | 63 | [к оглавлению](#xml) 64 | 65 | ## Что такое XSD? В чём его преимущества перед XML DTD? 66 | __XSD, XML Schema Definition, XML Schema (XML схема)__ — язык описания структуры XML-документа. В частности, XML Schema описывает: 67 | 68 | + _словарь_ - имена элементов и атрибутов; 69 | + _модель содержания_ - взаимосвязи между элементами и атрибутами, а также их 70 | + _структуру_ документа; 71 | + используемые _типы данных_. 72 | 73 | __Преимущества XSD перед DTD__ заключаются в следующем: 74 | 75 | + DTD, в отличии от XSD, не является XML и имеет свой собственный синтаксис. В связи с этим могут возникать разнообразные проблемы с кодировкой и верификацией XML-документов. 76 | 77 | + При использовании XSD XML-парсер может проверить не только правильность синтаксиса XML документа, но также его структуру, модель содержания и типы данных. В XML DTD существует лишь один тип данных – строка и если, например, в числовом поле будет текст, то документ всё же сможет пройти верификацию, так как XML DTD не сможет проверить тип данных. 78 | 79 | + Нельзя поставить в соответствие одному XML документу больше одного DTD. А следовательно и верифицировать документ можно лишь одним DTD описанием. XSD расширяем, и позволяет подключать несколько словарей для описания типовых задач. 80 | 81 | + XSD обладает встроенными средствами документирования, позволяющими создавать самодостаточные документы, не требующие дополнительного описания. 82 | 83 | [к оглавлению](#xml) 84 | 85 | ## Какие типы существуют в XSD? 86 | __Простой тип__ - это определение типа для значения, которое может использоваться в качестве содержимого элемента или атрибута. Этот тип данных не может содержать элементы или иметь атрибуты. 87 | 88 | ```xsd 89 | <xsd:element name='price' type='xsd:decimal'/> 90 | ... 91 | <price>45.50</price> 92 | ``` 93 | 94 | __Сложный тип__ - это определение типа для элементов, которые могут содержать атрибуты и другие элементы. 95 | 96 | ```xsd 97 | <xsd:element name='price'> 98 | <xsd:complexType base='xsd:decimal'> 99 | <xsd:attribute name='currency' type='xsd:string'/> 100 | </xsd:complexType> 101 | </xsd:element> 102 | ... 103 | <price currency='US'>45.50</price> 104 | ``` 105 | [к оглавлению](#xml) 106 | 107 | ## Какие вы знаете методы чтения XML? Опишите сильные и слабые стороны каждого метода. 108 | __DOM (Document Object Model)__ - _объектный_ - считывает XML, воссоздавая его в памяти в виде объектной структуры при этом XML документ представляется в виде набора тегов – узлов. Каждый узел может иметь неограниченное количество дочерних узлов. Каждый дочерний тоже может содержать несколько уровней потомков или не содержать их вовсе. Таким образом в итоге получается некое дерево. 109 | 110 | > ➖ Низкая скорость работы. 111 | 112 | > ➖ Расходует много памяти. 113 | 114 | > ➕ Прост в программировании. 115 | 116 | > ➕ Если в XML много объектов с перекрёстными ссылками друг на друга, достаточно дважды пройтись по документу: первый раз создать объекты без ссылок и заполнить словарь «название-объект», второй раз — восстановить ссылки. 117 | 118 | > ➕ При ошибке в XML в памяти остаётся полусозданная структура XML, которая будет автоматически уничтожена. 119 | 120 | > ➕ Пригоден как для чтения так и для записи. 121 | 122 | __SAX (Simple API for XML)__ _событийный_ - читает XML документ, реагируя на появляющиеся события (открывающий или закрывающий тег, строку, атрибут) вызовом предоставляемых приложением обработчиков событий. При этом, в отличии от DOM, не сохраняет документ в памяти. 123 | 124 | > ➕ Высокая скорость работы 125 | 126 | > ➕ Расходует мало памяти. 127 | 128 | > ➗ Довольно сложен в программировании. 129 | 130 | > ➖ Если в XML много объектов с перекрёстными ссылками друг на друга, надо организовать временное хранение строковых ссылок, чтобы потом, когда документ будет считан, преобразовать в указатели. 131 | 132 | > ➖ При ошибке в XML в памяти остаётся полусозданная структура предметной отрасли; программист должен своими руками корректно уничтожить её. 133 | 134 | > ➖ Пригоден только для чтения. 135 | 136 | __StAX (Stream API for XML)__ _потоковый_ - состоящий из двух наборов API для обработки XML, которые обеспечивают разные уровни абстракции. API с использованием курсора позволяет приложениям работать с XML как с потоком лексем (или событий); приложение может проверить статус анализатора и получить информацию о последней проанализированной лексеме, а затем перейти к следующей. Второй, высокоуровневый API, использующий итераторы событий, позволяет приложению обрабатывать XML как серию объектов событий, каждый из которых взаимодействует с фрагментом XML-структуры приложения. Всё, что требуется от приложения - это определить тип синтаксически разобранного события, отнести его к соответствующему конкретному типу и использовать соответствующие методы для получения информации, относящейся к событию. 137 | 138 | > ➗ Сохраняет преимущества, которые есть в SAX по сравнению с DOM. 139 | 140 | > ➕ Не основан на обратных вызовах обработчиков, приложению не придется обслуживать эмулированное состояние анализатора, как это происходит при использовании SAX. 141 | 142 | > ➖ Пригоден только для чтения. 143 | 144 | [к оглавлению](#xml) 145 | 146 | ## Когда следует использовать _DOM_, а когда _SAX_, _StAX_ анализаторы? 147 | 148 | DOM - естественный выбор, когда объектом предметной области является сам XML: когда нужно знать и иметь возможность изменять структуру документа, а также в случае многократного использования информации из документа. 149 | 150 | Для быстрого одноразового чтения оптимальным является использование SAX или StAX. 151 | 152 | [к оглавлению](#xml) 153 | 154 | ## Какие вы знаете способы записи XML? 155 | 156 | __Прямая запись__ - пишет XML тег за тегом, атрибут за атрибутом. 157 | 158 | > ➕ Высокая скорость работы. 159 | 160 | > ➕ Экономия памяти: при использовании не создаётся промежуточных объектов. 161 | 162 | > ➖ Пригоден только для записи. 163 | 164 | __Запись DOM (Document Object Model)__ - создаёт полную структуру XML и только потом записывает её. 165 | 166 | > ➖ Низкая скорость работы. 167 | 168 | > ➖ Не оптимальный расход памяти. 169 | 170 | > ➕ Пригоден как для записи так и для чтения. 171 | 172 | [к оглавлению](#xml) 173 | 174 | ## Что такое _JAXP_? 175 | __JAXP, The Java API for XML Processing (Java API для обработки XML)__ — набор API, упрощающих обработку XML данных в программах написанных на Java. Содержит реализации DOM, SAX и StAX парсеров, поддерживает XSLT и возможность работать с DTD. 176 | 177 | [к оглавлению](#xml) 178 | 179 | ## Что такое _XSLT_? 180 | __XSLT, eXtensible Stylesheet Language Transformations__ — язык преобразования XML-документов. 181 | 182 | XSLT создавался для применения в _XSL (eXtensible Stylesheet Language)_ - языке стилей для XML. Во время XSL-преобразования XSLT-процессор считывает XML-документ и таблицу(ы) стилей XSLT. На основе инструкций, которые процессор находит в таблице(ах) стилей XSLT, он вырабатывает новый XML-документ или его фрагмент. 183 | 184 | [к оглавлению](#xml) 185 | 186 | # Источники 187 | + [Википедия](https://ru.wikipedia.org/wiki/XML) 188 | + [CIT Forum](http://citforum.ru/internet/xnamsps/index.shtml#ns-decl) 189 | + [Quizful](http://www.quizful.net/interview/java/xml-and-parsers) 190 | 191 | [Вопросы для собеседования](README.md) 192 | --------------------------------------------------------------------------------