Java Learning
18.6K subscribers
1.62K photos
1 video
3 files
999 links
№ 5079899194

Обучающий канал по Java

Ссылка для друга - https://t.iss.one/+ZEYYht6-46w5MDM6

По всем вопросам @mascarov_valentin

Реклама на бирже - https://telega.in/c/Java_per_month
Download Telegram
LongAdder

LongAdder — это класс атомарных long-значений в Java, который предназначен для повышения производительности в многопоточных приложениях при частом изменении значения.

LongAdder работает следующим образом: он хранит несколько переменных, каждая из которых может быть обновлена ​​одновременно без блокировки. Когда несколько потоков пытаются обновить одно и то же значение, они распределены по этим переменным. Это позволяет снизить конкуренцию между потоками и повысить производительность.

LongAdder можно использовать в следующих случаях:
— Для хранения счетчиков, которые часто обновляются несколькими потоками.
— Для реализации распределенных счетчиков, которые могут быть обновлены ​​из любого места в сети.
— Для реализации распределенных хэш-таблиц, в которых значение хэша может быть обновлено ​​несколькими потоками.

#для_продвинутых
👍21
IoC (Inversion of Control)

IoC (Inversion of Control) — это паттерн проектирования, который определяет, что объекты должны зависеть от абстракций, а не от конкретных реализаций, и что объекты должны быть созданы и настроены вне зависимых классов.

В Java IoC часто реализуется с помощью контейнера внедрения зависимостей (Dependency Injection Container, DI container). Контейнер DI отвечает за создание, настройку и предоставление объектов зависимым классам.

В примере на картинке мы используем аннотацию @Autowired для указания контейнеру DI, что класс UserService зависит от объекта Database. Контейнер DI создаст объект Database и присвоит его полю database класса UserService.

#для_продвинутых
👍16
SingleThreadPoolExecutor

SingleThreadPoolExecutor — это класс из пакета java.util.concurrent, который представляет собой пул потоков с одним потоком. Это означает, что все задачи, которые выполняются в этом пуле, выполняются в одном и том же потоке.

SingleThreadPoolExecutor имеет следующие конструкторы:
SingleThreadPoolExecutor(int corePoolSize) — создает пул с заданным количеством ядер процессора.
SingleThreadPoolExecutor(int corePoolSize, long keepAliveTime, TimeUnit unit) — создает пул с заданным количеством ядер процессора, а также временем ожидания перед уничтожением незадействованных потоков.

SingleThreadPoolExecutor имеет следующие методы:
execute(Runnable task) — выполняет указанную задачу в пуле.
submit(Runnable task) — выполняет указанную задачу в пуле и возвращает Future, который можно использовать для получения результата выполнения задачи.
shutdown() — останавливает пул и ждет, пока все задачи не будут выполнены.

#для_продвинутых
👍11😢2
Мемасик
😁105🤔2😢1
Дорогие подписчики, поздравляю вас с наступающим, а кого-то уже и с наступившим Новом Годом! Пусть 2024 станет для вас чем-то особенным и незабываемым.
🎄565👍4🔥4
#Вопросы_с_собеседования
Как работает механизм 'Double Brace Initialization' и какие потенциальные проблемы он может создать?


'Double Brace Initialization' в Java - это техника инициализации объектов, которая использует двойные фигурные скобки. Первая скобка создает анонимный внутренний класс, а вторая - блок инициализации этого класса. Этот метод часто используется для удобной инициализации коллекций. Однако он может привести к утечкам памяти, поскольку анонимный внутренний класс держит неявную ссылку на внешний класс, что может помешать сборке мусора во внешнем классе. Кроме того, он увеличивает размер класса и может влиять на производительность.
👍29
#Вопросы_с_собеседования
Объясните, как работает Java Memory Model и как это влияет на синхронизацию и параллельное выполнение в многопоточных приложениях Java


Java Memory Model (JMM) определяет, как потоки в Java взаимодействуют через общую память. Важные аспекты JMM включают понятия 'видимости' и 'упорядоченности'. Она гарантирует, что каждое действие в одном потоке перед выполнением следующего действия в другом потоке будет "заметно". Это важно для корректной синхронизации, чтобы избежать проблем, таких как гонки за данные и нарушения последовательности операций. JMM определяет, как и когда изменения, сделанные одним потоком, становятся видимыми для других, что критически важно при проектировании безопасных по отношению к потокам многопоточных приложений.
👍17😱1
PhantomHashMap

PhantomHashMap — это реализация HashMap, которая использует фантомные ссылки для отслеживания элементов, которые могут быть удалены из коллекции. Фантомные ссылки — это тип слабых ссылок, которые не препятствуют сбору мусора. Это означает, что объект, на который указывает фантомная ссылка, может быть собран мусором в любой момент времени, даже если он все еще присутствует в HashMap.

PhantomHashMap используется в случаях, когда необходимо отслеживать элементы коллекции, но не требуется, чтобы они оставались в памяти до тех пор, пока они не будут явно удалены. Например, PhantomHashMap можно использовать для отслеживания элементов, которые используются для вычисления каких-либо значений, которые затем сохраняются в постоянной памяти.

#для_продвинутых
👍12🤔9😢3😱1
Класс FilterOutputStream

Класс FilterOutputStream представляет собой базовый класс для потоков вывода, которые добавляют дополнительную функциональность к базовому потоку вывода. Он наследуется от класса OutputStream и реализует интерфейс Closeable.

Основная цель класса FilterOutputStream заключается в том, чтобы позволить разработчикам создавать потоки вывода, которые предоставляют дополнительные функции, не переопределяя весь набор методов базового потока вывода. Например, классы BufferedOutputStream и DataOutputStream расширяют класс FilterOutputStream, чтобы предоставлять функции буферизации и записи двоичных данных соответственно.

#для_продвинутых
👍5😱2
Forwarded from Ваня
DoubleAccumulator

DoubleAccumulator — это класс из пакета java.util.concurrent.atomic, который представляет собой атомарный аккумулятор для значений типа double. Он используется для накапливания значений типа double в потокобезопасном режиме.

DoubleAccumulator имеет следующий конструктор:

DoubleAccumulator(doubleBinaryOperator accumulatorFunction, double initialValue)


Первый аргумент конструктора — это функция, которая определяет, как будут накапливаться значения. Второй аргумент — это начальное значение аккумулятора.

#для_продвинутых
👍11
#Вопросы_с_собеседования
Чем Hashtable отличается от Hashmap?


Основное различие между Hashtable и HashMap заключается в том, что Hashtable синхронизирован, а HashMap нет. Это означает, что Hashtable безопасен для использования в многопоточных приложениях, где несколько потоков могут одновременно взаимодействовать с коллекцией. HashMap, с другой стороны, не является потокобезопасным, поэтому его следует использовать только в однопоточных приложениях.

Другое различие между Hashtable и HashMap заключается в том, что Hashtable не позволяет хранить null ключи или значения. HashMap, с другой стороны, позволяет хранить одно null значение ключа и любое количество null значений.

Наконец, Hashtable использует перечислитель (enumeration) для перебора значений, а HashMap использует итератор (iterator).
👍272
ByteBuffer и DirectByteBuffer

ByteBuffer — это абстракция, которая представляет собой последовательность байтов. Он может использоваться для хранения данных, чтения и записи данных в файлы, а также для сетевого взаимодействия.

DirectByteBuffer — это подкласс ByteBuffer, который хранит свои данные в памяти, выделенной операционной системой. Это отличается от обычного ByteBuffer, который хранит свои данные в куче Java.

Основное преимущество DirectByteBuffer заключается в том, что он может обеспечить более высокую производительность, чем обычный ByteBuffer. Это связано с тем, что операциям ввода-вывода не нужно копировать данные из кучи Java в память операционной системы.

Однако DirectByteBuffer также имеет некоторые недостатки. Во-первых, он может потреблять больше памяти, чем обычный ByteBuffer. Во-вторых, он может быть более сложным в использовании, чем обычный ByteBuffer.

#для_продвинутых
👍84
Класс Selector

Класс Selector относится к пакету java.nio.channels и играет важную роль в работе с асинхронным вводом-выводом (NIO). Он позволяет одновременно следить за несколькими каналами (например, сокетами) и получать уведомления, когда в каком-либо канале есть возможность выполнить операцию чтения, записи или подключения.

#для_продвинутых
👍11
#Вопросы_с_собеседования
В чем разница между внедрением конструктора и внедрением сеттера?

Ответ на картинке.
👍20😱6😢2
FileChannel

FileChannel — это класс в Java, который представляет собой канал для чтения, записи, отображения и манипулирования файлом. Он является подклассом интерфейса SeekableByteChannel, что означает, что он может читать и писать байты в файле в произвольном месте.

#для_начинающих
👍13
ArrayUtils

ArrayUtils - это статический класс в библиотеке java.util.Arrays, который предоставляет различные методы для работы с массивами. Эти методы упрощают и ускоряют выполнение многих задач, связанных с массивами.

Чтобы использовать методы класса ArrayUtils, необходимо импортировать его в свой проект. Это можно сделать следующим образом:

import java.util.Arrays;


#для_продвинутых
👍23
RandomAccessFile

RandomAccessFile — это класс в пакете java.io, который позволяет выполнять произвольный доступ к файлу. Это означает, что вы можете читать и писать данные в файл в любом месте, а не только в начале или конце.

Для создания объекта RandomAccessFile необходимо передать два параметра: имя файла и режим доступа. Режим доступа может быть «r» для чтения, «w» для записи или «rw» для чтения и записи.

#для_продвинутых
👍13
#Вопросы_с_собеседования
В Java, как реализуется принцип "fail-fast" в контексте коллекций и как это отличается от подхода "fail-safe"?

В Java, "fail-fast" система немедленно выдает ConcurrentModificationException, если обнаруживает, что коллекция была изменена во время итерации, кроме изменений через сам итератор. Напротив, "fail-safe" коллекции используют механизмы, такие как копирование коллекции или блокировки, чтобы обеспечить безопасное поведение во время итераций, даже если коллекция изменяется, предотвращая ConcurrentModificationException.
👍161
Кастинг

Кастинг (приведение типов) — это операция, которая позволяет присвоить значение переменной одного типа переменной другого типа.

Существует два типа кастинга:

Расширение типа (widening casting) — это преобразование типа данных меньшей разрядности в тип данных большей разрядности. Например, преобразование типа byte в тип int, short в тип long или char в тип int.

Сужение типа (narrowing casting) — это преобразование типа данных большей разрядности в тип данных меньшей разрядности. Например, преобразование типа int в тип byte, long в тип short или double в тип float.

#для_продвинутых
👍9🔥1
Что такое BufferedInputStream?

BufferedInputStream — это класс ввода-вывода Java, который добавляет буферизацию к базовому потоку ввода. Это означает, что он хранит данные из базового потока в памяти, чтобы их можно было читать большими порциями. Это может повысить производительность ввода-вывода, особенно при чтении из больших файлов.

Как работает BufferedInputStream?

Когда создается BufferedInputStream, он создает внутренний буфер, размер которого можно указать при создании. Затем он читает данные из базового потока в буфер. Когда приложение запрашивает чтение данных из BufferedInputStream, он сначала читает их из буфера. Если буфер пуст, BufferedInputStream читает данные из базового потока и сохраняет их в буфере.

#для_продвинутых
👍121