Изучаем Java. По вопросам сотрудничества: @seniorvladislav
#вопросы_с_собеседований
Что такое «абсолютный путь» и «относительный путь»?
Абсолютный (полный) путь — это путь, который указывает на одно и то же место в файловой системе, вне зависимости от текущей рабочей директории или других обстоятельств. Полный путь всегда начинается с корневого каталога.
Относительный путь представляет собой путь по отношению к текущему рабочему каталогу пользователя или активного приложения.
#вопросы_с_собеседований
Как одной строкой преобразовать HashSet в ArrayList?
Ответ на картинке.
#вопросы_с_собеседований
Что такое тернарный оператор выбора?
Тернарный условный оператор ?: - оператор, которым можно заменить некоторые конструкции операторов if-then-else.
Выражение записывается в следующей форме:
условие ? выражение1 : выражение2
Если условие выполняется, то вычисляется выражение1 и его результат становится результатом выполнения всего оператора. Если же условие равно false, то вычисляется выражение2 и его значение становится результатом работы оператора. Оба операнда выражение1 и выражение2 должны возвращать значение одинакового (или совместимого) типа.
Поиск верхних K элементов в массиве Java
TreeSet имеет красно-черную древовидную структуру данных в качестве основы. В результате добавление значения к этому набору стоит O (log n). TreeSet - это отсортированная коллекция. Поэтому мы можем поместить все значения в набор деревьев и извлечь первые k из них.
Временная сложность этого решения равна O (n * log n). Прежде всего, предполагается, что это более эффективно, чем метод грубой силы, если k ≥ log n .
Важно помнить, что TreeSet не содержит дубликатов. В результате решение работает только для входного массива с различными значениями.
Другие варинаты решения можно посмотреть здесь.
#вопросы_с_собеседований
Можно ли объявить метод абстрактным и статическим одновременно?
Нет. В таком случае компилятор выдаст ошибку: "Illegal combination of modifiers: ‘abstract’ and ‘static’". Модификатор abstract говорит, что метод будет реализован в другом классе, а static наоборот указывает, что этот метод будет доступен по имени класса.
#вопросы_с_собеседований
Что такое volatile переменная?
Ключевое слово volatile используется в многопоточном программировании для обеспечения безопасности потока, поскольку модификация одной изменяемой переменной видна всем другим потокам, поэтому одна переменная может использоваться одним потоком за раз.
При помощи ключевого слова volatile можно гарантировать, что переменная будет потокобезопасна и будет храниться в общей памяти, и потоки не будут ее брать себе в свой кеш.
Как это выглядит?
private volatile AtomicInteger count;
Просто добавляем к переменной volatile.
Но это не говорит о полной потокобезопасности… Ведь операции могут быть не атомарны над переменной. Но можно использовать Atomic классы, которые делают операцию атомарно, то есть за одно выполнение процессором.
Таких классов можно много найти в пакете java.util.concurrent.atomic.
#вопросы_с_собеседований
Объясните выражение System.out::println.
Данное выражение иллюстрирует механизм instance method reference: передачи ссылки на метод println() статического поля out класса System.
Цикл foreach
JDK 1.5 представила новый цикл for, известный как цикл foreach или расширенный цикл for, который позволяет последовательно пройти весь массив без использования индекса переменной.
Следующий код отображает все элементы в массиве myList.
Методы start и end
Выше представлен пример, в котором производится подсчет количества раз, когда в строке ввода встречается слово "кот".
Как видим, в данном примере используются границы слов с целью удостоверения в том, что буквы "c" "a" "t" не являются частью другого слова. Также отображаются определенные полезные сведения касательно нахождения совпадения в вводимой строке.
Метод start производит возврат начального индекса в последовательности, захваченной в данной группе в ходе предыдущей операции поиска совпадений, а end производит возврат индекса к последнему совпавшему символу, плюс один.
#вопросы_с_собеседований
К каким конструкциям Java применим модификатор static?
☕️ полям;
☕️ методам;
☕️ вложенным классам;
☕️ статическим блокам инициализации;
☕️ членам секции import.
Получение обратного массива
Используем библиотеку Apache Commons Lang.
Библиотека Apache Commons Lang представляет собой набор служебных классов для упрощения работы с классами пакета java.lang.*.
Метод concat()
Возвращает строку со значением строки, переданной в метод и приложенной к концу строки, используемой для вызова этого метода.
Проще говоря метод concat() в Java объединяет строки, путем добавления одной строки в конец к другой.
Язык программирования Java - зачем его учить и что на нем пишут
0:00 Вступление
0:10 Какие из этих программ написаны на Java?
0:33 История создания Java
1:34 Как применяется Java
3:10 Популярные фреймворки
4:37 Архитектура приложений - виртуальная машина, управление памятью
6:40 Типизация в Java
7:30 Другие особенности Java
8:05 Зарплаты разработчиков на Java
9:01 Мой опыт работы с Java
12:05 Как начать писать на Java
12:40 Ответы на вопрос из начала видео
Смотреть видео
Log4j
Log4j – библиотека, взявшая на себя обязанности по избавлению разработчика от лишней головной боли при организации логирования в приложении. Она инкапсулирует почти все операции (прямая работа с файлами логов, оформление логов, разграничение уровней логирования), предоставляя разработчику удобный и минималистичный интерфейс взаимодействия с логами.
После подключения и быстрой настройки библиотеки работа с логами будет сведена к коду на картинке. После выполнения кода в лог будет записано что-то вроде:
2022-02-05 15:00 DEBUG MainClass:5 — Сообщение об баге
2022-02-05 15:00 ERROR MainClass:6 — Сообщениe об ошибке
2022-02-05 15:00 WARN MainClass:7 — Предупреждение
2022-02-05 15:00 INFO MainClass:8 — Информация
Подробнее о библиотеке можно узнать на сайте разработчика.
JIT-оптимизация
Java-код обрабатывается с помощью JIT-компиляции: сначала транслируется в платформонезависимый байт-код, а уже после этого в машинный код. При этом оптимизируется все, что возможно, и разработчик может помочь компилятору создать максимально эффективную программу.
В качестве примера взглянем на две простые операции:
// 1Измерим время выполнения каждой из них. Запустив код с картинки несколько раз, получим подобные цифры, отображающие время выполнения:
n += 2 * i * i;
// 2
n += 2 * (i * i);
#вопросы_с_собеседований
Чем полезны неизменяемые объекты?
Неизменяемость (immutability) помогает облегчить написание многопоточного кода. Неизменяемый объект может быть использован без какой-либо синхронизации. К сожалению, в Java нет аннотации @Immutable
, которая делает объект неизменяемым, для этого разработчикам нужно самим создавать класс с необходимыми характеристиками.
Для этого необходимо следовать некоторым общим принципам: инициализация всех полей только в конструкторе, отсутствие методов setX() вносящих изменения в поля класса, отсутствие утечек ссылки, организация отдельного хранилища копий изменяемых объектов и т.д.
#вопросы_с_собеседований
Можно ли одновременно использовать в сервлете PrintWriter и ServletOutputStream?
Ответ:
Так сделать не получится, т.к. при попытке одновременного вызова getWriter() и getOutputStream() будет выброшено исключение java.lang.IllegalStateException с сообщением, что уже был вызван другой метод.
📂 Ищем файлы в хранилище на Java
Даже самая примитивная программа в виде плеера или галереи должна иметь в себе возможность поиска файлов в папках на диске устройства. Это та функция, без которой не может существовать практически ни одно нормальное Android-приложение.
Именно поэтому автор простым языком объясняет, как это реализовать на Java, а также рассказывает о всех нюансах и проблемах, с которыми вы можете столкнуться.
https://youtu.be/OaltzA7uCRY
#вопросы_с_собеседований
Какие классы и интерфейсы доступны в Collection фреймворке?
Интерфейсы:
• Collection;
• List;
• Set;
• Map;
• Sorted Set;
• Sorted Map;
• Queue.
Классы:
• Lists(ArrayList, LinkedList, Vector(deprecated))
• Sets(HashSet, LinkedHashSet, TreeSet)
• Maps(HashMap, TreeMap, HashTable (deprecated), LinkedHashMap)
• Queue(Priority Queue)
#вопросы_с_собеседований
Что такое модификаторы доступа?
Модификаторы доступа — это инструмент, при помощи которого можно настроить доступ к классам, методам и переменным.
Бывают следующие модификаторы, упорядоченные в порядке повышения доступа:
1) private — используется для методов, полей и конструкторов. Уровень доступа — только класс, внутри которого он объявлен.
2) package-private(default) — может использоваться для классов. Доступ только в конкретном пакете (package), в котором объявлен класс, метод, переменная, конструктор.
3) protected — такой же доступ, как и package-private + для тех классов, которые наследуются от класса с модификатором protected.
4) public — используется и для классов. Полноценный доступ во всем приложении.
#вопросы_с_собеседований
Где и для чего используется модификатор abstract?
Класс, помеченный модификатором abstract, называется абстрактным классом. Такие классы могут выступать только предками для других классов. Создавать экземпляры самого абстрактного класса не разрешается. При этом наследниками абстрактного класса могут быть как другие абстрактные классы, так и классы, допускающие создание объектов.
Метод, помеченный ключевым словом abstract - абстрактный метод, т.е. метод, который не имеет реализации. Если в классе присутствует хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным.
Использование абстрактных классов и методов позволяет описать некий шаблон объекта, который должен быть реализован в других классах. В них же самих описывается лишь некое общее для всех потомков поведение.
Проверка четности или нечетности числа без использования оператора %
Хотя этот трюк не намного лучше, чем использование оператора %, но иногда он все-таки более эффективен (с большими числами).
Захват координат курсора
Чтобы захватить события мыши, необходимо реализовать интерфейс MouseMotionListener. Когда курсор попадает в определенную область, срабатывает обработчик события mouseMoved, из которого можно получить точные координаты.
Вопросы с реального собеседования Senior Java Developer
Сегодня мы рассмотрим обзор реального интервью на позицию Senior Java Developer.
Таймкоды:
00:00 Приветствие
01:34 Введение
02:23 Разбор вопросов и ответов
03:10 Может ли разработчик управлять памятью в Java?
03:40 Как потоки связаны с памятью?
07:28 Spring Context и зачем он нужен?
08:10 Как работает аннотация @Transactional
?
09:45 Как работает транзакция?
10:30 Как работает TDD?
14:17 Выводы
17:52 Прощание
Смотреть видео
Содержит ли массив указанный элемент
Для этого используем прием с представлением массива в виде коллекции и вызовом привычного метода contains().
Защищаем свой код от багов: обзор пяти статических анализаторов для Java-кода
Смотреть статью
#вопросы_с_собеседований
Чем различаются Enumeration и Iterator?
Хотя оба интерфейса и предназначены для обхода коллекций между ними имеются существенные различия:
• с помощью Enumeration нельзя добавлять/удалять элементы;
• в Iterator исправлены имена методов для повышения читаемости кода (Enumeration.hasMoreElements() соответствует Iterator.hasNеxt(), Enumeration.nextElement() соответствует Iterator.nеxt() и т.д);
• Enumeration присутствуют в устаревших классах, таких как Vector/Stack, тогда как Iterator есть во всех современных классах-коллекциях.
#вопросы_с_собеседований
В чем разница между классами java.util.Collection и java.util.Collections?
java.util.Collections (подробнее можно почитать здесь) — набор статических методов для работы с коллекциями.
java.util.Collection (подробнее можно почитать здесь) — один из основных интерфейсов Java Collections Framework.
new vs valueOf
Старайтесь всегда использовать метод valueOf
вместо конструктора в стандартных классах-оболочках примитивных типов, кроме тех случаев, когда вам нужно конкретно выделить память под новое значение. Сейчас объясню, почему.
Все оболочки, кроме чисел с плавающей точкой, от Byte до Long, имеют кэш. По умолчанию этот кэш содержит значения от -128 до 127. Следовательно, если ваше значение попадает в этот диапазон, то значение вернется из кэша. Значение из кэша достается в 3.5 раза быстрее, чем при использовании конструктора, плюс идёт экономия памяти.
Помимо этого, наиболее часто используемые значения могут также быть закэшированы компилятором и виртуальной машиной.