ru
Feedback

Не попадитесь на канал ботавода! Telemetrio находит и помечает такие каналы 👉 Хотите видеть метку — оформите подписку

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

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

Открыть в Telegram

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

Больше
6 685
Подписчики
-624 часа
-227 дней
-6730 дней
Архив постов
Кто сказал, что начинать надо с малого? Тестировать цифровых двойников или настраивать проход по лицу в метро — неплохо для с
Кто сказал, что начинать надо с малого? Тестировать цифровых двойников или настраивать проход по лицу в метро — неплохо для старта карьеры, правда? А еще это отличный способ обнаружить у себя новую ИТ-суперспособность. Т1 — это бигтех для бизнеса и одна из крупнейших аккредитованных ИТ-компаний России. Здесь молодые специалисты получают реальные задачи: можно работать с большими данными, участвовать в разработке решений для ритейла, создавать инструменты для обучения и общения и многое другое. И все это: ✅ онлайн из любой точки страны; ✅ под руководством наставника; ✅ удобно совмещать с учебой. Для старта карьеры ИТ-холдинг выбрали уже более 4 000 студентов из 300+ вузов. ⚡ Присоединяйся и узнай, какая суперспособность в ИТ твоя. Перейти на сайт #реклама 16+ career.t1.ru О рекламодателе

⌨️ Где и для чего используется модификатор abstract? Класс, помеченный модификатором abstract, называется абстрактным классом. Такие классы могут выступать только предками для других классов. Создавать экземпляры самого абстрактного класса не разрешается. При этом наследниками абстрактного класса могут быть как другие абстрактные классы, так и классы, допускающие создание объектов. Метод, помеченный ключевым словом abstract - абстрактный метод, т.е. метод, который не имеет реализации. Если в классе присутствует хотя бы один абстрактный метод, то весь класс должен быть объявлен абстрактным. Использование абстрактных классов и методов позволяет описать некий шаблон объекта, который должен быть реализован в других классах. В них же самих описывается лишь некое общее для всех потомков поведение.

Чем умнее AI, тем актуальнее математика❗️ В век нейросетей легко получить готовый ответ. Сложнее понять, откуда он взялся, и
Чем умнее AI, тем актуальнее математика❗️ В век нейросетей легко получить готовый ответ. Сложнее понять, откуда он взялся, и проверить его на правильность. И здесь не обойтись без понимания математики. Тот, кто понял, восстановит любой факт, адаптирует его под задачу и сможет направить AI в нужную сторону. Хороший запрос, проверку и интерпретацию делает не модель, а человек, который глубоко понимает предметную область. 📈 @lav_math — канал о высшей математике и математической жизни. Канал про умение чувствовать математику и видеть взаимосвязи. Автор — выпускник СПбГУ, к.ф.-м.н., научный сотрудник РАН, преподаёт в СПбГУ и ИТМО. Что внутри: — Работа со всеми математическими дисциплинами; — Теория вероятностей и математическая статистика — один из основных профилей; — Онлайн-занятия и стримы на YouTube; — Контент для студентов технических направлений и тех, кто уже работает в IT, аналитике, Data Science. Посмотрите сами 👉 @lav_math

⌨️ void и Void В языке программирования Java ключевое слово void используется для указания, что метод не возвращает никакого значения. Метод с возвращаемым типом void выполняет определенные действия, но не производит результат, который можно было бы использовать в вызывающей части программы. Для void еще есть класс обёртка Void. Класс Void — это класс-заполнитель который нельзя создать и который хранит ссылку на объект Class, представляющий ключевое слово Java void. Этот класс можно использовать, например, в случаях, когда у вас есть обобщенный класс и вы хотите, чтобы метод ничего не возвращал (т.е. чтобы пользователь класса не ожидал ничего особенного оттуда получить):

interface I<T> {
    T doStuff();
}

class A implements I<Void> {
    @Override
    public Void doStuff() {
        // ничего другого вернуть нельзя
        return null; 
    }
}
Или если в проекте регулярно используется Callable<T> для выполнения каких-то асинхронных задач и в тех ситуациях, когда результат работы задачи ничего не должен возвращать, можно реализовать Callable<Void>.

Хочешь спроектировать нормальную доменную модель, а вместо этого третий час пишешь геттеры и сеттеры для очередного DTO? Тепе
Хочешь спроектировать нормальную доменную модель, а вместо этого третий час пишешь геттеры и сеттеры для очередного DTO? Теперь это можно делегировать. CatCode - агент, который работает с проектом сам: пишет бойлерплейт, тесты, javadoc, гоняет сборку, пока ты занят чем-то более интересным. Доступны все топовые модели: 😒 Claude Opus 5 🤖 GPT-6 Astra 😐 Grok 4.6 и многие другие. Умный свитчер экономит токены - рутина уйдёт дешёвой модели, сложные задачи - нейросети покруче. Один лимит дешевле зоопарка отдельных подписок - всего 900 рублей в месяц. Оплата картой РФ или СБП, работает без VPN. Первые задачи бесплатно, просто зарегистрируйся и попробуй. Делегируй рутину уже сегодня: catcode.dev

⌨️ Что такое generics? Generics - это технический термин, обозначающий набор свойств языка позволяющих определять и использовать обобщенные типы и методы. Обобщенные типы или методы отличаются от обычных тем, что имеют типизированные параметры. Примером использования обобщенных типов может служить Java Collection Framework. Так, класс LinkedList<E> - типичный обобщенный тип. Он содержит параметр E, который представляет тип элементов, которые будут храниться в коллекции. Создание объектов обобщенных типов происходит посредством замены параметризированных типов реальными типами данных. Вместо того, чтобы просто использовать LinkedList, ничего не говоря о типе элемента в списке, предлагается использовать точное указание типа LinkedList<String>, LinkedList<Integer> и т.п.

Ищете облачную платформу? Есть Beget ✅ Аптайм 99,98% в дата-центрах Tier III ✅ Техподдержка 24/7 — живые люди, без ботов ✅ Пр
Ищете облачную платформу? Есть Beget ✅ Аптайм 99,98% в дата-центрах Tier III ✅ Техподдержка 24/7 — живые люди, без ботов ✅ Прозрачная оплата без скрытых платежей ✅ Более 200 000 клиентов доверяют Beget Узнать больше #реклама 16+ beget.com О рекламодателе

⌨️ Почему char[] предпочтительнее String для хранения пароля? С момента создания строка остаётся в пуле, до тех пор, пока не будет удалена сборщиком мусора. Поэтому, даже после окончания использования пароля, он некоторое время продолжает оставаться доступным в памяти и способа избежать этого не существует. Это представляет определённый риск для безопасности, поскольку кто-либо, имеющий доступ к памяти сможет найти пароль в виде текста. В случае использования массива символов для хранения пароля имеется возможность очистить его сразу по окончанию работы с паролем, позволяя избежать риска безопасности, свойственного строке.

Сезон поиска работы только стартанул, а тут такие шишки: СТО, IT-директора и техлиды сами пришли и разместили вакансии. И тут
+6
Сезон поиска работы только стартанул, а тут такие шишки: СТО, IT-директора и техлиды сами пришли и разместили вакансии. И тут можно даже написать руководителям напрямую: → CTO Альфа-Банка Кирилл Сафаров ищет руководителя портфеля цифровых продуктов на MLM-проект «Свой в Альфе»; → IT-директор Сергей Чернуха из «Филип Моррис Интернэшнл» в России в поиске сразу двух управляющих: IT-решениями для бизнеса и IT-инфраструктурой; → Руководитель направления инженерии и анализа данных в Контуре Юлия Лунёва приглашает продуктового аналитика-сеньора в направление веб-сервисов; → Техлид команды тестирования в Альфа-Банкее Егор Шохин ищет автотестировщика на C# уровня мидл+; → CTO МТС Банка Кирилл Золотарев ищет технического лидера в команду платежей; → Коммерческий директор Skillaz Андрей Синякин опубликовал вакансию директора по продукту

Метод 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 и выводим на экран значения оригинального и скопированного объекта.