Java for Beginner
687 subscribers
586 photos
161 videos
12 files
902 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
📌 Цитата дня: Алексей Пажитнов

"Игра должна быть простой, чтобы стать вечной."


Алексей Пажитнов, создатель Tetris, сказал это в 1984 году в интервью о разработке игры в Москве. Цитата отражает философию гейм-дизайна.


Биография
хххАбр

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ссылочные типы в Java — строки (String)

Строки (String) в Java — это особый ссылочный тип данных, играющий ключевую роль практически в любом приложении. Несмотря на кажущуюся простоту, строки обладают рядом особенностей, таких как неизменяемость, пул строк, перегрузка операций и поведение ссылок. Глубокое понимание строк необходимо для написания безопасного, производительного и корректного Java-кода.


Создание строк

В Java строки можно создавать несколькими способами:
String s1 = "Hello";
String s2 = new String("Hello");


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


Также строки можно строить из массивов символов или байтов:
char[] chars = {'J', 'a', 'v', 'a'};
String s3 = new String(chars);


Ключевые особенности:
Строки в Java являются объектами класса java.lang.String.
Объекты String неизменяемы: после создания их содержимое нельзя изменить.
Неизменяемость позволяет безопасно использовать строки в многопоточном окружении и в качестве ключей в Map.



Существование и удаление строк

Как и любые объекты, строки существуют до тех пор, пока на них имеются активные ссылки. Когда все ссылки теряются, строка становится кандидатом на сборку мусора.
Однако строки, созданные как литералы (например, "Hello"), хранятся в строковом пуле, и удаление таких строк происходит только при завершении работы JVM или при агрессивной сборке мусора в редких случаях.


String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2); // true — обе ссылаются на одну строку из пула


В случае создания строки через new, строки не участвуют в пуле по умолчанию:
String s1 = new String("abc");
String s2 = "abc";
System.out.println(s1 == s2); // false


Метод intern() позволяет вручную добавить строку в пул:
String s1 = new String("abc").intern();
String s2 = "abc";
System.out.println(s1 == s2); // true



Использование строк

Строки активно используются при:
работе с вводом/выводом,
хранении текстовых данных,
построении логических выражений,
работе с шаблонами, логами и URL.


Java предоставляет множество удобных методов для работы со строками:
String s = "Hello, World!";
int length = s.length();
char ch = s.charAt(0);
String lower = s.toLowerCase();
boolean contains = s.contains("World");


Важно помнить, что методы класса String возвращают новые строки, поскольку String неизменяем:
String original = "Java";
String modified = original.replace("J", "K");
System.out.println(original); // Java
System.out.println(modified); // Kava


Сравнение строк:
String a = "hello";
String b = new String("hello");

System.out.println(a == b); // false — разные объекты
System.out.println(a.equals(b)); // true — одинаковое содержимое
Оператор == сравнивает ссылки, а метод equals() — содержимое.


#Java #для_новичков #beginner #reference_types #String
👍1
Трудности и подводные камни

1. Неизменяемость
Изменение строки всегда приводит к созданию нового объекта. Это важно учитывать при работе в циклах:

String result = "";
for (int i = 0; i < 1000; i++) {
result += "a"; // создается 1000 новых строк
}


Лучше использовать StringBuilder:
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 1000; i++) {
sb.append("a");
}
String result = sb.toString();


2. Сравнение с null

Обращение к методам строки без проверки может привести к NullPointerException:
String name = null;
if (name.equals("admin")) { // ошибка
}


Правильнее писать:
if ("admin".equals(name)) { // безопасно
}


3. Пул строк и производительность
Пул строк позволяет уменьшить использование памяти, но злоупотребление вручную созданными строками через new String(...) может привести к увеличению нагрузки на сборщик мусора.

4. Конкатенация и производительность
Строки, объединённые с помощью + в цикле, могут ухудшать производительность. Лучше использовать StringBuilder или StringBuffer (если требуется потокобезопасность).

5. Использование в Map и Set

Поскольку строки неизменяемы, их можно безопасно использовать в качестве ключей в HashMap, HashSet и других коллекциях. Однако важно корректно переопределять equals() и hashCode() для классов, в которых строки используются в качестве полей для сравнения.



Дополнительные нюансы

1. String vs StringBuilder vs StringBuffer
String — неизменяемый, потокобезопасный.
StringBuilder — изменяемый, не потокобезопасный, но самый быстрый.
StringBuffer — изменяемый, потокобезопасный, но медленнее.


2. Методы класса String

Строки обладают большим набором методов:
substring()
trim()
split()
replace()
matches() (регулярные выражения)
format() и другие


3. Регулярные выражения

Методы matches(), replaceAll() и split() поддерживают регулярные выражения, что делает String мощным инструментом для разбора и обработки текста.

4. Юникод и кодировка

Java строки используют UTF-16, где каждый символ — это один или два 16-битных элемента. Это важно при работе с Unicode-символами, особенно при подсчёте длины строки или извлечении символов.

5. Объекты String в коллекциях

Если строка используется как ключ в Map, важно помнить, что разные ссылки на строки с одинаковым содержимым будут считаться одинаковыми, если equals() и hashCode() совпадают — что работает корректно для String.

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

public class Task130625 {
public static void main(String[] args) {
String s1 = "Java";
String s2 = new String("Java").intern();
String s3 = new StringBuilder("Ja").append("va").toString();
String s4 = s3.intern();

System.out.println((s1 == s2) + " " + (s1 == s3) + " " + (s1 == s4));
}
}


#Tasks
👍1
Что такое Map.Entry в Java? 🤓

Ответ:

Map.Entry — это интерфейс, представляющий пару ключ-значение в Map.

Используется для итерации по элементам HashMap или других реализаций Map.

Пример:


Map<String, Integer> map = new HashMap<>();

map.put("A", 1);

for (Map.Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() + ": " + entry.getValue());
}

Методы getKey() и getValue() позволяют получить ключ и значение.

#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤓1
После проведенного голосования, определилась тема для рассмотрения в выходные - Stream Api

Но поскольку принято решение показать это все на видео, в рамках встречи, то перейдем к второму финалисту - Maven.
Тем более он давно напрашивается на цикл статей
😏

Ну читаем'с затравочную статейку


Введение в Apache Maven: автоматизация сборки и управления проектами

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

Что такое Maven

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

По сути, Maven — это система сборки, основанная на декларативном описании проекта в файле pom.xml (Project Object Model). Вместо написания множества сценариев разработчик указывает, что именно нужно сделать, а Maven сам знает, как это реализовать.

Зачем нужен Maven

В проектах на Java быстро возникает необходимость управлять зависимостями, компиляцией, тестами и выпуском новых версий. Раньше всё это приходилось настраивать вручную — с помощью антипаттернов вроде «анархичной сборки» на Ant, bash-скриптах и слабо задокументированных процедурах.

Maven решает эти проблемы:
Централизованное управление зависимостями: подключение внешних библиотек через репозитории.
Повторяемая сборка: независимо от среды результат будет одинаков.
Стандартизация структуры проекта.
Интеграция с инструментами тестирования, анализа качества кода и CI/CD.
Простота подключения плагинов и расширение функциональности без переписывания логики сборки.


Как работает Maven

Maven использует модель жизненного цикла сборки, разбитую на фазы: compile, test, package, install, deploy и другие. Когда вы вызываете mvn install, Maven проходит через все фазы от начала до указанной, автоматически выполняя нужные действия. Плагины реализуют конкретные шаги на каждой фазе.

Файл pom.xml описывает проект: его артефакт, координаты, зависимости, плагины и профили. Maven загружает зависимости из центрального репозитория, при необходимости кешируя их в локальном.

Репозитории делятся на:
Локальный (на вашей машине)
Центральный (официальный репозиторий Maven)
Удалённые (частные, корпоративные и т. д.)


Преимущества Maven

Одно из главных достоинств Maven — подход «конвенция важнее конфигурации». Он предполагает стандартную структуру каталогов и поведения, которую можно переопределить, но в большинстве случаев она устраивает по умолчанию. Это упрощает вхождение в проект новым разработчикам и снижает объем ручной настройки.

Maven обеспечивает:
Унифицированный подход к сборке.
Возможность многомодульной организации.
Расширяемость за счёт системы плагинов.
Широкую поддержку со стороны экосистемы (IDE, CI-систем, репозиториев).


Когда Maven может не подойти

Несмотря на свои преимущества, Maven не универсален. В проектах с сильно нестандартной логикой сборки или с большим количеством нестандартных шагов может потребоваться более гибкий инструмент, такой как Gradle. Также Maven изначально ориентирован на Java, и для других языков (например, JavaScript или Python) он не является естественным выбором.

#Java #middle #on_request #Maven
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Есть предложение встретиться завтра в 16:00 по МСК на лайвкодинг!

Тема будет: StreamApi и функциональные интерфейсы
Anonymous Poll
52%
Да, интересно я приду! 👌
20%
Блииин, хочу, но не могу 😭
24%
Посмотрю в записи ☺️
4%
Не, фигню рассматриваете, я ее знаю, не приду 🤫
👍2
Всем привет! 👋

Приглашаю всех желающих сегодня собраться в Яндекс.Телемост в 16:00 по МСК!

В этот раз мы рассмотрим такую нетривиальную тему как Stream API и функциональное программирование в целом.

И даже если раньше вы все это знали, лишним повторить не будет.

Приходите, это хороший шанс позадавать вопросы 🧑‍💻

Как всегда жду всех! 🫡
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
"Как я притворяюсь программистом"

Вот представьте, 40-летний, вполне состоявшийся человек, однажды решает поменять свою жизнь и идет в IT 😨

Начинает учиться, и что-то даже писать на Java. 🤓

Проходит некоторое время и волею судеб, этот мужик получает оффер и выходит на работу. 🥳

Уже войдя в команду и выполняя поначалу простые, но тем не менее продуктовые задачи, он в тайне думает, что все это не взаправду.

Ведь:
Вся команда может завтра узнать, что он новичок, и писать то не умеет.
А код он берет с Stack Overflow и чатаЖПТ и скоро это выплывет наружу.
Завтра он напишет код с багами и в него начнут тыкать пальцами.
И зарплату ему платят зря, ведь он вообще ничего не знает и от него нет пользы.
И вообще он занял место того, кто явно умнее, но менее удачлив.

Но проходит время и всего этого не происходит.

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


И если у тебя тоже так - добро пожаловать в клуб людей с «Синдромом Самозванца»

«Синдром самозванца» (на англ. impostor syndrome) — это психологическое явление, впервые описанное в 1978 году американскими психологами Полин Кланс и Сюзанн Аймс. Оно не является официальным психиатрическим диагнозом, но признано как психологический феномен, с которым сталкиваются миллионы людей, особенно в сферах с высоким уровнем интеллектуальной нагрузки — таких как программирование, наука, медицина, искусство.

Что это такое с научной точки зрения:
Синдром самозванца — это устойчивое внутреннее ощущение, что твои достижения не заслужены, что ты — "обманщик", и скоро все это "раскроется".

Люди с этим синдромом часто приписывают успех:
случайности,
везению,
внешним факторам ("мне просто помогли", "повезло с задачей"),
а не своим способностям или труду.


И это НЕ болезнь, но:
Может сопровождаться тревожностью, депрессией, перфекционизмом и прокрастинацией.
Чаще возникает у людей с высоким уровнем самокритики и требовательности к себе.
Не имеет четких диагностических критериев в МКБ-11 или DSM-5 (официальные классификаторы заболеваний), но изучается в клинической психологии.


И ты спросишь - а что делать, то?

Самое важное - ПЕРЕСТАНЬ ПАРИТЬСЯ 🙃

Эффективно
бороться с «синдромом самозванца» можно только его же методами:

1. Понять и принять, что эти ощущения никуда не денутся долгое время 😭
Ведь - «Программирование — это вечное незнание».
Еще очень долго будет казаться, что ты просто глуп для занимаемого тобою места и только признание команды, и осознание того, что ты справляешься, постепенно притупит эти ощущения.


2. Понять, что ты в этом не одинок. 🤝
В сфере программирования даже у мидлов, отработавших уже далеко не один год, есть ощущение, что они "на грани провала".

Это нормально.

Одна из причин возникновения этого синдрома - сравнение себя с более опытными разработчиками. Видя, как они за день выдают в мердж реквест целую систему, кажется, что ты так никогда не сможешь и вообще бестолочь 😉
Но, ты не видишь, как тот же сеньор загуглил вчера “what is hashmap in java” и сломал клавиатуру в попытках сделать зеленым тест, при написании это системы.

Все познается в сравнении.🙂


3. Понять, что чувство фальши значит - ты не врёшь себе. ☝️

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

Пойми, настоящие фейковые программисты никогда не страдают синдромом самозванца.

Сомнения — признак того, что тебе не всё равно, что ты понимаешь уровень своей компетенции. А это уже преимущество. Потому что только такие не стоят на месте.


ПОЭТОМУ

Не сомневайся
Пиши код. Ошибайся. Двигайся.
Даже прочитав это, ты уже не там, где был до этого.
Это и есть прогресс.

Интересный факт:
Исследования показывают, что 70–80% людей испытывали синдром самозванца хотя бы раз в жизни.

Особенно часто:
женщины в STEM-профессиях,
начинающие специалисты,
талантливые подростки и студенты.


И мы с тобой
✈️

😎

Понравилась статья - поделись с другом и, будет тебе моя благодарность
👏

#motivation
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥122👍1
Предлагаем темы для разбора и публикации! 📖

В комментариях к данному посту предлагайте вопросы, которые вы хотели бы увидеть максимально подробно разобранными в постах, а если будет интересно то и на видео.

Голосование будет проводиться всю неделю, а статья или видео - выходить по выходным.

Примерные правила:
🟢 темы, не выше уровня middle, чтоб был интерес общим.
🟢Один человек - одна тема.
🟢Тема должна быть отдельным теоретически-практическим вопросом. Готовый проект - это не тема!

Жду Ваших предложений! 👏
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Выбираем темы для рассмотрения в следующие выходные! 🤨
Anonymous Poll
31%
Optional
23%
AOP
31%
JSON
14%
IO/NIO
👍1
Встреча создана!

https://telemost.yandex.ru/j/55299189134160

залетаем! ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Факт дня:

А вы знали, что первый "цифровой переводчик" был создан в 1954 году?

Georgetown-IBM Experiment в 1954 году продемонстрировал автоматический перевод 60 предложений с русского на английский. Это был первый шаг к современным системам, таким как Google Translate.


#facts
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
📌 Цитата дня: Евгений Касперский

"Безопасность в интернете — это как замок на двери: он не спасет, если ключ в руках у всех."


Евгений Касперский, основатель Kaspersky Lab, сказал это в 2005 году на конференции по кибербезопасности в Москве.


Биография

#Citation #Biography
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Типы миграций и версионирование в Flyway

1. Структура SQL-миграций

Flyway классифицирует SQL-миграции по префиксам в именах файлов, определяя их поведение при выполнении.

1.1. Именование файлов

Версионные миграции (Versioned)

Префикс V + версия + описание:
V<Версия>__<Описание>.sql


Пример:
-- V1__Create_users_table.sql
CREATE TABLE users (
id SERIAL PRIMARY KEY,
username VARCHAR(50) NOT NULL
);


Повторяемые миграции (Repeatable)

Префикс R + описание:
R__<Описание>.sql


Пример:
-- R__Update_user_view.sql
CREATE OR REPLACE VIEW user_view AS
SELECT id, username FROM users;


2. Java-миграции

Позволяют описывать миграции на Java для сложной логики, недоступной в SQL.

2.1. Реализация интерфейсов


JdbcMigration (устаревший):
public class V2__InsertTestData implements JdbcMigration {
@Override
public void migrate(Connection connection) throws Exception {
try (Statement stmt = connection.createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('admin')");
}
}
}


JavaMigration (рекомендуемый):
public class V3__AddAdminUser implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (Statement stmt = context.getConnection().createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('superuser')");
}
}
}


2.2. Правила

Классы должны находиться в classpath (обычно src/main/java/db/migration).
Имя класса соответствует имени файла SQL-миграции (например, V2__InsertTestData.java).

3. Правила версионирования

3.1. Семантическое версионирование

Рекомендуемый формат версии:
V<Мажор>.<Минор>.<Патч>__<Описание>.sql


Пример:
-- V1.2.3__Fix_email_constraint.sql
ALTER TABLE users ALTER COLUMN email SET NOT NULL;


Преимущества:
Понятная история изменений.
Совместимость с Semantic Versioning.


3.2. Откат изменений

Flyway не поддерживает автоматический откат. Альтернативы:

Новая миграция для отмены изменений:
-- V3__Drop_users_table.sql
DROP TABLE users;


Callbacks (SQL-хуки):
Скрипты beforeMigrate/afterMigrate для резервного копирования.

Важно: Не изменяйте уже примененные миграции — это нарушит целостность flyway_schema_history.

4. Примеры

4.1. SQL-миграции
-- V1__Initial_schema.sql
CREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(100)
);

-- R__Update_view.sql
CREATE OR REPLACE VIEW active_users AS
SELECT * FROM users WHERE deleted_at IS NULL;


4.2. Java-миграция

public class V4__EncryptPasswords implements JavaMigration {
@Override
public void migrate(Context context) throws Exception {
try (PreparedStatement ps = context.getConnection()
.prepareStatement("UPDATE users SET password = encrypt(password)")) {
ps.executeUpdate();
}
}
}


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

import java.util.stream.IntStream;

public class Task160625 {
public static void main(String[] args) {
IntStream.rangeClosed(1, 5)
.filter(i -> i % 2 == 0)
.peek(System.out::print)
.forEachOrdered(i -> {});
}
}


#Tasks
👍2
Варианты ответа:
Anonymous Quiz
12%
Ничего не выведет
12%
12345
12%
135
65%
24
👍1
Чем отличается ConcurrentHashMap от HashMap? 🤓

Ответ:

ConcurrentHashMap — потокобезопасная версия HashMap, предназначенная для многопоточных приложений.

Она использует сегментированную блокировку (lock striping), чтобы минимизировать конфликты. HashMap не потокобезопасна, и одновременный доступ из нескольких потоков может привести к ошибкам.

Пример:
ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();
map.put("key", 1); // Потокобезопасно

ConcurrentHashMap не блокирует всю структуру, а только отдельные сегменты.

#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4