Java for Beginner
717 subscribers
660 photos
174 videos
12 files
1.03K links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

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

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Что такое SoftReference и когда ее использовать? 🤓

Ответ:

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

Пример:
SoftReference<String> softRef = new SoftReference<>(new String("cache"));
System.out.println(softRef.get()); // cache
System.gc(); // Может не удалить, если память не нужна

В отличие от WeakReference, SoftReference живет дольше, что делает ее предпочтительной для кэширования.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Факт дня:

А вы знали, что первый компьютерный "диспетчер задач" был создан в 1981 году?

Система Xerox Star представила интерфейс для управления запущенными процессами, позволяя переключаться между задачами. Это был прообраз современных диспетчеров задач Windows и macOS.

proof

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


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

Джи́мми До́нал Уэ́йлс (англ. Jimmy Donal Wales, также известный под псевдонимом Джи́мбо (англ. Jimbo); род. 7 августа 1966, Хантсвилл, Алабама, США) — американский и британский интернет-предприниматель, один из создателей концепции «вики», основатель онлайн-энциклопедии Википедии.

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

1944 — Презентация IBM Mark I (ASCC)
Первый крупный механический программируемый компьютер, использовался для инженерных расчётов во Второй мировой.

1955 — Первый транзисторный радиоприёмник (Sony TR‑55)
Появление портативной электроники и начало эры миниатюрных устройств.

1959 — Запуск спутника Explorer 6 (США)
Первое в истории изображение Земли, переданное из космоса.

1981 — IBM представила первый ПК (IBM 5150)
Начало массовой компьютеризации, предтеча всех современных персональных компьютеров.

1991 — Публикация World Wide Web
Тим Бернерс‑Ли сделал первую веб‑страницу доступной в сети. Рождение современного Интернета.



#Biography #Birth_Date #Events #7Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Switch/case в Java

Оператор switch в Java позволяет выбирать, какой код выполнять, в зависимости от значения переменной. Он часто используется вместо множества if-else условий, когда нужно проверить одно значение на совпадение с несколькими вариантами. С Java 14 switch также поддерживает switch expressions (выражения), которые делают код короче и удобнее.

1. Что такое switch в Java?

switch — это условный оператор, который проверяет значение переменной и выполняет соответствующий блок кода в зависимости от совпадения с заданными вариантами (case). Switch expressions — это улучшенная версия switch, которая позволяет возвращать значение и писать более компактный код.

Зачем нужен switch?
Простота выбора: Удобен, когда нужно выбрать действие из нескольких вариантов.
Читаемость: Делает код чище, чем длинная цепочка if-else.
Гибкость: Поддерживает разные типы данных и новые возможности (switch expressions).
Эффективность: В некоторых случаях работает быстрее, чем if-else.



2. Синтаксис switch

2.1. Классический switch (оператор)
Классический switch выполняет блок кода для совпадающего case и использует break, чтобы выйти из конструкции.

Синтаксис:
switch (выражение) {
case значение1:
// Код для значения1
break;
case значение2:
// Код для значения2
break;
default:
// Код, если ни один case не совпал
}


Пример:
int day = 3;
switch (day) {
case 1:
System.out.println("Понедельник");
break;
case 2:
System.out.println("Вторник");
break;
case 3:
System.out.println("Среда");
break;
default:
System.out.println("Другой день");
}

Вывод: Среда


2.2. Switch Expression (с Java 14)
Switch expressions позволяют возвращать значение и использовать стрелочный синтаксис (->) для упрощения кода. Они не требуют break, так как автоматически завершают выполнение.

Синтаксис:
switch (выражение) {
case значение1 -> результат1;
case значение2 -> результат2;
default -> результат_по_умолчанию;
}


Пример:
int day = 3;
String dayName = switch (day) {
case 1 -> "Понедельник";
case 2 -> "Вторник";
case 3 -> "Среда";
default -> "Другой день";
};
System.out.println(dayName);

Вывод: Среда


Примечания к синтаксису:
Поддерживаемые типы:
Классический switch: byte, short, int, char, String, enum.
Switch expression: Те же типы + возможность возвращать значения.
break: В классическом switch нужен, чтобы избежать "проваливания" (fall-through) в следующий case.
default: Выполняется, если ни один case не совпал. Необязателен, но рекомендуется.
Стрелочный синтаксис (->): Используется в switch expressions для компактности.


#Java #для_новичков #beginner #switch_case
👍3
3. Типы конструкций switch

3.1. Классический switch (оператор)

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


Пример:
char grade = 'B';
switch (grade) {
case 'A':
System.out.println("Отлично!");
break;
case 'B':
System.out.println("Хорошо!");
break;
case 'C':
System.out.println("Нормально");
break;
default:
System.out.println("Неизвестная оценка");
}

Вывод: Хорошо!


3.2. Switch с fall-through
Если не указать break, выполнение "проваливается" в следующий case.

Пример:
int month = 4;
switch (month) {
case 3:
case 4:
case 5:
System.out.println("Весна");
break;
default:
System.out.println("Другой сезон");
}

Вывод: Весна


3.3. Switch Expression
Возвращает значение, которое можно присвоить переменной.
Использует -> для компактности или {} для сложной логики.


Пример:
int number = 2;
int result = switch (number) {
case 1 -> 10;
case 2 -> {
int temp = number * 20;
yield temp; // Возвращает значение
}
default -> 0;
};
System.out.println(result);

Вывод: 40


3.4. Switch с enum
Удобен для работы с перечислениями (enum).

Пример:
enum Day { MONDAY, TUESDAY, WEDNESDAY }
Day day = Day.TUESDAY;
String message = switch (day) {
case MONDAY -> "Начало недели";
case TUESDAY -> "Второй день";
case WEDNESDAY -> "Середина недели";
};
System.out.println(message);

Вывод: Второй день


4. Правильное применение switch

Чтобы писать понятный и эффективный код с switch, следуйте этим рекомендациям:

4.1. Используйте switch для четких вариантов
Применяйте switch, когда проверяете одно значение на несколько конкретных вариантов (например, дни недели, оценки).

Пример:
int score = 85;
switch (score / 10) {
case 9:
System.out.println("Оценка: A");
break;
case 8:
System.out.println("Оценка: B");
break;
default:
System.out.println("Оценка ниже");
}


4.2. Не забывайте break в классическом switch
Без break код продолжит выполняться для всех последующих case, что может привести к ошибкам.

Пример ошибки:
int day = 1;
switch (day) {
case 1:
System.out.println("Понедельник");
case 2:
System.out.println("Вторник");
}

Вывод: Понедельник и Вторник (из-за отсутствия break).


4.3. Используйте switch expressions для простоты
Если нужно вернуть значение, используйте switch expression вместо классического switch.

Пример:
String fruit = "apple";
String type = switch (fruit) {
case "apple", "pear" -> "Фрукт";
case "carrot" -> "Овощ";
default -> "Неизвестно";
};


4.4. Добавляйте default
Всегда включайте default, чтобы обработать неожиданные значения.

Пример:
char letter = 'Z';
switch (letter) {
case 'A':
System.out.println("Первая буква");
break;
default:
System.out.println("Другая буква");
}


4.5. Проверяйте типы данных
Убедитесь, что выражение в switch соответствует поддерживаемому типу (int, String, enum и т.д.).

Пример ошибки:
double value = 1.5;
switch (value) { // Ошибка: double не поддерживается
case 1.5:
System.out.println("1.5");
}



#Java #для_новичков #beginner #switch_case
👍3
5. Работа switch под капотом

5.1. Компиляция в байт-код
Классический switch компилируется в одну из двух инструкций байт-кода:
tableswitch: Для последовательных значений case (например, 1, 2, 3).
lookupswitch: Для непоследовательных значений (например, 1, 10, 100).


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

Пример:
int day = 2;
switch (day) {
case 1:
System.out.println("Понедельник");
break;
case 2:
System.out.println("Вторник");
break;
}


Байт-код (упрощенно):
iload day
tableswitch {
1: invokevirtual // Вызов для "Понедельник"
2: invokevirtual // Вызов для "Вторник"
default: return
}


5.2. Switch Expressions
Switch expressions компилируются в байт-код с использованием invokedynamic (с Java 12+), что позволяет JVM оптимизировать выполнение.
Ключевое слово yield в switch expressions генерирует инструкцию для возврата значения.


5.3. Память и стек
Стек операндов: Значение в switch загружается в стек операндов JVM для сравнения с case.
Куча: Если switch работает с объектами (например, String или enum), их ссылки хранятся в стеке, а сами объекты — в куче.
Переменные: Локальные переменные внутри case хранятся в стеке вызовов.


5.4. Оптимизация в JVM
Таблицы переходов: tableswitch и lookupswitch быстрее, чем многократные сравнения в if-else, особенно для большого числа case.
JIT-компиляция: JIT-компилятор может встраивать switch в машинный код, улучшая производительность.
Оптимизация констант: Если switch использует константы, JVM может заранее вычислить переходы.


5.5. Ошибки в памяти
Проваливание (fall-through): Без break в классическом switch выполняется лишний код, что может привести к ошибкам.
Неправильные типы: Использование неподдерживаемых типов (например, double) вызывает ошибку компиляции.
Слишком много case: Большое количество case увеличивает размер байт-кода, но это редко влияет на производительность.


Пример ошибки:
String fruit = "apple";
switch (fruit) {
case "apple":
System.out.println("Фрукт");
case "banana": // Без break
System.out.println("Тоже фрукт");
}

Вывод: Фрукт и Тоже фрукт (из-за fall-through).



6. Новшества в switch


Java 17 (сентябрь 2021, LTS)

Pattern Matching для switch (превью): Теперь switch может проверять не только значения, но и типы объектов. Это делает код короче и понятнее, чем if-else с instanceof.
javaObject obj = "Hello";
String result = switch (obj) {
case Integer i -> "Это число";
case String s -> "Это строка";
default -> "Неизвестно";
};


Guarded Patterns (с &&):
Можно добавлять дополнительные условия в case с помощью &&.
javacase Employee e && e.getDept().equals("IT") -> "IT сотрудник";


Обработка null: switch больше не выбрасывает NullPointerException для null, если есть case null.


Java 21 (сентябрь 2023, LTS)

Pattern Matching стал постоянной фичей: Улучшено и стабилизировано из Java 17. Теперь поддерживает сложные проверки типов и декомпозицию объектов (например, с record).
javarecord Point(int x, int y) {}
Object obj = new Point(1, 2);
String result = switch (obj) {
case Point(var x, var y) -> "Точка: " + x + ", " + y;
default -> "Не точка";
};


Guarded Patterns с when:
Вместо && используется when для условий в case, что делает код читаемее.
javacase Employee e when e.getDept().equals("IT") -> "IT сотрудник";


Полная проверка покрытия: Для sealed классов или enum компилятор проверяет, что все случаи учтены, без default.


Java 25 (сентябрь 2025, Early Access)

Поддержка примитивных типов в Pattern Matching (превью): Теперь switch может работать с примитивными типами (int, long, double) в case с паттернами.

javaint value = 42;
String result = switch (value) {
case int i when i > 0 -> "Положительное число";
case int i -> "Ноль или отрицательное";
};


Безымянные переменные (_): Можно использовать _ для неиспользуемых переменных в паттернах, что упрощает код.

javacase Point(int x, _) -> "Только x: " + x;


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

public class Task07082025 {
public static void main(String[] args) {
Object obj = "hello";
String result = switch(obj) {
case Integer i -> "int: " + i;
case String s when s.length() > 5 -> "long string";
case String s -> {
String temp = s.toUpperCase();
yield "str: " + temp + " (" + s + ")";
}
case null, default -> "other";
};
System.out.println(result);
}
}


#Tasks
👍2🤯1
Карточка для запоминания char 😎

#memory_card
🔥1
Что такое default конструктор? 🤓

Ответ:

Если в классе не определен конструктор, Java создает default конструктор без параметров, который инициализирует поля значениями по умолчанию (null, 0, false).

Пример:
class Example {
int x; // По умолчанию 0
}
Example e = new Example(); // Вызывает default конструктор

Если определен любой конструктор, default не создается.


#собеседование
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
📌 Факт дня:

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

Программа VocalTec Internet Phone позволяла общаться голосом через интернет, используя модемы. Это был предшественник современных VoIP-сервисов, таких как Skype и Discord.


proof

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


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

Влади́мир Бори́сович Бете́лин (род. 8 августа 1946, Кинешма Ивановской области) — советский и российский учёный, академик РАН, специалист в области информационных технологий; разработал инструментальные системы программного обеспечения и прикладные графические системы (САПР).

Михаил Владимирович Донской (8 августа 1948 — 13 января 2009, Москва) — российский программист, один из авторов первой советской шахматной программы «Каисса»


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

1973 — Первый микропроцессор в космосе (Pioneer Venus)
Начало использования микропроцессоров в космической технике.

1974 — DIY-компьютер Mark‑8
Публикация схемы одного из первых домашних ПК в Radio-Electronics. Этап на пути к персональным вычислениям.

1989 — Анонс Tandy PC
Компания Tandy Corporation начала продажи ПК под своим брендом, способствуя доступности компьютеров для массового пользователя.

1995 — IPO Netscape Communications
Одно из ключевых событий эры доткомов: популяризация браузеров и Интернета.

1999 — Представлен процессор AMD Athlon
Процессор стал прорывом в конкурентной гонке с Intel на рынке производительных CPU.

2004 — 1 миллион треков в iTunes Store
Apple достигла рубежа в 1 млн песен. Веха в развитии цифровой музыки и легальных медиаплатформ.


#Biography #Birth_Date #Events #8Августа
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Интеграции, публикации в Gradle

Публикация артефактов

Gradle поддерживает публикацию артефактов (JAR, WAR, и т.д.) в репозитории с помощью плагина maven-publish.
maven-publish, publishing {}


Плагин maven-publish:
Позволяет публиковать артефакты в Maven-совместимые репозитории.

Пример (build.gradle):
plugins {
id 'java'
id 'maven-publish'
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
groupId = 'com.example'
artifactId = 'my-library'
version = '1.0.0'
}
}
repositories {
maven {
url 'https://nexus.example.com/repository/maven-releases'
credentials {
username = project.findProperty('nexusUsername')
password = project.findProperty('nexusPassword')
}
}
}
}


Kotlin DSL:
plugins {
java
`maven-publish`
}
publishing {
publications {
create<MavenPublication>("mavenJava") {
from(components["java"])
groupId = "com.example"
artifactId = "my-library"
version = "1.0.0"
}
}
repositories {
maven {
url = uri("https://nexus.example.com/repository/maven-releases")
credentials {
username = project.findProperty("nexusUsername") as String?
password = project.findProperty("nexusPassword") as String?
}
}
}
}


Команда публикации:
./gradlew publish


В памяти: Публикация загружает метаданные артефактов (POM-файлы, JAR) и зависимости в память, добавляя 50-100 МБ overhead. Сетевые операции для загрузки в репозиторий увеличивают время выполнения.


Нюансы:
Храните учетные данные в ~/.gradle/gradle.properties:
nexusUsername=myuser
nexusPassword=mypassword


Используйте HTTPS для безопасной публикации.


Подпись: GPG и signing

Плагин signing:
Добавляет подпись артефактов с помощью GPG для проверки их целостности.


Пример:
plugins {
id 'java'
id 'maven-publish'
id 'signing'
}
signing {
sign publishing.publications.mavenJava
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}


Настройка GPG:

Установите GPG и сгенерируйте ключ:
gpg --gen-key


Настройте ~/.gradle/gradle.properties:
signing.keyId=12345678
signing.password=yourpassword
signing.secretKeyRingFile=/path/to/.gnupg/secring.gpg


В памяти: Подпись добавляет операции шифрования, увеличивая потребление памяти (10-50 МБ) и время выполнения задачи.


Нюансы:

Публикуйте публичный ключ в keyserver (например, gpg --send-keys 12345678).
Для Maven Central подпись обязательна.



Интеграция с Maven Central, Artifactory, Nexus

Maven Central:
Используйте плагин io.github.gradle-nexus.publish-plugin для упрощения публикации:
plugins {
id 'io.github.gradle-nexus.publish-plugin' version '1.3.0'
}
nexusPublishing {
repositories {
sonatype {
nexusUrl = uri('https://s01.oss.sonatype.org/service/local/')
snapshotRepositoryUrl = uri('https://s01.oss.sonatype.org/content/repositories/snapshots/')
username = project.findProperty('sonatypeUsername')
password = project.findProperty('sonatypePassword')
}
}
}


Команда:
 ./gradlew publishToSonatype closeAndReleaseRepository.


Artifactory:
Настройте репозиторий:
publishing {
repositories {
maven {
url 'https://artifactory.example.com/artifactory/libs-release'
credentials {
username = project.findProperty('artifactoryUsername')
password = project.findProperty('artifactoryPassword')
}
}
}
}


Nexus:
Аналогично Artifactory, укажите URL и учетные данные.

В памяти: Публикация в удаленные репозитории загружает метаданные и артефакты в память, а также выполняет сетевые операции, увеличивая overhead (50-200 МБ).


#Java #middle #Gradle #Task #integration
👍2
CI/CD

Gradle легко интегрируется с CI/CD системами, такими как Jenkins, GitLab CI и GitHub Actions, обеспечивая автоматизацию сборки, тестирования и публикации.

Gradle в Jenkins

Настройка:
Установите Gradle Plugin в Jenkins.

Создайте задачу с Gradle Wrapper:
./gradlew clean build --no-daemon


Настройте gradle.properties для CI:
org.gradle.jvmargs=-Xmx2048m
org.gradle.caching=true


В памяти: Используйте --no-daemon в CI, чтобы избежать постоянного процесса Gradle Daemon, экономя память (200-300 МБ).


GitLab CI

Пример
.gitlab-ci.yml:
stages:
- build
build:
stage: build
image: gradle:8.1-jdk11
script:
- ./gradlew clean build --no-daemon
cache:
paths:
- ~/.gradle/caches/
- ~/.gradle/wrapper/


В памяти: Кэширование ~/.gradle/caches между сборками снижает сетевые запросы, но требует дискового пространства.



GitHub Actions

Пример
 .github/workflows/build.yml:
name: Build
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: gradle/gradle-build-action@v2
with:
gradle-version: 8.1
- run: ./gradlew clean build --no-daemon


В памяти: GitHub Actions кэширует зависимости через gradle-build-action, минимизируя overhead.


Нюансы:
Используйте --no-daemon в CI для экономии памяти.

Включите Build Cache для ускорения:
buildCache {
local { enabled = true }
}


Публикуйте Build Scans для анализа CI-сборок.


Gradle Daemon и производительность

Gradle Daemon — это фоновый процесс, который сохраняет JVM между сборками для ускорения.

Включение:
По умолчанию включен.

Отключение:
./gradlew build --no-daemon.


Производительность:
Ускоряет повторные сборки, избегая инициализации JVM.
Поддерживает --parallel для параллельного выполнения задач.


В памяти: Daemon потребляет 200-300 МБ памяти в простое. Для крупных проектов может достигать 1-2 ГБ при активной сборке.


Нюансы:
Используйте --no-daemon в CI/CD, чтобы избежать утечек памяти.

Остановите Daemon:
 ./gradlew --stop.


Настройте память в gradle.properties:
org.gradle.jvmargs=-Xmx2048m -XX:MaxMetaspaceSize=512m



Build Scan: анализ, оптимизация, диагностика


Build Scans — это веб-отчеты, предоставляющие детальную информацию о сборке.

Настройка:
plugins {
id 'com.gradle.build-scan' version '3.17.4'
}
buildScan {
termsOfServiceUrl = 'https://gradle.com/terms-of-service'
termsOfServiceAgree = 'yes'
}


Генерация:
./gradlew build --scan


Использование:
Анализ времени выполнения задач.
Выявление узких мест (медленные задачи, конфликты зависимостей).
Диагностика ошибок через логи и зависимости.


В памяти: Build Scan загружает метаданные сборки (граф задач, зависимости, время выполнения) в память, добавляя 50-100 МБ overhead. Данные отправляются на сервер Gradle Enterprise, требуя сетевых операций.


Нюансы:
Полезен для оптимизации CI/CD и крупных проектов.
Храните ссылки на Build Scans для командной работы.



#Java #middle #Gradle #Task #integration
👍4
Что выведет код?

public class Task080825 {
public static void main(String[] args) {
String s1 = "Java";
String s2 = "Java";
String s3 = new String("Java").intern();
String s4 = new String("Java");

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


#Tasks
👍1
Карточка для запоминания boolean 😎

#memory_card
👍3
Что такое marker interface? 🤓

Ответ:

Маркерный интерфейс
— это интерфейс без методов, используемый для пометки классов (например, Serializable, Cloneable). JVM или библиотеки используют его для специальной обработки.

Пример:
interface MyMarker {}
class MyClass implements MyMarker {}

Проверяется через instanceof для определения типа поведения.


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