Java Learning
№ 5079899194 Обучающий канал по Java Ссылка для друга - https://t.me/+ZEYYht6-46w5MDM6 По всем вопросам @mascarov_valentin Реклама на бирже - https://telega.in/c/Java_per_month
Show more📈 Analytical overview of Telegram channel Java Learning
Channel Java Learning (@java_per_month) in the Russian language segment is an active participant. Currently, the community unites 16 598 subscribers, ranking 7 607 in the Technologies & Applications category and 39 541 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 16 598 subscribers.
According to the latest data from 30 August, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -32 over the last 30 days and by 5 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 12.90%. Within the first 24 hours after publication, content typically collects 4.60% reactions from the total number of subscribers.
- Post reach: On average, each post receives 2 140 views. Within the first day, a publication typically gains 763 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 6.
- Thematic interests: Content is focused on key topics such as learning, строка, map, static, интерфейс.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“№ 5079899194
Обучающий канал по Java
Ссылка для друга - https://t.me/+ZEYYht6-46w5MDM6
По всем вопросам @mascarov_valentin
Реклама на бирже - https://telega.in/c/Java_per_month”
Thanks to the high frequency of updates (latest data received on 31 August, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru• Новые методы для ConcurrentHashMap: forEach(), forEachEntry(), forEachValue(), reduce(), merge() и search().
• CompletableFuture может явно устанавливать свое значение и статус.
Java Learning 👩💻forEach() в интерфейс java.lang.Iterable, что упрощает работу с коллекциями и повышает читаемость кода.
✔️ Вместо создания и использования Iterator можно использовать forEach() для обхода элементов.
Java Learning 👩💻InputStream и OutputStream следующим образом:
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("application.json");
os = new FileOutputStream("application.log");
} catch (IOException io) {
// Обработка исключения
} finally {
is.close();
os.close();
}
🗣️ Проблема в том, что если первый поток вызовет исключение, то закрытие второго потока никогда не произойдет.
✔️ Правильный способ:
InputStream is = null;
OutputStream os = null;
try {
is = new FileInputStream("../input/fxrates.txt");
os = new FileOutputStream("../output/fxrates.txt");
......
} finally {
try { if (is != null) is.close(); } catch(IOException e) {//closing quietly}
try { if (os != null) os.close(); } catch(IOException e) {//closing quietly}
}
Java Learning 👩💻Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ruРеклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.rupublic class Game {
private HighScoreService service = HighScoreService.getInstance();
public void showLeaderBoard() {
List listOfTopPlayers = service.getLeaderBoard();
System.out.println(listOfTopPlayers);
}
}
🗣️ Этот подход вызывает несколько проблем:
• Класс Game жестко связан с классом HighScoreService, что усложняет тестирование Game в изоляции.
• Даже при наличии класса HighScoreService сложно протестировать Game, если HighScoreService делает сетевые запросы или загружает данные с серверов. Мок-объекты здесь не подходят.
✔️ Решение: переписать класс Game с использованием Dependency Injection (DI).
Java Learning 👩💻for с индексом, расширенный for и Iterator. Раньше я использовал цикл for с методом get(), как показано ниже:
for (int i = 0; i < list.size(); i++) {
String name = list.get(i);
}
🗣️ Этот метод работает для ArrayList, но если список — это LinkedList или другая реализация без поддержки случайного доступа, время выполнения увеличится до O(N^2), потому что get() для LinkedList имеет O(n) сложность. Кроме того, при использовании циклов может возникнуть ошибка в многопоточном режиме, например, при работе с CopyOnWriteArrayList, когда один поток изменяет список, а другой пытается получить доступ к элементам, что может привести к IndexOutOfBoundsException.✔️ Лучше использовать Iterator, который является стандартным способом перебора списка:
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String name = itr.next();
}
Это безопаснее и предотвращает непредсказуемое поведение.
Java Learning 👩💻Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576ArrayList, Vector, и HashMap для возвращаемых значений и аргументов методов.
ℹ️ Это ограничивает гибкость. Вы не можете передать другой список, даже если он лучше, и при смене реализации нужно менять все места в коде.
✔️ Лучше использовать интерфейсы. Например, для упорядоченного списка с дубликатами используйте java.util.List, для неупорядоченного набора без дубликатов — java.util.Set, а для контейнера — Collection. Это позволит легко менять реализации.
Можно ещё больше упростить с помощью обобщений и extends. Например, вы можете использовать List<? extends Number>, что позволит передавать List<Integer> или List<Short>.Java Learning 👩💻
clone(), вот несколько лучших практик для упрощения задачи:
public Course clone() {
Course c = null;
try {
c = (Course)super.clone();
} catch (CloneNotSupportedException e) {} // Не произойдет
return c;
}
🗣️ Этот код использует тот факт, что метод clone() не вызовет CloneNotSupportedException, если класс реализует интерфейс Cloneable. Возврат подкласса называется ковариантным переопределением методов и доступен с Java 5, что позволяет избежать приведения типа на стороне клиента:
Course javaBeginners = new Course("Java", 100, 10);
Course clone = javaBeginners.clone();
Ранее, например, с классом Date, нужно было явно приводить результат метода clone():
Date d = new Date();
Date clone = (Date) d.clone();
Java Learning 👩💻wait(), notify() и notifyAll(), я использовал if для проверки условия ожидания перед вызовом wait() и notify():
synchronized(queue) {
if(queue.isFull()){
queue.wait();
}
}
🗣️ К счастью, проблем не возникло, но я понял свою ошибку, прочитав раздел из книги Effective Java. Там сказано, что условие ожидания следует проверять в цикле, потому что потоки могут получать ложные уведомления, и до того, как вы что-то сделаете, условие может снова стать истинным. Поэтому правильный способ использования wait() и notify() выглядит так:
synchronized(queue) {
while(queue.isFull()){
queue.wait();
}
}
Java Learning 👩💻List<String> listOfCurrencies = new ArrayList<>();
listOfCurrencies.add("USD/AUD");
listOfCurrencies.add("USD/JPY");
listOfCurrencies.add("USD/INR");
🗣️ Хотя Arrays.asList() возвращает List, его нужно передать конструктору ArrayList, потому что возвращаемый список имеет фиксированную длину, и вы не можете добавлять или удалять элементы.
✔️ Начиная с Java 9, можно использовать методы List.of() и Set.of() для создания списка и множества с элементами. Это предпочтительнее, так как они возвращают неизменяемые списки и множества.
Java Learning 👩💻List<String> listOfCurrencies = new ArrayList<>();
listOfCurrencies.add("USD/AUD");
listOfCurrencies.add("USD/JPY");
listOfCurrencies.add("USD/INR");
🗣️ Хотя Arrays.asList() возвращает List, его нужно передать конструктору ArrayList, потому что возвращаемый список имеет фиксированную длину, и вы не можете добавлять или удалять элементы.
✔️ Начиная с Java 9, можно использовать методы List.of() и Set.of() для создания списка и множества с элементами. Это предпочтительнее, так как они возвращают неизменяемые списки и множества.
Java Learning 👩💻List<String> listOfCurrencies = new ArrayList<>();
listOfCurrencies.add("USD/AUD");
listOfCurrencies.add("USD/JPY");
listOfCurrencies.add("USD/INR");
🗣️ Хотя Arrays.asList() возвращает List, его нужно передать конструктору ArrayList, потому что возвращаемый список имеет фиксированную длину, и вы не можете добавлять или удалять элементы.
✔️ Начиная с Java 9, можно использовать методы List.of() и Set.of() для создания списка и множества с элементами. Это предпочтительнее, так как они возвращают неизменяемые списки и множества.
Java Learning 👩💻Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru