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

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

前往频道在 Telegram

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

显示更多
6 953
订阅者
-324 小时
-27
+630
帖子存档
⌨️ Array vs ArrayList Выбор между Array и ArrayList зависит от специфики задачи, которую требуется решить. 📌Помните о следующих особенностях этих типов: ✔️ Array имеет фиксированный размер и память для него выделяется в момент объявления, а размер ArrayLists может динамически изменяться. ✔️ Массивы работают гораздо быстрее, а в ArrayList намного проще добавлять/удалять элементы. ✔️ При работе с Array велика вероятность получить ошибку ArrayIndexOutOfBoundsException. ✔️ У ArrayList только одно измерение, а вот массивы могут быть многомерными.

import java.util.ArrayList;

public class arrayVsArrayList {

  public static void main(String[] args) {

    // объявление Array
    int[] myArray = new int[6];

    // обращение к несуществующему индексу
    myArray[7]= 10; // ArrayIndexOutOfBoundsException

    // объявление ArrayList
    ArrayList<Integer> myArrayList = new ArrayList<>();

    // простое добавление и удаление элементов
    myArrayList.add(1);
    myArrayList.add(2);
    myArrayList.add(3);
    myArrayList.add(4);
    myArrayList.add(5);
    myArrayList.remove(0);

    // получение элементов ArrayList    
    for(int i = 0; i < myArrayList.size(); i++) {
      System.out.println("Element: " + myArrayList.get(i));
    }
  
    // многомерный Array
    int[][][] multiArray = new int [3][3][3]; 
    }
}

⌨️ Перегрузка (Overloading) vs. Переопределение (Overriding) Перегрузка методов (Method Overloading) – это создание нескольки
⌨️ Перегрузка (Overloading) vs. Переопределение (Overriding) Перегрузка методов (Method Overloading) – это создание нескольких методов с одним именем, но разными параметрами (различаются количество или типы аргументов). Пример:

class MathUtils {
    int sum(int a, int b) {
        return a + b;
    }
    
    double sum(double a, double b) { // Перегруженный метод
        return a + b;
    }
}
Переопределение методов (Method Overriding) – это изменение поведения унаследованного метода в подклассе. Пример:

class Animal {
    void sound() {
        System.out.println("Some sound");
    }
}

class Dog extends Animal {
    @Override
    void sound() { // Переопределение метода
        System.out.println("Bark");
    }
}
Вывод: ✔️Перегрузка – это создание нескольких версий метода в одном классе. ✔️Переопределение – это изменение поведения метода родителя в подклассе.

⌨️ Double-brace инициализация - техника создания и инициализации коллекций в одном выражении, используя анонимный внутренний класс. ✅ Пример:

List<String > planets = new ArrayList<>() {{
    add ("Mercury");
    add ("Venus");
    add ("Earth");
    add ("Mars");
    add ("Jupiter");
    add ("Saturn");
    add ("Uranus") ;
    add ("Neptune");
}};
Преимущества: 1. Краткость 2. Читаемость 3. Удобство для небольших коллекций 🚫Недостатки: 1. Создание анонимного класса (увеличение потребления памяти) 2. Скрытая ссылка (возможные утечки памяти) 3. Ограничения с final классами 4. Несовместимость с оператором diamond 5. Потенциальное влияние на производительность 6. Считается антипаттерном 🔻Альтернативы: 1. ☕️Java 8 Stream API:

List<String> planets = Stream.of("Mercury", "Venus", "Earth")
                             .collect(Collectors.toList());
2. ☕️Java 9+:
List<String> planets = List.of("Mercury", "Venus", "Earth");
3.🖨Конструктор копирования:

List<Integer> list = Collections.unmodifiableList(new ArrayList<>(Arrays.asList(2, 3, 5)));
Несмотря на удобство, double-brace инициализация считается антипаттерном из-за проблем с производительностью и возможных утечек памяти.

+5
Научись писать код для работы с базами данных на уровне Senior+ Тестируешь на Java и до сих пор не знаешь, как эффективно работать с JDBC, PreparedStatement и Connection Pooling? Приходи на открытое занятие Java для продвинутых. Автор программы, Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор — собрал все важное на курсе Java Advanced. Ты научишься: 👉 Писать чистый и эффективный код с JDBC API 👉 Использовать PreparedStatement правильно и безопасно 👉 Разбираться в Connection Pooling и оптимизировать производительность тестов 👉 Избегать типичных ошибок при работе с БД Ждем тебя на открытом уроке завтра в 20:00 (МСК). 🔗 Зарегистрируйся по ссылке.

Научись писать код для работы с базами данных на уровне Senior+ Тестируешь на Java и до сих пор не знаешь, как эффективно работать с JDBC, PreparedStatement и Connection Pooling? Приходи на открытое занятие Java для продвинутых. Автор программы, Дмитрий Тучс, Head of QA в Dodo Engineering, спикер Codefest, Codetalks, EpicHey!, ментор и open-source контрибьютор — собрал все важное на курсе Java Advanced. Ты научишься: 👉 Писать чистый и эффективный код с JDBC API 👉 Использовать PreparedStatement правильно и безопасно 👉 Разбираться в Connection Pooling и оптимизировать производительность тестов 👉 Избегать типичных ошибок при работе с БД Ждем тебя на открытом уроке завтра в 20:00 (МСК). 🔗 Зарегистрируйся по ссылке.

⌨️ Diamond-оператор (<>) упрощает работу с обобщениями (Generics), позволяя компилятору автоматически выводить тип. ➡️ До Java 7 (без <>):

List<String> list = new ArrayList<String>(); // Приходилось дублировать <String>
➡️ С Java 7+ (с <>):

List<String> list = new ArrayList<>(); // Компилятор сам выводит <String>
Преимущества <>: ✅ Уменьшает дублирование кода ✅ Улучшает читаемость ✅ Работает с любыми обобщёнными классами ⚡ Итог: Diamond-оператор делает код чище и проще, автоматизируя вывод типов!

Привет, ребята! 1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что: а)
Привет, ребята! 1,5 года я учился на программиста, а сайт easyoffer.ru стал моим пет-проектом. Я создавал его, потому что: а) нужно было добавить хоть какой-нибудь проект в резюме б) подготовиться к прохождению собесов И всё получилось! Благодаря еasyoffer я успешно прошёл собеседование и устроился Junior-разработчиком на удаленку с зарплатой 115 тысяч рублей. Однако ещё во время разработки я понял, что у этого проекта есть потенциал. Казалось, что сайт может стать популярным и, возможно, превратится в стартап. Результат превзошёл ожидания! С момента запуска easyoffer посетило 400 тысяч человек и я принял решение уйти с работы, чтобы полностью посвятить себя разработке новой версии сайта. Уже год я работаю над easyoffer 2.0. Это будет более масштабный и качественно новый проект: – Появятся задачи из собеседований и вероятность их встретить – Фильтрация по компаниям, можно будет готовиться к собесу в конректную компанию – Появится тренажер для подготовки к вопросам на собеседовании – А также тренажер "Реальное интервью", со стеком вопросов отдельных компаний. – В рейтинге вопросах с собеседований появится фильтрация по грейду и типу интревью (Техничкое/HR-скрининг) И еще очень много фич, о которых я расскажу позже. Хочу, довести easyoffer до ума, чтобы сайт стал настоящим помощником для всех, кто готовится к собеседованиям. По этому уже на этой неделе я объявлю о старте краудфандинговой кампании, чтобы ускорить разработку. Все кто поддержит проект до официального релиза получат самые выгодные условия пользования сервисом. А именно 1 год доступа к сайту по цене месячной подписки. ‼️ Очень важно, чтобы как можно больше людей поддержали проект в первые дни, по-этому те кто окажет поддержку первыми получат еще более выгодную цену на годовую подписку и существенный бонус 💎 Подписывайтесь на этот телеграм канал, чтобы узнать о старте проекта раньше других и воспользоваться лимитированными вознаграждениями.

⌨️ Какой хеш-код имеет null? null не имеет хеш-кода, потому что null не является объектом. Однако, при использовании null в структурах данных, таких как HashMap или HashSet, применяется специальная логика: ➡️ Что происходит с null в HashMap и HashSet? ✔️ В HashMap ключ null всегда попадает в первый бакет (bucket 0). ✔️ В HashSet (который использует HashMap внутри) null также хранится в этом же бакете. ✔️ Проверки выполняются в Objects.hashCode(), который для null всегда возвращает 0. ➡️ Пример:

System.out.println(Objects.hashCode(null)); // 0
📌 Вывод: null не имеет собственного хеш-кода, но в хеш-структурах ему назначается 0.

Внимание, программисты! День рождение у автора DMdev - а подарок у вас! Праздничная распродажа на все 13 курсов по Java от DM
Внимание, программисты! День рождение у автора DMdev - а подарок у вас! Праздничная распродажа на все 13 курсов по Java от DMdev 👇 Только сегодня 14.999 rub 4.999 rub с доступом на год. Каждый, кто успеет записаться, получит не только доступ к мега-курсам, но и шикарный подарок — участие в закрытом вебинаре "Микросервисы" 🎁 И это еще не всё! Также будут разыграны три крутых приза, которые могут стать твоими! Время тик-такает! Жмите на ссылку и погружайтесь в Java программирование с DMdev!

Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать прои
Varargs (Variable Arguments List, изменяющийся список аргументов) — это способ создания методов, которые могут принимать произвольное количество аргументов одного типа (от нуля и более). Данная возможность появилась в JDK 5. Запись вида Object... args и есть varargs. При этом три точки после типа указывают, что метод в качестве аргумента может принимать как массив, так и любую последовательность аргументов, записанных через запятую, которая все равно преобразуется в одномерный массив - «под капотом» компилятор на уровне байт-кода неявно заменяет переданную последовательность массивом. Уже в методе аргумент varargs используется как одномерный массив. Альтернативой varargs является перегрузка методов или передача в метод массива значений. Varargs был создан с целью упрощения работы программиста, удобства и краткости кода. 📌 В качестве ограничения любой метод может использовать varargs только в единственном числе и строго последним аргументом.

⚡️Слита База из 1000+ топовых курсов и материалов для айтишников 🖥 Python: @python_baza 👩‍💻 Frontend: @frontend_baza 👩‍💻 Backend: @backend_baza 🎨 Дизайн: @design_baza 📚 Книги: @archive_baza 👩‍💻 Все языки: @main_it_baza Всё лучшее про IT бесплатно — уже на Базе 🚀

☕️ Возвращение пустых коллекций вместо null Возвращение пустых коллекций вместо null-это рекомендуемый подход для методов, возвращающих коллекции. Он упрощает обработку данных, предотвращает ошибки и делает код более предсказуемым. Преимущества 1. Улучшение читаемости: Код становится проще, так как не нужно проверять результат на null. 2. Предотвращение NullPointerException: Исключается вероятность ошибок, связанных с доступом к null. 3.Соответствие принципу наименьшего удивления: Методы всегда возвращают коллекцию, даже если она пуста. 4. Эффективность: Пустые коллекции создаются один раз и переиспользуются благодаря реализации через паттерн Singleton. 5. Совместимость с функциональным программированием: Пустые коллекции легко интегрируются в стримы и другие функциональные конструкции. Пример:

public class CacheService {
    private final Map<String, List<Object>> cache = new ConcurrentHashMap<>();

    public List<Object> getCachedValues(String key) {
        return cache.getOrDefault(key, Collections.emptyList());
    }

    public void addToCache(String key, Object value) {
        cache.computeIfAbsent(key, k -> new ArrayList<>()).add(value);
    }
}
❗️ Метод Collections.emptyList() является частью стандартной библиотеки Java (java.util.Collections). Он реализован через паттерн Singleton для повышения эффективности и безопасности. Использование пустых коллекций вместо null делает код более устойчивым и предсказуемым. Это особенно важно в сложных многопоточных приложениях или системах с большим количеством взаимосвязанных компонентов.

Сливаем вам 2 архива на 500 курсов! ➤ Backend и языки программирования: - Python - REST - Java - PHP - Go - SQL - NoSQL - C# - C++ - Rust - JavaScript - Другое ➤ Frontend и Web-дизайн: - JavaScript - Figma - Web-Дизайн - HTML/CSS - Верстка - UI/UX - Другое

Всё не слава богу
Всё не слава богу

⌨️ Почему String неизменяемый класс? Есть несколько преимуществ в неизменности строк: ✔️ Пул строк возможен только потому, что строка неизменяемая, таким образом виртуальная машина сохраняет больше свободного места в Heap, поскольку разные строковые переменные указывают на одну и ту же переменную в пуле. Если бы строка была изменяемой, то интернирование строк не было бы возможным, потому что изменение значения одной переменной отразилось бы также и на остальных переменных, ссылающихся на эту строку. ✔️ Если строка будет изменяемой, тогда это станет серьезной угрозой безопасности приложения. Например, имя пользователя базы данных и пароль передаются строкой для получения соединения с базой данных и в программировании сокетов реквизиты хоста и порта передаются строкой. Так как строка неизменяемая, её значение не может быть изменено, в противном случае злоумышленник может изменить значение ссылки и вызвать проблемы в безопасности приложения. ✔️ Неизменяемость позволяет избежать синхронизации: строки безопасны для многопоточности и один экземпляр строки может быть совместно использован различными потоками. ✔️ Строки используются classloader и неизменность обеспечивает правильность загрузки класса. ✔️ Поскольку строка неизменяемая, её hashCode() кэшируется в момент создания и нет необходимости рассчитывать его снова. Это делает строку отличным кандидатом для ключа в HashMap т.к. его обработка происходит быстрее. #java #string #immutable

QA.GURU | GraphQL 📱 Прокачайся в JAVA автоматизации на открытых вебинарах от Head of QA 🫢 Загляни под капот автотестов GraphQL, разберись в тонкостях микросервисной архитектуры и на практике узнай, как подменять настоящие микросервисы Wiremock-ом. Об этом и многом другом говорим на занятиях для продвинутых. 👉 Заходи в @qa_guru >>> 👉 Заходи в @qa_guru >>> Здесь ты найдешь анонсы ближайших открытых занятий нашей школы и полезные материалы от опытных инженеров. Решаешь интересный кейс? Обратись за помощью в открытый чат сообщества. Мы любим сложные задачи. 20 марта ждем тебя на открытом вебинаре по Java для продвинутых. 🔗 Зарегистрируйся за минуту >>>

⌨️ Чем отличается процесс от потока? Процесс — экземпляр программы во время выполнения, независимый объект, которому выделены системные ресурсы (например, процессорное время и память). Каждый процесс выполняется в отдельном адресном пространстве: один процесс не может получить доступ к переменным и структурам данных другого. Если процесс хочет получить доступ к чужим ресурсам, необходимо использовать межпроцессное взаимодействие. Это могут быть конвейеры, файлы, каналы связи между компьютерами и многое другое. Для каждого процесса ОС создает так называемое «виртуальное адресное пространство», к которому процесс имеет прямой доступ. Это пространство принадлежит процессу, содержит только его данные и находится в полном его распоряжении. Операционная система же отвечает за то, как виртуальное пространство процесса проецируется на физическую память. Поток(thread) — определенный способ выполнения процесса, определяющий последовательность исполнения кода в процессе. Потоки всегда создаются в контексте какого-либо процесса, и вся их жизнь проходит только в его границах. Потоки могут исполнять один и тот же код и манипулировать одними и теми же данными, а также совместно использовать описатели объектов ядра, поскольку таблица описателей создается не в отдельных потоках, а в процессах. Так как потоки расходуют существенно меньше ресурсов, чем процессы, в процессе выполнения работы выгоднее создавать дополнительные потоки и избегать создания новых процессов. #java #process #thread

⭐️🚀 Смарт-контракты управляют миллионами транзакций в мире блокчейна. Хотите научиться их разрабатывать? Solidity — ключевой
⭐️🚀 Смарт-контракты управляют миллионами транзакций в мире блокчейна. Хотите научиться их разрабатывать? Solidity — ключевой язык программирования для создания децентрализованных приложений. Разбираем, как написать, задеплоить и протестировать смарт-контракт. После открытого вебинара вы сможете создать свой первый контракт, поймёте принципы работы Solidity и подготовитесь к профессиональному росту в Web3-разработке. ⏰ Встречаемся 19 марта в 20:00 мск! Участники получат скидку на большое обучение «Solidity Developer». 👉 Для участия зарегистрируйтесь https://otus.pw/PmAj/ Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576

👾Захват стека вызовов через StackWalker 🔸StackWalker, введенный в Java 9, предоставляет эффективный способ работы с текущим стеком вызовов. Это мощный инструмент для логирования, отладки и анализа производительности. ✅Основные преимущества StackWalker: 1. 🟢Эффективность: StackWalker использует ленивую загрузку фреймов стека. 2. 🟢Гибкость: API предоставляет различные методы для работы со стеком. 3. 🟢Настраиваемость: Можно указать, какие фреймы включать в обход. 🟣Пример использования StackWalker:

public class StackWalkerExample {
    public static void main(String[] args) {
        method1();
    }

    private static void method1() {
        method2();
    }

    private static void method2() {
        method3();
    }

    private static void method3() {
        StackWalker walker = StackWalker.getInstance(StackWalker.Option.RETAIN_CLASS_REFERENCE);
        walker.forEach(frame -> {
            System.out.println("Класс: " + frame.getClassName() + 
                               ", Метод: " + frame.getMethodName() + 
                               ", Строка: " + frame.getLineNumber());
        });
    }
}
Более сложный пример с фильтрацией и обработкой стека:

public class AdvancedStackWalkerExample {
    public static void main(String[] args) {
        logMethodCall();
    }

    private static void logMethodCall() {
        StackWalker walker = StackWalker.getInstance(EnumSet.of(
            StackWalker.Option.RETAIN_CLASS_REFERENCE,
            StackWalker.Option.SHOW_REFLECT_FRAMES
        ));

        List callStack = walker.walk(stream -> 
            stream.filter(frame -> !frame.getClassName().startsWith("java.lang"))
                  .map(frame -> frame.getClassName() + "." + frame.getMethodName())
                  .limit(5)
                  .collect(Collectors.toList())
        );

        System.out.println("Стек вызовов (до 5 методов, исключая java.lang):");
        callStack.forEach(System.out::println);
    }
}
В заключение, StackWalker предоставляет мощный и эффективный способ работы со стеком вызовов, улучшая производительность и гибкость кода.

⚡ Когда мне говорят, что Java слишком простой язык, я показываю канал Java Learning Здесь я научился: ▪️ Разрабатывать высоко
Когда мне говорят, что Java слишком простой язык, я показываю канал Java Learning Здесь я научился: ▪️ Разрабатывать высоконагруженные серверные приложения ▪️ Управлять сложными базами данных ▪️ Организовывать эффективную многопоточную обработку данных ▪️ Проходить технические собеседования в ведущие IT-компании Самый необычный канал про Java, подписывайся@Java_per_month

Java | Фишки и трюки - Telegram 频道 @java_tips_and_tricks 的统计与分析