Java for Beginner
870 subscribers
1.01K photos
275 videos
14 files
1.69K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
[Совет по Java #072]

Тема: ConcurrentHashMap при итерации не бросает ConcurrentModificationException — она weakly consistent.

Проблема: В отличие от обычных коллекций (HashMapArrayList), итераторы которых являются fail-fast и выбрасывают ConcurrentModificationException при обнаружении структурных изменений во время итерации, ConcurrentHashMap использует стратегию слабой согласованности (weakly consistent).

Это означает, что итератор не гарантирует, что отразит все изменения, произошедшие во время итерации, и не бросает исключения при конкурентных модификациях. Разработчики, привыкшие к fail-fast итераторам, ожидают, что при изменении карты во время обхода возникнет исключение, и могут строить логику, полагаясь на это поведение. Однако в ConcurrentHashMap это не происходит, и отсутствие исключения может замаскировать ошибки конкурентного доступа, приводя к тому, что итерация видит частично обновленные данные или пропускает новые элементы.

Это особенно опасно, когда предполагается, что коллекция статична во время итерации, но на самом деле изменяется другими потоками.

Решение: Осознайте, что итерация по ConcurrentHashMap безопасна в многопоточной среде, но не предоставляет моментального снимка (snapshot). Итератор отражает состояние карты на момент создания итератора, но может видеть изменения, произошедшие после (в зависимости от реализации). Для получения согласованного снимка используйте entrySet().toArray() или создайте копию карты перед итерацией. Если вам нужна строгая согласованность в момент обхода, синхронизируйтесь на самой карте или используйте Collections.synchronizedMap.

Однако для большинства сценариев, где не требуется полная изоляция, поведение ConcurrentHashMap вполне приемлемо и позволяет избежать исключений. Документируйте ожидаемое поведение и не полагайтесь на отсутствие исключений как на гарантию целостности данных.
public class ConcurrentHashMapIteration {

public static void main(String[] args) throws InterruptedException {
ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "One");
map.put(2, "Two");
map.put(3, "Three");

//Итерация безопасна и не бросает ConcurrentModificationException
Thread modifier = new Thread(() -> {
map.put(4, "Four"); // модификация во время итерации
map.remove(2);
});

// Итератор создается ДО изменений
var iterator = map.entrySet().iterator();
modifier.start();

// Итерация продолжается, несмотря на изменения
System.out.println("Итерация (weakly consistent):");
while (iterator.hasNext()) {
Map.Entry<Integer, String> entry = iterator.next();
System.out.println(entry.getKey() + " -> " + entry.getValue());
// Может увидеть 4, может не увидеть; 2 может быть или нет
// Исключений не будет
}
modifier.join();

// Для снимка: копирование
Map<Integer, String> snapshot = new ConcurrentHashMap<>(map);
System.out.println("Снимок: " + snapshot);
}
}


Объяснение:
 ConcurrentHashMap использует внутреннюю сегментацию (bucket-level locking) и не блокирует всю структуру при модификации. Итераторы строятся на основе текущего состояния сегментов и не хранят отдельный снимок. Они не проверяют счетчик модификаций (в отличие от fail-fast итераторов), поэтому не бросают ConcurrentModificationException.

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


#Java #советы
👍5
Что выведет код?

import java.util.concurrent.ConcurrentHashMap;

public class task170826 {

public static void main(String[] args) {

ConcurrentHashMap<Integer, String> map = new ConcurrentHashMap<>();
map.put(1, "one");
map.put(2, "two");
map.put(3, "three");

for (Integer key : map.keySet()) {
if (key == 2) {
map.remove(1);
map.remove(3);
}
}
System.out.println(map.size());
}
}


#Tasks
👍4
👍4
Что такое Criteria API в JPA? 🤓

Ответ:

Criteria API
— это программный API для построения запросов динамически, без использования строковых JPQL.

Использует объекты CriteriaBuilder, CriteriaQuery, Root, Predicate.

Позволяет строить сложные запросы с условиями, которые могут меняться в рантайме (например, фильтры поиска). Пример: cb.equal(root.get("name"), name).

Преимущество: типобезопасность (если использовать Metamodel), динамичность. Недостаток: громоздкость. Используется в сложных приложениях с множеством фильтров
.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
https://hh.ru/vacancy/136317412

А вот пример адекватной вакансии. Может кому-то пригодится, откликайтесь 🙂
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
🗓 История технологий: 18 августа


ℹ️ Кто родился в этот день

Влади́мир Андре́евич Ме́льников (18 августа 1928, деревня Венюково (ныне Чеховский район Московской области) — 7 мая 1993, Москва)советский учёный и конструктор вычислительной техники. Член-корреспондент (1976) и академик АН СССР (1981). Лауреат двух Государственных премий СССР. Известен созданием советского суперкомпьютера Электроника СС БИС. Принимал участие в создании БЭСМ-6 (первого советского компьютера с быстродействием более 1 млн операций в секунду).

Самвел Кимович Шукурян (арм. Սամվել Կիմի Շուքուրյան; род. 18 августа 1950) армянский/советский учёный в области информатики и компьютерной техники; доктор наук, внёс вклад в развитие вычислительной науки в регионе (научные школы, инженерные разработки).

Брук Те́йлор (англ. Brook Taylor, 1685—1731) английский математик, именем которого называется известная формула, выражающая значение голоморфной функции через значения всех её производных в одной точке.

Брюс Лоуренс Хорн (родился 18 августа 1959 года)американский инженер-программист. Он создал оригинальный Macintosh Finder и Macintosh Resource Manager для Apple Computer . Его подпись, наряду с подписями остальных членов команды разработчиков Macintosh, отлита на корпусе Macintosh 128K. С июня 2022 года он является выдающимся инженером Siri и Language Technologies в Apple.


🌐 Знаковые события

1900 — русский инженер Константин Перский предложил слово «телевидение».

1947 — основана компания Hewlett-Packard (HP) Уильямом Хьюлеттом и Дэвидом Паккардом, начавшая с выпуска осцилляторов для аудио-техники и выросшая в глобального гиганта индустрии.

1960 — американский спутник-шпион Discoverer 14 сделал первую в истории фотографию с воздуха, запущенный из космоса, запечатлев советский аэродром на мысе Шмидта. Выдающийся прорыв в аэрофотосъёмке и разведке.

2003 — Adobe впервые выпустила Adobe Audition (ранее Cool Edit Pro 2.0), ставшее стандартом для профессионального звукового монтажа.

2004 — Google осуществила «floats» (публичное размещение акций, IPO), ожидая цену $85–95, что стало знаковым моментом в истории интернета и ИТ-индустрии.



#Biography #Birth_Date #Events #18Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Раздел 12. Работа с файлами, I/O и сетью (NIO.2)

Глава 4. Работа с сетью (Socket, HTTP, HttpClient)

Тема: InetAddress — работа с IP-адресами в Java

Читаем на devforge.ru - ссылка, тык



Заодно расскажите - удобнее ли вам так читать или лучше тут публиковать?

#Java #для_новичков #beginner #IO #NIO #Ip #InetAddress
👍3
Что выведет код?

import java.net.InetAddress;

public class Task180826 {
public static void main(String[] args) throws Exception {
byte[] ip = {127, 0, 0, 1};
InetAddress addr1 = InetAddress.getByAddress("host1", ip);
InetAddress addr2 = InetAddress.getByAddress("host2", ip);

System.out.println(addr1.equals(addr2));
System.out.println(addr1.getHostName().equals(addr2.getHostName()));
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
8%
true true
33%
true false
25%
false true
33%
false false
👍1
Что такое Entity Graph в JPA? 🤓

Ответ:

@EntityGraph — это аннотация (и API) в JPA 2.1, которая позволяет явно указать, какие связанные сущности должны быть загружены (Eager) в определенном запросе.

Это альтернатива JOIN FETCH. Можно определить именованный граф (
@NamedEntityGraph) и использовать его в @EntityGraph на уровне репозитория или на запросе.

Это дает гибкость: по умолчанию LAZY, но в конкретном месте подгружаем всё необходимое. Решает проблему N+1 запросов без изменения базовых настроек.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🗓 История IT сегодня — 19 августа


ℹ️ Кто родился в этот день

Са́тья Нараяна Наде́лла (англ. Satya Narayana Nadella; телугу సత్యనారాయణ నాదెళ్ల; род. 19 августа 1967, Хайдарабад) — американский топ-менеджер индийского происхождения. Генеральный директор компании Microsoft. CEO Microsoft; развернул компанию на облака и ИИ, провёл сделки LinkedIn и GitHub.

Честер Гордон Белл (англ. Chester Gordon Bell; 19 августа 1934, Керксвилл, США — 17 мая 2024, Коронадо, США) — американский инженер-электрик, компьютерный инженер и менеджер. В 1960—1966 годах в Digital Equipment Corporation (DEC) разработал несколько мини-компьютеров PDP. В 1972—1983 годах был вице-президентом DEC, курируя разработку VAX. Дальнейшая карьера Гордона Белла — предприниматель, инвестор, вице-президент Национального научного фонда, а также почётный представитель Microsoft Research в 1995—2015 годах. В 1972 году сформулировал закон о классах компьютеров (англ. Bell's law of computer classes), в котором обосновал смену компьютерных систем.

Луис Фон Ан (исп. Luis von Ahn; род. 19 августа 1978, Гватемала, Гватемала) — создатель CAPTCHA/reCAPTCHA и со-основатель Duolingo; один из пионеров краудсорсинга.


🌐 Знаковые события

1960«Спутник-5» (Белка и Стрелка): запуск корабля с двумя собаками и бионабором; первый успешный полёт с возвращением живых существ с орбиты (посадка 20 августа).

1964 — Syncom 3: запуск первого геостационарного спутника связи; обеспечил прямые телетрансляции Олимпиады-1964 из Токио.

1976 — «Луна-24»: старт взлётной ступени с лунного грунта (≈170 г) к Земле; последний на сегодня успешный советский/российский образец возврата пробы с Луны.

2003 — Червь Sobig.F: один из самых быстрых почтовых червей; вспышка началась 19 августа и быстро перегрузила почтовые системы мира.

2004 — IPO Google: торги стартовали на NASDAQ по $85; день закрылся $100.34 (+18%). Формат — модифицированный «голландский аукцион».

2010 — Intel покупает McAfee: объявлена сделка на $7.68 млрд (крупнейшая покупка Intel на тот момент) — ставка на интеграцию безопасности в «железо».



#Biography #Birth_Date #Events #19Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Раздел 12. Работа с файлами, I/O и сетью (NIO.2)

Глава 4. Работа с сетью (Socket, HTTP, HttpClient)

Тема: URL, URI и HttpURLConnection: сетевая абстракция Java и путь байтов от сокета до кучи

Читаем на devforge.ru - ссылка, тык


#Java #для_новичков #beginner #HttpURLConnection #URL #URI
👍2
Что выведет код?

import java.net.HttpURLConnection;
import java.net.URL;

public class Task190826 {
public static void main(String[] args) throws Exception {
URL url = new URL("http://example.com");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
System.out.println(conn.getResponseCode());
}
}


#Tasks
👍1
Варианты ответа:
Anonymous Quiz
56%
200
0%
301
0%
302
44%
Исключение IOException
👍3
Что такое Hibernate Session и Transaction? 🤓

Ответ:

Session — это основной интерфейс Hibernate для работы с БД, обертка над JPA EntityManager. Она представляет единицу работы (unit of work) и содержит Persistence Context.

Через нее выполняются CRUD-операции, запросы. 

Transaction — интерфейс для управления транзакциями. В Spring обычно не работают напрямую с Session (используют EntityManager и 
@Transactional). Важно: Session не потокобезопасна, должна быть закрыта после использования.

В Spring она управляется контейнером и привязана к потоку.



#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
🗓 История IT сегодня — 20 августа


ℹ️ Кто родился в этот день

Том Демарко (также ДеМарко, род. 20 августа 1940 года, Хейзлтон, штат Пенсильвания, США) — классик инженерии ПО; «Peopleware», структурный анализ, влияние на практику менеджмента проектов.

Мартин Догиамас (Martin Dougiamas 1969) — основатель Moodle, одной из самых распространённых LMS в мире.

Эрик Голес Чакк (Антофагаста, 21 августа 1951) — учёный в области дискретной математики и клеточных автоматов, лауреат премий за вклад в информатику Чили.


🌐 Знаковые события

1912 — Томас Эдисон патентует электробатарею.

1956 — Начала действовать ядерная электростанция «Колдер Холл», первая ядерная электростанция Британии.

1964 — Основан Интелсат — компания, владеющая группировкой телекоммуникационных спутников.

1975 — запуск американской межпланетной станции Viking 1 к Марсу.

2024 — прекращена работа мессенджера «Агент
Mail.ru» (пользователям предложено перейти на VK).


#Biography #Birth_Date #Events #20Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
[Совет по Java #073]

Тема: BlockingQueue методы put() и take() блокируются, а offer() и poll() с таймаутом — нет.

Проблема: Классы, реализующие BlockingQueue (например, ArrayBlockingQueueLinkedBlockingQueue), предоставляют два набора методов для добавления и извлечения элементов.

Методы put() и take() блокируют поток до тех пор, пока не появится возможность выполнить операцию (для put() — пока не освободится место, для take() — пока не появится элемент).

Методы offer() и poll() являются неблокирующими: они пытаются выполнить операцию и сразу возвращают результат (true/false или элемент/null).

Существуют также перегруженные версии offer(e, timeout, unit) и poll(timeout, unit), которые ожидают указанное время и затем возвращают результат. Разработчики часто путают их, полагая, что put() и take() — это просто синонимы, и используют их в ситуациях, где нужна неблокирующая проверка, что приводит к зависанию потоков. В других случаях они используют offer() и poll() без таймаута, когда нужно дождаться освобождения места или появления элемента, что приводит к частым повторным попыткам и busy-wait.

Решение: Четко различайте сценарии использования. Если поток должен ждать неопределенно долго, пока операция не станет возможной — используйте put() и take().

Если вы хотите только попытаться выполнить операцию и немедленно вернуть результат — используйте offer() и poll() без таймаута. Если нужно ожидать в течение ограниченного времени, а затем отступить — используйте перегруженные версии с таймаутом и обязательно проверяйте возвращаемое значение: offer возвращает true при успешной вставке, poll возвращает null при отсутствии элемента по истечении таймаута. Всегда обрабатывайте случай null или false, чтобы избежать NullPointerException или бесконечных циклов.

В многопоточных приложениях предпочтительнее использовать таймауты, чтобы система могла корректно реагировать на перегрузки и завершать потоки.
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

public class BlockingQueueMethods {

private final BlockingQueue<String> queue = new ArrayBlockingQueue<>(1);

//Опасный вариант: put() блокирует навсегда
public void badPut() throws InterruptedException {
queue.put("item"); // Если очередь полна, поток зависнет навсегда
// Никогда не вернется, если никто не потребит
}

//Правильно: try с таймаутом
public boolean safeOffer(String item) throws InterruptedException {
if (queue.offer(item, 1, TimeUnit.SECONDS)) {
System.out.println("Элемент добавлен");
return true;
} else {
System.out.println("Очередь заполнена, таймаут");
return false;
}
}

//Опасный вариант: poll() без таймаута возвращает null немедленно
public String badPoll() {
return queue.poll(); // null, если очередь пуста — нужно проверять!
}

//Блокирующее извлечение, когда нужно ждать
public String takeItem() throws InterruptedException {
return queue.take(); // ждет, пока появится элемент
}

//Извлечение с таймаутом
public String pollWithTimeout() throws InterruptedException {
String item = queue.poll(500, TimeUnit.MILLISECONDS);
if (item != null) {
System.out.println("Получен: " + item);
} else {
System.out.println("Таймаут, элемент не появился");
}
return item;
}
}


Объяснение:
 put() и take() используют внутренние условия (Condition) для блокировки, освобождая монитор и вновь захватывая его после пробуждения. Они не возвращают управление до выполнения операции. offer() и poll() без таймаута проверяют состояние очереди и немедленно возвращают результат. Версии с таймаутом реализованы через циклы с ожиданием, но прерываются по истечении времени.

При использовании таймаутов всегда проверяйте возвращаемые значения, чтобы отличить успех от таймаута (для offer — false, для poll — null). Важно также помнить, что null может быть допустимым значением в некоторых очередях (например, LinkedTransferQueue), но в стандартных реализациях null не разрешен, поэтому null однозначно указывает на таймаут.


#Java #советы
👍3
Что выведет код?

import java.util.concurrent.*;

public class Task200826 {
public static void main(String[] args) throws InterruptedException {
BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(1);
queue.put(1);

Thread consumer = new Thread(() -> {
try {
Thread.sleep(2000);
queue.take();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
});
consumer.start();

boolean added = queue.offer(2, 1, TimeUnit.SECONDS);
System.out.println(added);
System.out.println(queue.size());
}
}


#Tasks
👍3
Варианты ответа:
Anonymous Quiz
40%
true 1
0%
true 2
40%
false 0
20%
false 1
👍1
Ждете?

Скоро))) 😜
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5👍2