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

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Варианты ответа:2.5
Anonymous Quiz
50%
2.5
36%
2.0
14%
2
0%
Ошибка компиляции
Что выведет код?

public class Task110625 {
public static void main(String[] args) {
int a = 5;
int b = 2;

double result = a / b;
System.out.println(result);
}
}


#Tasks
Что такое композиция и агрегация в ООП? 🤓

Ответ:

Композиция и агрегация — это отношения "часть-целое":

Композиция: объект-часть не существует без целого (например, двигатель в машине). Если машина уничтожается, двигатель тоже.

Агрегация: объект-часть может существовать отдельно (например, студент в университете).

Пример композиции:
class Car {
Engine engine = new Engine(); // Композиция
}

Пример агрегации:
class University {
List<Student> students; // Агрегация
}


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
И пускай мы переживаем не лучшие времена, но я ВЕРЮ в свою страну ❤️

Всех с Днем России и выходными! 🏝
Please open Telegram to view this post
VIEW IN TELEGRAM
Настройка и базовые команды Flyway

1. Конфигурация Flyway

1.1. Файл flyway.conf
Основной файл конфигурации Flyway. Располагается в корне проекта или в директории conf.

Пример содержимого:
# Подключение к БД
flyway.url=jdbc:postgresql://localhost:5432/mydb
flyway.user=admin
flyway.password=secret

# Директории с миграциями
flyway.locations=classpath:db/migration,filesystem:/opt/migrations

# Дополнительные настройки
flyway.schemas=public
flyway.baselineOnMigrate=true


Ключевые параметры:
flyway.url — JDBC-URL базы данных (формат зависит от СУБД).

flyway.locations — пути к миграциям:
classpath: — поиск в ресурсах проекта (например, src/main/resources/db/migration).
filesystem: — абсолютный путь на диске.
flyway.baselineOnMigrate — инициализация существующей БД (без таблицы flyway_schema_history).


1.2. Параметры командной строки

Настройки можно переопределять через аргументы:
flyway -url=jdbc:postgresql://localhost:5432/mydb \
-user=admin \
-password=secret \
-locations=classpath:db/migration \
migrate
Важно: Параметры из командной строки имеют приоритет над flyway.conf.


2. Основные CLI-команды

2.1. flyway migrate

Применяет все невыполненные миграции.

Процесс:
Проверяет таблицу flyway_schema_history.
Находит скрипты, которых нет в истории.
Выполняет их в порядке версий (например, V1__... перед V2__...).


Пример:
flyway migrate


2.2. flyway info

Показывает текущее состояние БД:
Какие миграции применены.
Какие ожидают выполнения.
Статус (Success, Pending, Failed).


Вывод:
+-----------+---------+---------------------+------+---------------------+---------+
| Version | Description | Installed on | State | Type | Checksum |
+-----------+---------+---------------------+------+---------------------+---------+
| 1 | Create users | 2024-03-15 10:00 | Done | SQL | 1234abcd |
| 2 | Add email | Pending | | SQL | 5678efgh |
+-----------+---------+---------------------+------+---------------------+---------+


2.3. flyway validate

Проверяет:
Целостность скриптов (не изменены ли уже примененные).
Корректность именования.


Ошибка:
Validation failed: Detected applied migration not resolved locally: 1
Причина: Локальный скрипт V1__... был изменен после применения к БД.


2.4. flyway clean

Удаляет все объекты БД (таблицы, процедуры), включая flyway_schema_history.
Опасность: Необратимая операция. Используется только в dev-среде.

flyway clean


3. Форматы миграций

3.1. SQL-миграции

Стандартный подход. Скрипты с расширением .sql в директории db/migration.

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

INSERT INTO users (id, username) VALUES (1, 'admin');


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

Для сложной логики (например, условные операции).


Шаги:
Создайте класс в проекте:
public class V2__InsertTestData implements JdbcMigration {
public void migrate(Connection connection) throws Exception {
try (Statement stmt = connection.createStatement()) {
stmt.execute("INSERT INTO users (username) VALUES ('test')");
}
}
}


Укажите путь к Java-классам в flyway.locations:
flyway.locations=classpath:db/migration,classpath:com/example/migrations


3.3. Callbacks (SQL-хуки)

Скрипты, выполняемые до/после событий Flyway.

Пример (beforeMigrate.sql):
-- Выполняется перед началом миграций
CREATE SCHEMA IF NOT EXISTS audit;


Поддерживаемые события:

beforeMigrate, afterMigrate.
beforeClean, afterClean.


Директория:
db/
migration/
V1__...sql
callback/
beforeMigrate.sql


4. Важные замечания

Именование файлов:
Регистрозависимо (V1__test.sql ≠ v1__test.sql).
Разделитель — двойное подчеркивание (__).


Порядок выполнения:
Сначала V1__..., затем V2__....
R__... выполняются после всех версионных.


Безопасность:

Никогда не изменяйте уже примененные скрипты.
Для отката создавайте новые миграции (например, V3__Drop_table.sql).


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

import java.util.stream.Stream;

public class Task120625 {
public static void main(String[] args) {
long count = Stream.of(1, 2, 3, 4)
.map(i -> {
System.out.print("m" + i + " ");
return i * 2;
})
.filter(i -> {
System.out.print("f" + i + " ");
return i > 3;
})
.count();

System.out.println("\ncount=" + count);
}
}


#Tasks
Что такое паттерн Singleton и как его реализовать? 🤓

Ответ:

Singleton — паттерн, гарантирующий, что у класса есть только один экземпляр. Реализация включает приватный конструктор, статическое поле и метод доступа:

class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() { return instance; }
}

Для потокобезопасности можно использовать ленивую инициализацию с synchronized или double-checked locking.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from ChatRoom (Java for Beginner) (Первожрец)
А как вы поддерживаете себя в форме, программисты и программистки?💪
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ссылочные типы в 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. Неизменяемость
Изменение строки всегда приводит к созданию нового объекта. Это важно учитывать при работе в циклах:

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
Что выведет код?

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
Что такое 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
Please open Telegram to view this post
VIEW IN TELEGRAM