ar
Feedback
Java Geek

Java Geek

الذهاب إلى القناة على Telegram

Практичные советы, лайфхаки и код для Java-разработчиков. Каждый пост — реальная польза. Учим Java на примерах. По всем вопросам @evgenycarter

إظهار المزيد
2 449
المشتركون
لا توجد بيانات24 ساعات
+27 أيام
+530 أيام
أرشيف المشاركات
ByteBuffer ByteBuffer используется для работы с байтовыми данными. Он позволяет читать и записывать байты в буфер в памяти. О
ByteBuffer ByteBuffer используется для работы с байтовыми данными. Он позволяет читать и записывать байты в буфер в памяти. Основные способы использования: — Чтение/запись байтовых данных из файлов, сетевых соединений и других источников. ByteBuffer обеспечивает эффективный доступ к данным без копирования. — Преобразование между байтами и другими типами данных как примитивными (int, float), так и объектными. Можно получить доступ к байтам объекта или записать объект в байтовое представление. — Компактное хранение данных в оперативной памяти. ByteBuffer располагается в памяти даже в случае больших объемов данных. — Обработка байтовых данных как потока байт. Можно последовательно читать или записывать данные в буфер. — Доступ к данным «по смещению» без копирования. Можно получить «вид» на часть буфера. 👉 @java_geek

Может ли метод принимать аргументы переменной длины? В Java метод может принимать переменное количество аргументов двумя основными способами: — Используя массив в качестве параметра. При определении метода указывается, что один из параметров — это массив некоторого типа. При вызове метода в этот параметр можно передать массив нужной длины. — Используя специальный синтаксис с многоточием. При определении метода один из параметров объявляется с многоточием после типа. Это говорит компилятору, что это параметр переменной длины. При вызове в него можно передать сколько угодно аргументов указанного типа. Таким образом метод становится более гибким и его можно вызывать с разным количеством аргументов в зависимости от ситуации. Это избавляет от необходимости перегружать метод для разного числа параметров. 👉 @java_geek

ListIterator ListIterator — это интерфейс итератора, предназначенный специально для работы со списками. В отличие от обычного
ListIterator ListIterator — это интерфейс итератора, предназначенный специально для работы со списками. В отличие от обычного Iterator, ListIterator позволяет не только итерировать список в прямом направлении, но и в обратном. Он поддерживает операции для перемещения вперед и назад по списку. ListIterator реализует методы: — next(): переход к следующему элементу. — previous(): переход к предыдущему элементу. — hasNext(): проверка, есть ли следующий элемент. — hasPrevious(): проверка, есть ли предыдущий элемент. — add(): добавление элемента в список. ListIterator часто используется, когда нужно пройти по списку в обоих направлениях. Например, чтобы сначала обработать элементы в прямом порядке, а затем в обратном. Или чтобы вставить элементы в произвольное место списка. 👉 @java_geek

Создание подклассов исключений Для того чтобы создать класс собственного исключения, достаточно определить его как производны
Создание подклассов исключений Для того чтобы создать класс собственного исключения, достаточно определить его как производный от класса Exception. В подклассах собственных исключений совсем не обязательно реализовать что-нибудь. В самом классе Exception не определено никаких методов. Зачастую указывать описание исключения непосредственно при его создании очень удобно, но иногда для этого лучше переопределить метод toString(). 👉 @java_geek

Почему Map не наследуется от Collection? Это связано с тем, что Map представляет отображение ключ-значение, в то время как Collection представляет коллекцию объектов. Коллекции работают с объектами на основе их позиции в коллекции, тогда как в Map объекты доступны по ключу. Поэтому операции, определенные в Collection, такие как добавление, получение по индексу и итерация, не имеют смысла для Map. Вместо этого в Map определены операции для работы с парами ключ-значение, такие как put(), get(), containsKey() и другие. Наследование Map от Collection привело бы к наследованию неподходящих методов. 👉 @java_geek

Почему строка является популярным ключом в HashMap в Java? Поскольку строки неизменяемы, их хэш код вычисляется и кэшируется в момент создания, не требуя повторного пересчета при дальнейшем использовании. Поэтому в качестве ключа HashMap они будут обрабатываться быстрее. 👉 @java_geek

System.arraycopy System.arraycopy используется для копирования элементов из одного массива в другой. Этот метод предоставляет
System.arraycopy System.arraycopy используется для копирования элементов из одного массива в другой. Этот метод предоставляет эффективный способ копирования данных между массивами. Синтаксис System.arraycopy: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) Параметры метода включают: src: Исходный массив, из которого вы хотите скопировать элементы. srcPos: Начальная позиция в исходном массиве, с которой начнется копирование. dest: Целевой массив, в который вы хотите скопировать элементы. destPos: Начальная позиция в целевом массиве, куда будут скопированы элементы. length: Количество элементов, которое вы хотите скопировать. 👉 @java_geek

ConcurrentSkipListSet ConcurrentSkipListSet — это thread-safe реализация отсортированного множества на основе skip list. Элем
ConcurrentSkipListSet ConcurrentSkipListSet — это thread-safe реализация отсортированного множества на основе skip list. Элементы в нем хранятся в сбалансированной иерархии, похожей на связный список и дубликаты не допускаются, также поддерживает unicity элементов. Автоматически сортирует элементы по естественному порядку или компаратору. Все основные методы потокобезопасны из коробки. Подходит для частого добавления/удаления/поиска элементов из разных потоков. Масштабируется лучше чем synchronized Set при увеличении количества потоков. ConcurrentSkipListSet используется в многопоточных приложениях для хранения уникальных элементов в отсортированном порядке, выполнения быстрых операций поиска, добавления, удаления за время O(log n), избежания проблем синхронизации. 👉 @java_geek

BufferedInputStream BufferedInputStream — это конкретный подкласс FilterInputStream, который оборачивает (буферизует) входной
BufferedInputStream BufferedInputStream — это конкретный подкласс FilterInputStream, который оборачивает (буферизует) входной поток в буферизованный поток, делая операции чтения на потоке более эффективными и быстрыми. BufferedInputStream используется для ускорения ввода, уменьшая количество чтений с диска или файла, добавляя дополнительный уровень функциональности вокруг базового потока. В этом примере мы создаем объект FileInputStream для чтения файла test.txt. Затем мы оборачиваем этот поток в BufferedInputStream, чтобы увеличить эффективность чтения. Мы читаем каждый байт из файла и выводим его на консоль. После завершения чтения мы закрываем оба потока. Например, если файл test.txt содержит строку «Привет, мир!». Тогда результатом выполнения этого кода будет вывод этой строки на консоль. 👉 @java_geek

Что может произойти если два потока будут выполнять один и тот же код в программе? В многопоточных приложениях возможны ситуации, когда два или более потока пытаются получить доступ и изменить общие данные одновременно. Это может привести к непредсказуемому поведению и ошибкам, таким как race condition или deadlock. Чтобы избежать таких проблем, нужно предотвратить одновременный доступ к общим данным с помощью синхронизации, например используя мониторы или блокировки. Также полезны инструменты высокого уровня для синхронизации, такие как семафоры, очереди производителя-потребителя и другие коллекции из java.util.concurrent. Важно тщательно продумывать доступ к общим данным в многопоточных приложениях, чтобы избежать некорректного поведения. Хороший дизайн многопоточности поможет создать надежное и эффективное приложение. 👉 @java_geek

Узнаем количество файлов в папке В данном примере мы задаем путь к папке, получаем список файлов в этой папке с помощью метод
Узнаем количество файлов в папке В данном примере мы задаем путь к папке, получаем список файлов в этой папке с помощью метода listFiles(), а затем выводим количество файлов в папке с помощью свойства length массива файлов. 👉 @java_geek

Метод insert() Метод insert() используется для вставки элемента в список в заданную позицию. Он принадлежит интерфейсу List и
Метод insert() Метод insert() используется для вставки элемента в список в заданную позицию. Он принадлежит интерфейсу List и его реализациям, таким как ArrayList. Этот метод вставляет указанный элемент element по заданному индексу index и сдвигает все последующие элементы вправо. *Индексы начинаются с 0. *Если индекс меньше 0 или больше размера списка, будет выброшено исключение. 👉 @java_geek

Ключевое слово let Ключевое слово let используется для объявления переменных в блоке кода. Оно позволяет ограничить область в
Ключевое слово let Ключевое слово let используется для объявления переменных в блоке кода. Оно позволяет ограничить область видимости переменной только этим блоком. let помогает избежать загрязнения глобальной области видимости и конфликтов имен переменных. Кроме того, let позволяет повторно объявить переменную с тем же именем во вложенном блоке. Это бывает удобно, когда во вложенном блоке нужна локальная переменная с таким же названием. 👉 @java_geek

Что такое Run-Time Data Areas? Run-Time Data Areas — это области памяти, используемые Java Virtual Machine во время выполнения программы. Они отвечают за предоставление памяти для хранения байт-кода, объектов, параметров, локальных переменных, возвращаемых значений и промежуточных результатов вычислений. Некоторые из этих областей данных создаются при запуске Java Virtual Machine и уничтожаются только при выходе из Java Virtual Machine. Например, существуют такие области данных как: 1. Class Area — область хранения для структуры элементов класса, таких как поля, данные методов, код метода и т. д. 2. Heap — выделение памяти во время выполнения для объектов. 3. Stack — хранение для локальных переменных и частичных результатов. Стек содержит кадры и выделяет по одному для каждого потока. 4. PC Registers — регистры счетчика программ содержат адрес инструкции, которую JVM в настоящее время выполняет. 👉 @java_geek

Интерфейс UnaryOperator Интерфейс UnaryOperator предназначен для представления функций, которые принимают один аргумент и воз
Интерфейс UnaryOperator Интерфейс UnaryOperator предназначен для представления функций, которые принимают один аргумент и возвращают результат того же типа, что и аргумент. Он является специализированным функциональным интерфейсом, входящим в пакет java.util.function. UnaryOperator часто используется в stream API для применения функций к элементам потока. В примере UnaryOperator используется для преобразования строк в верхний регистр с помощью метода map(). 👉 @java_geek

Класс StringJoiner Класс StringJoiner предназначен для построения строки путем соединения элементов из коллекции. Он позволяе
Класс StringJoiner Класс StringJoiner предназначен для построения строки путем соединения элементов из коллекции. Он позволяет указать разделитель, префикс и суффикс результирующей строки. StringJoiner часто используется при необходимости преобразовать коллекцию объектов в строку. В примере StringJoiner используется как раз для объединения имен в строку с разделителем и добавлением префикса/суффикса. 👉 @java_geek

Метод before() Метод before() используется для сравнения порядка двух объектов типа Date. Он позволяет проверить, идет ли одн
Метод before() Метод before() используется для сравнения порядка двух объектов типа Date. Он позволяет проверить, идет ли одна дата перед другой. Метод before() определен в классе java.util.Date и имеет следующий формат: boolean before(Date date) Он сравнивает текущий объект Date с датой, переданной в качестве параметра, и возвращает: — true, если текущая дата идет раньше переданной даты. — false, если текущая дата идет позже переданной даты или эти даты равны. Этот метод часто используется для сравнения и сортировки дат, например: — Проверить, было ли какое-то событие до определенной даты. — Отсортировать список дат по возрастанию или убыванию. — Найти самую раннюю или самую позднюю дату в наборе. В этом примере создаются две даты, с помощью метода before() мы проверяем, идет ли date1 раньше date2. Так как date1 содержит более раннюю дату, то метод before() возвращает true. 👉 @java_geek

Какие реализации SortedSet вы знаете и в чем их особенность? В Java есть несколько реализаций интерфейса SortedSet: — TreeSet — это реализация на основе красно-черного дерева. Элементы в TreeSet хранятся в отсортированном порядке согласно естественному порядку элементов или компаратору, переданному в конструктор. Обеспечивает логарифмическую сложность для большинства операций. — ConcurrentSkipListSet — потокобезопасная реализация, основанная на скип-листов. Обеспечивает логарифмическую сложность операций и потокобезопасный доступ. — EnumSet — высокопроизводительная реализация для элементов-перечислений. Использует внутри битовые вектора для хранения. — LinkedHashSet — реализация на основе хеш-таблицы и связанного списка. Сохраняет порядок вставки элементов. 👉 @java_geek

Как используется класс Future? Класс Future является частью пакета java.util.concurrent, и он используется для представления
Как используется класс Future? Класс Future является частью пакета java.util.concurrent, и он используется для представления результата асинхронной операции или задачи, которая выполняется в фоновом потоке. Future позволяет вам управлять и получать результаты выполнения задачи в будущем, даже если она еще не завершилась. 👉 @java_geek

Java varargs Java varargs (variable arguments) — это механизм, предоставляемый Java, который позволяет методу принимать перем
Java varargs Java varargs (variable arguments) — это механизм, предоставляемый Java, который позволяет методу принимать переменное количество аргументов одного типа. Он позволяет передавать любое количество аргументов заданного типа в метод, без явного указания массива аргументов. Для объявления переменного количества аргументов в Java используется троеточие (...) после типа данных аргумента в определении метода. @java_geek