en
Feedback
Java | Фишки и трюки

Java | Фишки и трюки

Open in Telegram

Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg

Show more
6 775
Subscribers
-624 hours
-277 days
-5830 days
Posts Archive
Метод Arrays.fill() для инициализации массива Класс java.util.Arrays имеет несколько методов с именем fill(), которые принимают разные типы аргументов и заполняют весь массив одним и тем же значением:
long array[] = new long[5];
Arrays.fill(array, 30);
У метода также есть несколько альтернатив, которые устанавливают диапазон массива в определенное значение:
int array[] = new int[5];
Arrays.fill(array, 0, 3, -50);
Обратите внимание, что метод принимает массив, индекс первого элемента, индекс последнего элемента (не включительно) и значение.

🔴 Тестовый собес с Java-разработчиком уже завтра! [+ разбор 50 сложных вопросов в подарок ] 16 сентября (уже завтра!) в 19:0
🔴 Тестовый собес с Java-разработчиком уже завтра!  [+ разбор 50 сложных вопросов в подарок ] 16 сентября (уже завтра!) в 19:00 по мск приходи онлайн, чтобы посмотреть на настоящее интервью на Middle Java-разработчика! Собеседование проведёт Виктор Анохин — Senior из Wildberries, ех-Билайн Как это будет: 📂 Виктор задаст разработчику вопросы и задачи, которые могут спросить на реальном собесе 📂 После каждого ответа респондента ты услышишь подробный комментарий от ментора и поймёшь, чего на самом деле ожидает собеседующий на интервью 📂 В конце сможешь задать любой вопрос Виктору и получить на него развёрнутый ответ Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы И ты можешь посмотреть его бесплатно 🔥 Только завтра, в прямом эфире! 🎁 Подарок для всех, кто зарегается на веб — файл с ОТВЕТАМИ НА 50 СЛОЖНЫХ ВОПРОСОВ с Java-собеседований 🔥 Переходи в бот, чтобы попасть на эфир и забрать подарок 👉 @shortcut_sh_bot Реклама. О рекламодателе.

⌨️ Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс? В Java абстрактный класс и интерфейс представляют два различных механизма для достижения абстракции и обеспечения множественного наследования. Вот основные различия между ними: 1️⃣ Абстрактный класс (Abstract Class): 👉 Может содержать как абстрактные методы (методы без тела), так и обычные методы с реализацией. 👉 Может иметь переменные экземпляра (поля). 👉 Может содержать конструкторы. 👉 Поддерживает одиночное наследование: подкласс можно наследовать только от одного абстрактного класса.

abstract class Animal {
    String name;

    abstract void makeSound();

    void eat() {
        System.out.println(name + " is eating.");
    }
}
2️⃣ Интерфейс (Interface): 👉 Содержит только абстрактные методы (в Java 8 и выше может содержать методы с реализацией, помеченные ключевым словом default). 👉 Не может иметь переменных экземпляра, кроме переменных, объявленных как static final. 👉 Не содержит конструкторов. 👉 Поддерживает множественное наследование: класс может реализовывать несколько интерфейсов.

interface Animal {
    void makeSound();
    void eat();
}
Когда использовать: 👉 Используйте абстрактные классы, когда у вас есть общая реализация для нескольких классов и вы хотите предоставить базовый функционал. 👉 Используйте интерфейсы, когда вам нужна поддержка множественного наследования, или когда классы, возможно, уже наследуют от других классов. Обычно считается хорошей практикой использовать интерфейсы для определения контракта и абстрактные классы для предоставления базовой реализации. В Java 8 и более новых версиях с появлением интерфейсов с методами по умолчанию (default methods), различия стали менее явными, и выбор может зависеть от конкретной ситуации.

🎸 Приглашаем на Java Rock Star Meetup Самая ламповая встреча Java-коммьюнити состоится уже в ближайшую пятницу. Вместе с кру
🎸 Приглашаем на Java Rock Star Meetup Самая ламповая встреча Java-коммьюнити состоится уже в ближайшую пятницу. Вместе с крутыми спикерами будем копаться под капотом JVM, холиварить и общаться в неформальной атмосфере. 🗓 18 сентября, 18:00, Москва, Лофт Casa Picassa на Бауманской. Что в программе? ⚙️ Иван Углянский, эксперт по JVM и компиляторам, расскажет о Project Valhalla: зачем нужны Java value-типы и почему новый подход наконец даёт надежду довести многострадальный проект до финиша. 🤖 Максим Козлов, сооснователь и CTO GitFlic, разберет, как в агентном SDLC сохранить связь между требованиями, кодом и реальным результатом. Участие бесплатное, нужна только регистрация. Присоединяйся к рок-звёздам Java! Реклама. АО "АКСИОМ". ИНН 7838124039.

Методы и конструкторы в enum Перечисления (enum) — это классы Java, определяющие наборы констант. Самый простой enum выглядит так:


public enum Vehicle { CAR, BUS, BICYCLE, SCOOTER }
Но на самом деле, enum в Java обладают гораздо более широким функционалом. Они поддерживают поля, методы, интерфейсы и т.д. Они также Comparable и Serializable и могут имплементировать все методы объекта. Для наглядности давайте создадим enum Animal и присвоим каждому элементу цвет:

public enum Animal {
    DOG("black"),
    CAT("white"),
    RAT("gray");

    private final String color;
    Animal(String color){
        this.color = color;
    }
    public String getColor(){
        return color;
    }
}
Теперь мы можем выполнить перебор элементов массива с помощью статического метода values():

public class Main {
    public static void main(String[] args) {
        for (Animal a : Animal.values()) {
            System.out.println(a.name() + " - " + a.getColor());
        }
    }
}
Мы получим следующий результат:
DOG - black
CAT - white
RAT - gray
Каждой константе можно присвоить разное поведение при выполнении определенного метода. Например, можно сделать основной метод абстрактным и переопределить его в каждой константе:

public enum Operation {
   PLUS { double evaluate(double x, double y) { return x + y; } },
   MINUS  { double evaluate(double x, double y) { return x - y; } },
   abstract double evaluate(double x, double y);
}
Всё это обеспечивает удобную работу с перечислениями в Java.

JSON – невероятно удобный и полезный формат для хранения и обмена данными. Java полностью поддерживает его. Сериализовать данные можно так:

JSONObject author = new JSONObject();
author.put("name", "J. K. Rowling");
author.put("numberOfBooks", 22);

JSONArray books = new JSONArray();
books.put("Harry Potter and the Philosopher's Stone");
books.put("Harry Potter and the Chamber of Secrets");
books.put("Harry Potter and the Prisoner of Azkaban");

author.put("books", books);
System.out.print(author);
Получится вот такая JSON-строка:

{"books":["Harry Potter and the Philosopher's Stone","Harry Potter and the Chamber of Secrets","Harry Potter and the Prisoner of Azkaban"],"name":"J. K. Rowling","numberOfBooks":22}
Десериализация на Java выглядит примерно так:

JSONObject author = new JSONObject(serializedString);
System.out.println("name: " + author.get("name"));
System.out.println("numberOfBooks: " + author.get("numberOfBooks"));

JSONArray books = (JSONArray) author.get("books");
Iterator<Object> i = books.iterator();
System.out.println("books:");
while (i.hasNext()) {
    System.out.println(i.next());
}
Нужно добавить зависимость:

<dependency>
 <groupId>org.json</groupId>
 <artifactId>json</artifactId>
 <version>20231013</version>
</dependency>

⌨️ Фишка: Создание итератора для пользовательского класса. Код:
import java.util.Iterator;

public class CustomClass implements Iterable<String> {
    private String[] elements;

    public CustomClass(String[] elements) {
        this.elements = elements;
    }

    @Override
    public Iterator<String> iterator() {
        return new CustomIterator();
    }

    private class CustomIterator implements Iterator<String> {
        private int index = 0;

        @Override
        public boolean hasNext() {
            return index < elements.length;
        }

        @Override
        public String next() {
            if (this.hasNext()) {
                return elements[index++];
            } else {
                throw new NoSuchElementException();
            }
        }
    }

    public static void main(String[] args) {
        String[] arr = {"one", "two", "three"};
        CustomClass customClass = new CustomClass(arr);
        
        for (String element : customClass) {
            System.out.println(element);
        }
    }
}
💁‍♂️ Этот код позволяет создать итератор для пользовательского класса CustomClass. Итератор позволяет перебирать элементы массива elements и использовать их в цикле for-each.

🔴 Завтра тестовое собеседование с Java-разработчиком 2 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собес
🔴 Завтра тестовое собеседование с Java-разработчиком 2 сентября(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика. Как это будет: 📂 Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу 📂 Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью 📂 В конце можно будет задать любой вопрос Сергею Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы. Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot Реклама. О рекламодателе.

⌨️ Параллельное выполнение задач с использованием ExecutorService ExecutorService - это интерфейс, который предоставляет удобный способ для управления параллельным выполнением задач. Он предоставляет пул потоков для выполнения задач и управляет их жизненным циклом:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class Main {
    public static void main(String[] args) {
        // Создание пула потоков
        ExecutorService executor = Executors.newFixedThreadPool(5);

        // Подача задач на выполнение
        for (int i = 0; i < 10; i++) {
            executor.execute(new Task(i));
        }

        // Остановка пула потоков после выполнения задач
        executor.shutdown();
    }

    static class Task implements Runnable {
        private int taskId;

        public Task(int taskId) {
            this.taskId = taskId;
        }

        @Override
        public void run() {
            System.out.println("Выполнение задачи " + taskId + " в потоке " +
                Thread.currentThread().getName());
        }
    }
}
🧑‍💻Этот код создает пул из 5 потоков и подает на выполнение 10 задач. Каждая задача выводит свой идентификатор и имя потока, в котором она выполняется. После выполнения всех задач пул потоков останавливается.

АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ Проект «Terminal» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны к
АЙТИШНИКИ БЕСПЛАТНОЕ ОБУЧЕНИЕ Проект «Terminal» стал крупнейшей библиотекой бесплатного образования. В одном канале собраны курсы, книги, полезные инструменты и практические тренажёры для всех разработчиков: • Практические курсы и задания • Книги и статьи известных авторов • Полезные инструменты и ресурсы • IT-новости и инсайды Обучение по всем направлениям: SQL, Python, ML, Frontend, PHP, C++, Go, Git, Linux, QA, Java, Vibe-coding, InfoSec и др. ⌨️ подписаться

⌨️ Метод для глубокого копирования объектов. Это часто используется, когда нужно создать копию объекта, сохраняя его данные, но не связи с другими объектами. 📌 Вот пример метода для глубокого копирования:
import java.io.*;

public class DeepCopyExample {
    public static void main(String[] args) {
        Person person = new Person("John", 30);
        Person deepCopy = deepCopy(person);
        
        System.out.println("Original: " + person.getName() + ", " + person.getAge());
        System.out.println("Deep copy: " + deepCopy.getName() + ", " + deepCopy.getAge());
    }
    
    public static <T extends Serializable> T deepCopy(T object) {
        try {
            ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
            ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteOutputStream);
            objectOutputStream.writeObject(object);
            
            ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteOutputStream.toByteArray());
            ObjectInputStream objectInputStream = new ObjectInputStream(byteInputStream);
            T copy = (T) objectInputStream.readObject();
            
            return copy;
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }
}

class Person implements Serializable {
    private String name;
    private int age;
    
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
    public String getName() {
        return name;
    }
    
    public int getAge() {
        return age;
    }
}
✅ В этом примере мы создаем класс Person, который реализует интерфейс Serializable, чтобы объекты этого класса можно было сериализовать и десериализовать. Затем мы создаем метод deepCopy, который принимает объект и возвращает его глубокую копию. Мы используем ByteArrayOutputStream и ObjectOutputStream, чтобы записать объект в байтовый массив, а затем ByteArrayInputStream и ObjectInputStream, чтобы прочитать копию объекта из массива. В методе main мы создаем объект Person, затем создаем его глубокую копию с помощью метода deepCopy и выводим на экран значения оригинального и скопированного объекта.

На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важны
На Stepik запустили годный курс по «Troubleshooting Docker и Kubernetes: поиск и устранение проблем» В программе только важные аспекты: — troubleshooting Docker и образов — диагностика сетевых проблем — настройка readiness/liveness probes — отладка pod’ов, деплоев и ingress — анализ логов контейнеров и кластера — разбор ошибок CrashLoopBackOff, OOMKilled, ImagePullBackOff и других Собеседования на DevOps/SRE сейчас всё чаще строятся вокруг реальных инцидентов. Данный курс фокусируется именно на таких сценариях и помогает в подготовке к практическим вопросам 48 часов доступен со скидкой 25% ↗️ Пройти курс на Stepik

⌨️ Использования анонимных классов: Анонимный класс - это класс без имени, который объявляется и создается внутри другого класса или метода. Он удобен, когда требуется определить класс, который будет использоваться только один раз, и нет необходимости создавать отдельный класс.
public class Main {
    interface Greeting {
        void sayHello();
    }

    public static void main(String[] args) {
        Greeting greeting = new Greeting() {  // объявление и создание анонимного класса
            @Override
            public void sayHello() {
                System.out.println("Привет, мир!");
            }
        };

        greeting.sayHello();  // вызов метода sayHello у анонимного класса
    }
} 
✅В данном примере мы определили интерфейс Greeting, содержащий метод sayHello(). Затем, в методе main(), мы создали анонимный класс, реализующий интерфейс Greeting и переопределивший метод sayHello(). Затем мы вызываем метод sayHello() у объекта анонимного класса. 📝Таким образом, анонимные классы предоставляют удобный способ создания и использования классов "на лету", что может быть полезно, когда требуется определить классы, которые будут использоваться только в одном месте программы.

Вайбкодим «Полный путь разработки AI-агентов: от MCP до Agentic RAG» Образовательная программа на Stepik по разработке соврем
Вайбкодим «Полный путь разработки AI-агентов: от MCP до Agentic RAG» Образовательная программа на Stepik по разработке современных AI-агентов. Начинаем с Model Context Protocol: создаём MCP-серверы, подключаем инструменты и внешние API, а затем переходим к разработке Agentic RAG-систем с памятью, рассуждением, поиском знаний и оценкой качества. • Model Context Protocol и MCP-серверы • LangChain, LangGraph, LlamaIndex • API, инструменты, ресурсы и промпты • Классический RAG → Agentic RAG • ReAct, память и планирование • Графы знаний и свои инструменты • Трассировка и подготовка к production Успей, скидка 20% действует 48 часов ↗️ Начать обучение на Stepik

⌨️ Использование класса java.time.Duration для рассчета разницы во времени между двумя моментами. Код для расчета разницы во времени:



import java.time.Duration;
import java.time.LocalDateTime;

public class TimeDifferenceCalculator {
    public static void main(String[] args) {
        LocalDateTime startTime = LocalDateTime.of(2022, 1, 1, 10, 0, 0);
        LocalDateTime endTime = LocalDateTime.of(2022, 1, 1, 12, 30, 0);

        Duration duration = Duration.between(startTime, endTime);

        long hours = duration.toHours();
        long minutes = duration.toMinutes() % 60;
        long seconds = duration.getSeconds() % 60;

        System.out.println("Time difference: " + hours + " hours, " + minutes + " minutes, " + seconds + " seconds.");
    }
}
В этом примере мы создаем два объекта LocalDateTime - startTime и endTime, представляющие начальное и конечное время соответственно. Затем мы используем метод Duration.between() для расчета разницы во времени между startTime и endTime. Далее, мы используем методы toHours(), toMinutes() и getSeconds() для получения часов, минут и секунд в полученной разнице времени. Наконец, мы выводим результаты на экран. Эта фишка полезна для рассчета временных интервалов, например, для измерения времени выполнения определенной операции или анализа времени работы программы.

📣 Разместите рекламу в этом канале — её увидят Аудитория Telegram остаётся активной, что бы ни говорили. Индекс читаемости э
📣 Разместите рекламу в этом канале — её увидят Аудитория Telegram остаётся активной, что бы ни говорили. Индекс читаемости это подтверждает: охваты каналов по тематикам держатся, люди продолжают читать. Реклама в Telegram — это законно: ФАС в 2026 году официально подтвердил, что она разрешена. 👉 Заказать размещение в этом канале можно через Telega.in — с маркировкой и закрывающими документами, за пару минут. Форматы и цены — по ссылке.

⌨️ Использование аннотации @FunctionalInterface для определения функциональных интерфейсов. Функциональные интерфейсы - это интерфейсы, которые содержат только один абстрактный метод и могут использоваться как типы данных для лямбда-выражений или методов высшего порядка. При использовании аннотации @FunctionalInterface вы указываете компилятору, что этот интерфейс должен содержать только один абстрактный метод, чтобы избежать возможных ошибок при использовании лямбда-выражений или ссылок на методы. Ниже приведен пример кода, демонстрирующий использование аннотации @FunctionalInterface:
@FunctionalInterface
interface Calculator {
    int calculate(int a, int b);
}

public class FunctionalInterfaceExample {
    public static void main(String[] args) {
        Calculator addition = (a, b) -> a + b;
        System.out.println("Результат сложения: " + addition.calculate(5, 3));

        Calculator subtraction = (a, b) -> a - b;
        System.out.println("Результат вычитания: " + subtraction.calculate(5, 3));
    }
}
В этом примере мы создаем функциональный интерфейс Calculator, содержащий метод calculate. Затем мы создаем экземпляры интерфейса, используя лямбда-выражения, и вызываем метод calculate для выполнения операций сложения и вычитания. Применение аннотации @FunctionalInterface помогает нам убедиться, что в интерфейсе действительно определен только один абстрактный метод, и предотвращает случайные ошибки при использовании функциональных интерфейсов в нашем коде.

Самое интересное в российском PostgreSQL этой осенью! Регистрируйтесь на бесплатную конференцию по PostgreSQL и технологиям С
Самое интересное в российском PostgreSQL этой осенью! Регистрируйтесь на бесплатную конференцию по PostgreSQL и технологиям СУБД — Tantor JAM 2026. 10 сентября, Москва. 📅 Что будет на конференции: ✅ AI-first мониторинг СУБД: что уже сегодня можно передать ИИ-агентам и как меняется профессия DBA; ✅ аналитика и HTAP без внешней обвязки, внутри Postgres; ✅ как за два года изменился PostgreSQL для 1С; ✅ защита данных в Tantor Postgres. Как всегда — технические доклады, живое общение с разработчиками и архитекторами, обмен опытом, а еще — вечерняя программа в честь пятилетия «Тантор Лабс». Участие бесплатное. 10.09.2026, Москва Зарегистрироваться #реклама 16+ tantorlabs.ru О рекламодателе

⌨️ Использование методов default и static в интерфейсах. Эти методы позволяют добавлять конкретные реализации в интерфейсы, что делает их более гибкими и позволяет избежать некоторых проблем множественного наследования. Пример с default методом в интерфейсе:
interface Greeter {
    void greet();

    // Default метод в интерфейсе
    default void greetWithExclamation() {
        System.out.println("Привет, мир!");
    }
}

class EnglishGreeter implements Greeter {
    public void greet() {
        System.out.println("Hello, World!");
    }
}

class RussianGreeter implements Greeter {
    public void greet() {
        System.out.println("Привет, мир!");
    }

    // Переопределение default метода 
    @Override
    public void greetWithExclamation() {
        System.out.println("Привет, мир!!!");
    }
}

public class InterfaceDefaultMethodExample {
    public static void main(String[] args) {
        Greeter englishGreeter = new EnglishGreeter();
        englishGreeter.greet(); // Вызовет: Hello, World!
        englishGreeter.greetWithExclamation(); // Вызовет: Привет, мир!

        Greeter russianGreeter = new RussianGreeter();
        russianGreeter.greet(); // Вызовет: Привет, мир!
        russianGreeter.greetWithExclamation(); // Вызовет: Привет, мир!!!
    }
}
Пример со static методом в интерфейсе:
interface Calculator {
    static int add(int a, int b) {
        return a + b;
    }

    static int subtract(int a, int b) {
        return a - b;
    }
}

public class InterfaceStaticMethodExample {
    public static void main(String[] args) {
        // Нет необходимости создавать экземпляр интерфейса
        int sum = Calculator.add(5, 3);  // 8
        int difference = Calculator.subtract(5, 3);  // 2
        System.out.println("Сумма: " + sum + ", Разница: " + difference);
    }
}
В этих примерах методы default и static в интерфейсе предоставляют замечательные возможности для разработки. Методы default позволяют добавить новые функции в интерфейсы без нарушения контракта с существующими реализациями. static методы в интерфейсах позволяют определять вспомогательные методы, которые могут быть вызваны без объекта интерфейса, предоставляя большую гибкость и удобство в использовании.

Решайте задачи и готовьтесь к техсекции на стажировку А ты сможешь решить алгоритмическую задачу за час и без подсказок? Янде
Решайте задачи и готовьтесь к техсекции на стажировку А ты сможешь решить алгоритмическую задачу за час и без подсказок? Яндекс проводит бесплатные тренировки по алгоритмам для тех, кто хочет систематизировать знания, прокачать решение задач и подготовиться к техническому собеседованию. -Короткие видеоуроки -Практические задачи -Регулярные соревнования -Решение задач на время -Рейтинг и награды -Возможность получить сертификат Мы тренируем не только знание алгоритмов, но и умение применять их тогда, когда рядом нет подсказок. Проверь свои алгоритмические навыки и прокачай слабые места. Регистрируйся на бесплатные тренировки! Записаться онлайн #реклама 16+ yandex.ru О рекламодателе