Что такое инкапсуляция?
В общем случае в разных языках программирования термин «инкапсуляция» относится к одной или обеим одновременно следующим нотациям:
– механизм языка, позволяющий ограничить доступ одних компонентов программы к другим;
– языковая конструкция, позволяющая связать данные с методами, предназначенными для обработки этих данных.
ссылка 1
Какие типы ссылок существуют в Java?
Strong reference
Weak Reference
Soft Reference
Phantom Reference
Soft-ссылка, в отличие от weak-ссылки, сможет отложить процесс удаления обьекта до тех пор, пока не появится острая нехватка памяти. Учитывая это отличие soft-ссылки от weak, первая больше подходит для кэшей, а weak для метаданных.
ссылка 1
ссылка 2
Как GarbageCollector очищает ссылки, которые ссылаются друг на друга?
Java GC рассматривает объекты “мусор”, если они недоступны через цепочку, начинающуюся с корня коллекции мусора, поэтому эти объекты будут собраны. Даже если объекты могут указывать друг на друга, чтобы сформировать цикл, они все еще мусор, если они отрезаны от корня.
ссылка 1
Временная сложность алгоритма:
В информатике временна́я сложность алгоритма определяет время работы, используемое алгоритмом, как функции от длины строки, представляющей входные данные. Она обычно выражается с использованием нотации «O» большое.
«O» большое и «o» малое — математические обозначения для сравнения асимптотического поведения (асимптотики) функций.
Линейная сложность подразумевает рост времени выполнения алгоритма пропорционально размеру входных данных. (пример: обход массива)
Константная временная сложность не зависит от размера входных данных. (пример: доступ по индексу к определенному элементу массива)
ссылка 1
ссылка 2
Методы сортировки:
Методы сортировки делятся на две группы: устойчивые и неустойчивые. К устойчивым сортировкам принадлежат:
– Пузырьковая Оn2
– Слиянием O(n logn)
– Вставкой On2
– С помощью двоичного дерева O(n logn)
К неустойчивым:
– Сортировка выбором On2
– Сортировка расчёской On2
– Сортировка Шелла On4/3
– Пирамидальная сортировка O(n logn)
– Быстрая (или Хоара) O(n logn)
ссылка 1
Какая сортировка используются в джаве?
java.util.Arrays.sort(prim[], …) — для сортировки массивов примитивов prim (int, byte, char, и т.д.). Использует алгоритм быстрой сортировки (quick sort).
java.util.Arrays.sort(T[], …) и java.util.Arrays.sort(Object[], …) — для сортировки массивов комплексных объектов произвольного типа T или Object. Использует алгоритм сортировки слиянием (merge sort).
java.util.Collections.sort() — для сортировки коллекций. Использует алгоритм сортировки слиянием (merge sort).
Начиная с 8-ки сортировка слиянием объявлена устаревшей и заменена на TimSort
ссылка 1
ссылка 2
ссылка 3
Всегда ли хеш код String кешируется и вычсляется только один раз?
Не всегда. Если в результате подсчета хеш кода впервые получается 0, то для этого значения хеш код будет пересчитан в следующий раз. (см. реализацию метода hashCode в String)
Какой размер boolean в Java и почему именно такой?
Минимальный размер этого типа 1 байт. Сделано это для удобства размещения значения в памяти и работе с ним. Например, в могопоточной среде.
Why does 128==128 return false but 127==127 return true when converting to Integer wrappers?
To save on memory, Java ‘reuses’ all the wrapper objects whose values fall in the following ranges:
– All Boolean values (true and false)
– All Byte values
– All Character values from \u0000 to \u007f (i.e. 0 to 127 in decimal)
– All Short and Integer values from -128 to 127.
ссылка 1
TreeMap vs Hashmap:
HashMap makes absolutely no guarantees about the iteration order. It can (and will) even change completely when new elements are added.
TreeMap will iterate according to the “natural ordering” of the keys according to their compareTo() method (or an externally supplied Comparator). Additionally, it implements the SortedMap interface, which contains methods that depend on this sort order.
LinkedHashMap will iterate in the order in which the entries were put into the map
ссылка 1
ссылка 2
Для чего нужнен loadFactor в HashMap?
float loadFactor – коэффициент заполнения HashMap. Равен отношению числа хранимых элементов в таблице к её размеру. Является мерой заполнения таблицы элементами, при превышении которой происходит автоматической перехеширование.
Другими словами, когда кол-во элементов в бакете начинает превышать (по умолчанию 75%) от всего количества элементов в таблице, HashMap производит автоматическую оптимизацию. А именно: добавляет еще один бакет и производит перехеширование (переразмещение) всех элементов таблицы. Поэтому, это очень плохо сказывается в том случае, если hashCode ключа всегда постоянный. HashMap не только вырождается в список, но еще присутствует постоянный рост бакетов и перехеширования элементов при добавлении нового.
ссылка 1
ссылка 2
Откуда взялся метод getLast в LinkedList? Ведь в List его нет.
LinkedList имплементирует сразу два интерфейса List и Deque. Другими словами, LinkedList – это и список, и очередь, и двухсторонняя очередь одновременно. Метод getLast пришёл как-раз из Deque.
Что такое Natural ordering?
The natural ordering of two objects a and b is the outcome of a.compareTo(b), i.e. what those objects themselves think which one is smaller, greater or equal to the other object. Normally a.compareTo(a) == 0 and if a.compareTo(b) <> 0 then b.compareTo(a) >< 0. The entire thing melts away when you think of integer numbers, e.g. 3 < 4, so 4 > 3 and 3 == 3
natural ordering ты сам реализуешь в Comparable. Посмотри, Collections.sort. Там два метода: один реализует natural ordering класса, второй – ты создаешь компаратор. А какой из них ты будешь использовать – твое личное дело.
ссылка 1
ссылка 2
Что такое красно-черное дерево?
Красно-чёрное дерево — это одно из самобалансирующихся двоичных деревьев поиска, гарантирующих логарифмический рост высоты дерева от числа узлов и быстро выполняющее основные операции дерева поиска: добавление, удаление и поиск узла.
ссылка 1
ссылка 2
Что такое самобалансирующееся двоичное дерево поиска?
Двоичное дерево поиска — это двоичное дерево, для которого выполняются следующие дополнительные условия (свойства дерева поиска):
1. Оба поддерева — левое и правое — являются двоичными деревьями поиска.
2. У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, нежели значение ключа данных самого узла X.
3. У всех узлов правого поддерева произвольного узла X значения ключей данных больше либо равны, нежели значение ключа данных самого узла X.
Очевидно, данные в каждом узле должны обладать ключами, на которых определена операция сравнения меньше.
ссылка 1
Что такое расширяющееся дерево?
Расширяющееся (англ. splay tree) или косое дерево является двоичным деревом поиска, в котором поддерживается свойство сбалансированности. Это дерево принадлежит классу «саморегулирующихся деревьев», которые поддерживают необходимый баланс ветвления дерева, чтобы обеспечить выполнение операций поиска, добавления и удаления за логарифмическое время от числа хранимых элементов.
ссылка 1
ссылка 2
Что такое сбалансированное дерево?
В этой главе будет рассматриваться другая разновидность бинарных поисковых деревьев – AVL-деревья или сбалансированные двоичные деревья с минимальным временем поиска по дереву. Это свойство AVL-деревьев обеспечивается их сбалансированностью, которая одновременно усложняет алгоритмы для вставки узлов в дерево и их последующего удаления.
ссылка 1
Java 8:
Java 8 (codename: Spider) was released on March 18, 2014, and included some features that were planned for Java 7 but later deferred.
Work on features was organized in terms of JDK Enhancement Proposals (JEPs).
JSR 335, JEP 126: Language-level support for lambda expressions (officially, lambda expressions; unofficially, closures) under Project Lambda and default methods (virtual extension methods) which allow the addition of methods to interfaces without breaking existing implementations. There was an ongoing debate in the Java community on whether to add support for lambda expressions. Sun later declared that lambda expressions would be included in Java and asked for community input to refine the feature. Supporting lambda expressions also allows the performance of functional-style operations on streams of elements, such as MapReduce-inspired transformations on collections. Default methods allow an author of an API to add new methods to an interface without breaking the old code using it. Although it was not their primary intent, default methods also allow multiple inheritance of behavior (but not state).
JSR 223, JEP 174: Project Nashorn, a JavaScript runtime which allows developers to embed JavaScript code within applications
JSR 308, JEP 104: Annotation on Java Types
Unsigned Integer Arithmetic
JSR 337, JEP 120: Repeating annotations
JSR 310, JEP 150: Date and Time API
JEP 178: Statically-linked JNI libraries
JEP 153: Launch JavaFX applications (direct launching of JavaFX application JARs)
JEP 122: Remove the permanent generation
Java 8 is not supported on Windows XP but as of JDK 8 update 25, it can still be installed and run under Windows XP. Previous updates of JDK 8 could be run under XP, but had to be installed after a forced installation by directly unzipping files from the installation executable.
From October 2014, Java 8 was the default version to download from the official website. “Oracle will not post further updates of Java SE 8 to its public download sites for commercial use after September 2018”.
ссылка 1
ссылка 2
ссылка 3
Допустим есть выражение IntStream.of(1, 7, 9).filter(x -> x < 5).map(x -> x + 1).limit(2).forEach(System.out::print). Какой метод итерирует коллекцию?
У стримов есть некоторые особенности. Одна из них: обработка не начнётся до тех пор, пока не будет вызван терминальный оператор. В данном случае это forEach.
ссылка 1
ссылка 2
Чем интерфейсы в Java 8 отличаются от абстрактых классов?
Во-первых, интерфейсы по-прежнему не могут хранить состояние, в отличие от тех же абстрактных классов. Хотя теперь, они напротив могут задавать некое дефолтное поведение. Во-вторых, ограничение на кол-во прямых родителей / наследников у классов как было единицей, так и осталось. Но вот интерфейсов то мы всегда могли имплементить сколь угодно много. И вот он – самый главный чит восьмерки – теперь у нас есть возможность практически полноценного множественного наследования!
ссылка 1
ссылка 2
Что будет если класс имплементирует два интерфейса с одним и тем же методом?
Если это не дефолтный метод – то ничего страшного. Метод будет импелементирован в классе и полиморфно будет вызываться на каждом из интерфейсов.
Что такое Execution Service?
До Java 5 для организации работы с несколькими потоками приходилось использовать сторонние имплеменации пулинга или писать свой. С появлением ExecutorService такая необходимость отпала.
ExecutorService исполняет асинхронный код в одном или нескольких потоках. Создание инстанса ExecutorService’а делается либо вручную через конкретные имплементации (ScheduledThreadPoolExecutor или ThreadPoolExecutor), но проще будет использовать фабрики класса Executors. Например, если надо создать пул с 2мя потоками, то делается это так:
ExecutorService service = Executors.newFixedThreadPool(2);
Если требуется использовать кэширующий пул потоков, который создает потоки по мере необходимости, но переиспользует неактивные потоки (и подчищает потоки, которые были неактивные некоторое время), то это задается следующим образом:
ExecutorService service = Executors.newCachedThreadPool();
ссылка 1
ссылка 2
ссылка 3
Как остановить поток в джаве?
Все потоки нужно прерывать при помощи метода interrupt().
В самом потоке, который возможно будет прерван – нужно устанавливать проверки isInterrupted() во всех ключевых точках (где это необходимо) и обрабатывать соответственно.
Вообще в java doc не рекомендуют пользоваться deprecated методами (такими как Thread.stop()). Метод Thread.stop() убивает поток не обрабатывая и самое главное –
поток может быть «убит» во время выполнения операции, обрыв которой на полуслове оставит некоторый объект в неправильном состоянии, что приведет к появлению трудноотлавливаемой и случайным образом возникающей ошибке
ссылка 1
ссылка 2
Что такое ForkJoinPool в Java?
Благодаря ForkJoinPool можно в небольшом количестве потоков выполнить существенно большее число задач. Это достигается путём так называемого work-stealing’а, когда спящая задача на самом деле не спит, а выполняет другие задачи. Можно выделить две фазы работы с ForkJoin. Сначала форкаем подзадачи, а затем их джойним. Между этими двумя фазами и происходит работа над выполнением всех подзадач.
ссылка 1
Что такое атомарные операции и может ли volatile обеспечить атомарность?
For the purposes of the Java programming language memory model, a single write to a non-volatile long or double value is treated as two separate writes: one to each 32-bit half. This can result in a situation where a thread sees the first 32 bits of a 64-bit value from one write, and the second 32 bits from another write.
Writes and reads of volatile long and double values are always atomic.
Writes to and reads of references are always atomic, regardless of whether they are implemented as 32-bit or 64-bit values.
ссылка 1
HOLLYWAR DETECTED:
ссылка 2
++long атомарна или нет?
В Java атомарными являются операции чтения/записи всех примитивных типов данных за исключением типов long и double, поскольку эти типы данных занимают два машинных слова, и операции чтения/записи являются составными операциями из двух атомарных операций над старшими и младшими битами числа соответственно.
ссылка 1
ссылка 2
Что такое семафор?
Семафоры представляют еще одно средство синхронизации для доступа к ресурсу. В Java семафоры представлены классом Semaphore из пакета java.util.concurrent.
Для управления доступом к ресурсу семафор использует счетчик, представляющий количество разрешений. Если значение счетчика больше нуля, то поток получает доступ к ресурсу, при этом счетчик уменьшается на единицу. После окончания работы с ресурсом поток освобождает семафор, и счетчик увеличивается на единицу. Если же счетчик равен нулю, то поток блокируется и ждет, пока не получит разрешение от семафора.
ссылка 1
Что такое Long pooling?
Выглядит это примерно следующим образом:
1) Клиент отсылает на сервер обычный ajax-запрос
2) Сервер, вместо того, чтобы быстро обработать этот запрос и отправить ответ клиенту, запускает цикл, в каждой итерации которого следит за возникновением событий (другой клиент добавил запись или удалил).
3) При возникновении события сервер генерирует ответ и отсылает его клиенту, таким образом завершая запрос.
4) Клиент, получив ответ от сервера, запускает обработчик события и параллельно отправляет очередной «длинный» запрос серверу.
ссылка 1
ссылка 2
Метод транзакции в спринге:
При декларативном способе описания транзакционного метода в спринге используется аспектная аннотация.
При программном способе описания – используется особый бин который отвечает за транзакцию.
ссылка 1
ссылка 2
ссылка 3
В чем практический смысл Spring aliasing?
Два бина с одним именем в spring создать нельзя. Однако можно перекрыть первый бин вторым при помощи alias. К примеру, у тебя есть две базы данных. Одна тестовая, а другая промышленная. Тебе не хочется каждый раз при тесте менять название полей в бинах, которые используют базу. Тут на помощь и приходит alias. Плюс при переименованиях бинов alias используется для обратной совместимости. Вещь редко используется, но всё же используется.
ссылка 1
Отличия свойств margin и padding
Создавать промежутки между элементами можно и тем, и другим способом, но если padding – это отступ от содержимого до края блока, то margin – это расстояние от одного блока до другого, межблоковое пространство.
ссылка 1
Расскажите про уровни изолированности в базах данных:
-Read uncommitted (чтение незафиксированных данных)
-Read committed (чтение фиксированных данных)
-Repeatable read (повторяемость чтения)
-Serializable (упорядочиваемость)
ссылка 1
ссылка 2
ссылка 3
Как устроена лямбда внутри?
В Oracle JRE 8 metafactory динамически генерирует Java класс, используя ObjectWeb Asm, который и создает класс-реализацию функционального интерфейса. К созданному классу могут быть добавлены дополнительные поля, если лямбда-выражение захватывает внешние переменные. Этот похоже на анонимные классы Java, но есть следующие отличия:
- Анонимный класс генерируется компилятором Java.
- Класс для реализации лямбда-выражения создается JVM во время выполнения.
Что находится в стеке?
В стеке хранится контекст исполняемых функций, а именно их локальные переменные, переданные в них аргументы, а также адрес возврата и возвращаемое значение. В зависимости от того какой тип имеют эти переменные (ссылочный или примитивный) в стеке могут лежать либо сами значения, либо адрес на место в куче.
ссылка 1
Почему пароль предпочтительней хранить в массиве символов а не строке?
ссылка 1




