tgindex

Java Geek

описание

Практичные советы, лайфхаки и код для Java-разработчиков. Каждый пост — реальная польза. Учим Java на примерах. По всем вопросам @evgenycarter

2 393
подписчиков
Охват к подписчикам
12,8%
ERR
Реакции к просмотрам
0,86%
75 на 24 постов
Пересылки к просмотрам
0,99%
86
Постов в день
0,1
всего 24

Где отзываются чаще

доля реакций к просмотрам
  • 8 авг.🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Городские📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП https://max.ru/channel_krasnodar_novosty Краснодар Новости https://max.ru/channel_novosibirsk_novosti Новосибирск https://max.ru/channel_samara_novosti Новости Самары https://max.ru/channel_ekaterinburg_novosti Новости Екатеринбурга https://max.ru/channel_kazan_novosti Новости Казани https://max.ru/channel_omsk_novosti Новости Омска https://max.ru/channel_moskva_24 Москва 243,47%
  • 25 июл.🚀 Подборка полезных IT каналов в Max Системное администрирование, DevOps 📌 https://max.ru/i_odmin Все для системного администратора https://max.ru/bash_srv Bash Советы https://max.ru/sysadminof Книги для админов, полезные материалы https://max.ru/i_odmin_book Библиотека Системного Администратора https://max.ru/i_devops DevOps: Пишем о Docker, Kubernetes и др. https://max.ru/tipsysdmin Типичный Сисадмин https://max.ru/channel_win_sysadmin Системный Администратор Windows https://max.ru/channel_linux_admin Linux: Системный администратор https://max.ru/channel_linuxmod Linux https://max.ru/channel_i_linux Системный администратор https://max.ru/channel_devopslib DevOps, SRE, Sysadmin https://max.ru/channel_devops_star DevOps Star (Звезда Девопса) Excel лайфхак 📌 https://t.me/Excel_lifehack Excel лайфхак Английский с нуля 🇬🇧 https://max.ru/UchuEnglish 1C разработка 📌 https://max.ru/odin1c_rus Cтатьи, курсы, советы, шаблоны кода 1С https://max.ru/channel_DevLab1C 1С:Предприятие 8 Программирование C++📌 https://max.ru/cpp_lib Библиотека C/C++ разработчика https://max.ru/channel_cpp_geek C++ geek Программирование Go📌 https://max.ru/golang_lib Библиотека Go (Golang) разработчика Программирование React📌 https://max.ru/react_lib React Программирование Rust📌 https://max.ru/channel_rust_lib Программирование Python 📌 https://max.ru/python_of Python академия. https://max.ru/BookPython Библиотека Python разработчика Java разработка 📌 https://max.ru/bookjava Библиотека Java разработчика https://max.ru/channel_java_geek Java Geek GitHub Сообщество 📌 https://max.ru/githublib Интересное из GitHub Базы данных (Data Base) 📌 https://max.ru/database_info Все про базы данных Фронтенд разработка 📌 https://max.ru/frontend_1 Подборки для frontend разработчиков Библиотеки 📌 https://max.ru/programmist_of Книги по программированию https://max.ru/proglb Библиотека программиста https://max.ru/bfbook Книги для программистов Программирование 📌 https://max.ru/bookflow Лекции, видеоуроки, доклады с IT конференций https://max.ru/itmozg Программисты, дизайнеры, новости из мира IT https://max.ru/php_lib Библиотека PHP программиста 👨🏼‍💻👩‍💻 Шутки программистов 📌 https://max.ru/itumor Шутки программистов Защита, взлом, безопасность 📌 https://max.ru/thehaking Канал о кибербезопасности https://max.ru/xakkep_1 Хакер Free Книги, статьи для дизайнеров 📌 https://max.ru/odesigners Статьи, книги для дизайнеров Математика 📌 https://max.ru/Pomatematike Канал по математике https://max.ru/phismat_1 Обучающие видео, книги по Физике и Математике Вакансии в IT📌 https://max.ru/progjob https://max.ru/channel_rabotait Мир технологий 📌 https://max.ru/mir_teh Канал для любознательных Бонус 📌 https://max.ru/piterspb_78 Свежие новости Санкт-Петербурга https://max.ru/mockva_life Свежие новости Москвы https://max.ru/piterspb Питер Новости: Санкт-Петербург / СПБ / ДТП2,01%
  • 20 февр.без подписи1,72%
  • 27 июл.Что такое пул строк? Это набор строк, хранящийся в Heap. ☕ Пул строк возможен благодаря неизменяемости строк в Java и реализации идеи интернирования строк; ☕ Пул строк помогает экономить память, но по этой же причине создание строки занимает больше времени; ☕ Когда для создания строки используются ", то сначала ищется строка в пуле с таким же значением, если находится, то просто возвращается ссылка, иначе создается новая строка в пуле, а затем возвращается ссылка на неё; ☕ При использовании оператора new создаётся новый объект String. Затем при помощи метода intern() эту строку можно поместить в пул или же получить из пула ссылку на другой объект String с таким же значением; ☕ Пул строк является примером паттерна «Приспособленец» (Flyweight). 📲 Мы в MAX 👉 @java_geek1,63%
  • 10 авг.🕵️ Java var: Удобный сахар или скрытая угроза? С выходом Java 10 ключевое слово var позволило нам писать меньше кода. var - это Local Variable Type Inference. Это значит, что Java осталась строго типизированным языком, просто теперь компилятор сам догадывается о типе переменной, глядя на то, что находится справа от знака равно (=). Но иногда его догадки могут вас удивить. Вот 3 примера, где var работает неочевидно. 1. Ловушка "Diamond Operator" (<>) Самая частая ошибка новичков. // Без var (Классика) List<String> list = new ArrayList<>(); // Компилятор видит слева List<String> и понимает, что справа тоже String. // С var (Ошибка) var list = new ArrayList<>(); В чем проблема? У компилятора нет информации о типе. Он видит пустые скобки <> и решает, что это ArrayList<Object>. В итоге вы теряете типизацию: list.add("Hello"); list.add(123); // ✅ Это сработает, хотя вы, вероятно, хотели только строки! ✅ Как исправить: Если используете var с конструктором, всегда указывайте тип справа: var list = new ArrayList<String>(); 2. Магия "Пересечения типов" (Intersection Types) А вот это уже высший пилотаж, который часто встречается при использовании List.of() или Map.of(). Что будет, если сложить в список данные разных типов? var magicList = List.of(10, 20.5, "30"); // Какой тут тип списка? List<Object>? На самом деле компилятор выведет наиболее специфичный общий тип. Тип переменной magicList будет выглядеть примерно так: List<? extends Serializable & Comparable<? extends Serializable & Comparable<?>>> Java находит общие интерфейсы для Integer, Double и String (все они реализуют Serializable и Comparable) и создает этот ужасный тип-франкенштейн. Это работает, но может свести с ума вашу IDE или методы, принимающие конкретные типы. 3. Анонимные классы на стероидах var позволяет делать трюк, невозможный ранее: сохранять тип анонимного класса. var user = new Object() { String name = "Alex"; int age = 25; }; // Это работает! System.out.println(user.name); System.out.println(user.age); Если бы мы написали Object user = ..., поля name и age были бы недоступны. А var "видит" реальную структуру анонимного объекта. Это иногда полезно для локальных промежуточных вычислений, заменяя DTO или кортежи. 🧠 Золотое правило использования var хорош тогда, когда тип очевиден из правой части: 🔴👍 var users = Map.of("id", 1); (Понятно, что это Map) 🔴👍 var stream = list.stream(); (Понятно, что Stream) 🔴👎 var result = service.process(); (Что вернулось? boolean? User? null?) Читаемость кода важнее краткости! 📲 Мы в MAX 👉 @java_geek1,53%
  • 16 февр.без подписи1,24%
  • 14 июл.Расскажите о различиях вложенных классов: простых и статических? Простые вложенные классы используются для тесной связи с внешним классом, а статические — когда нужно логически сгруппировать некоторый функционал. Основные различия: - Простой вложенный класс имеет доступ к членам внешнего класса, статический - нет. - Для создания экземпляра простого вложенного класса нужен экземпляр внешнего класса, для статического - нет. - Простой вложенный класс зависит от экземпляра внешнего класса, статический - нет. 👉 @java_geek1,21%
  • 29 июл.🚀 Hibernate: Эффективное обновление с @DynamicUpdate Часто ли вы задумывались, почему Hibernate при обновлении одного поля в сущности генерирует SQL-запрос, который включает все поля? Это может быть неэффективно, особенно для сущностей с десятками колонок. Именно здесь на помощь приходит аннотация @DynamicUpdate! 💡 В чем проблема? (Без @DynamicUpdate) По умолчанию, когда вы вызываете repository.save(entity) для существующей сущности, Hibernate генерирует UPDATE запрос, который устанавливает значения для всех полей, кроме первичного ключа. // Without @DynamicUpdate update employee set age=?, // даже если только age изменился first_name=?, //... и это тоже last_name=? where id=? Если изменилось только age, остальные поля обновляются на те же значения, что были. ✨ Решение: @DynamicUpdate(true) Если вы добавите @DynamicUpdate к вашей сущности, Hibernate будет генерировать SQL-запрос UPDATE, который включает только те поля, которые были изменены (dirty-checking) с момента загрузки или создания сущности. Смотрим на код: @Entity @DynamicUpdate // ✨ Добавляем эту аннотацию! public class Employee extends AbstractPersistable<Long> { @Column String firstName; @Column String lastName; @Column Integer age; // ... } // В EmployeeService: // var entity = employeeRepository.findById(1L).get(); // entity.setAge(22); // Изменили только возраст // employeeRepository.save(entity); Сгенерированный SQL: // With @DynamicUpdate update employee set age=? // ✅ Обновляется ТОЛЬКО измененное поле where id=? ⚖️ Когда использовать? - Используйте, если у вас большие сущности (много колонок) и вы часто обновляете только небольшую часть полей. Это сэкономит трафик и немного ускорит базу данных. - Имейте в виду, что Hibernate придется динамически строить SQL-запрос при каждом обновлении, что может добавить небольшой оверхед, но обычно выгода от оптимизации SQL его перевешивает. Сделайте ваш код более чистым и эффективным! 🛠️ ❓ А вы используете @DynamicUpdate в своих проектах? Поделитесь в комментариях! 👇 P.S. Не путайте с @DynamicInsert, который делает то же самое для INSERT запросов (включает только не-null поля). 📲 Мы в MAX 👉 @java_geek1,19%
  • 24 февр.без подписи1,12%
  • 15 июл.Зачем нужен HashMap, если есть Hashtable? ☕ Методы класса Hashtable синхронизированы, что приводит к снижению производительности, а HashMap - нет; ☕ HashTable не может содержать элементы null, тогда как HashMap может содержать один ключ null и любое количество значений null; ☕ Iterator у HashMap, в отличие от Enumeration у HashTable, работает по принципу «fail-fast» (выдает исключение при любой несогласованности данных). Hashtable это устаревший класс и его использование не рекомендовано. 👉 @java_geek1,12%
  • 30 июн.Можно ли перегрузить static метод? Перегрузка методов позволяет создать несколько методов с одинаковым именем, но разными списками параметров. Это работает как для обычных, так и для статических методов класса. Например, можно создать статический метод sum, который будет складывать числа. Метод можно перегрузить, создав одну версию для сложения целых чисел (int), а другую — для сложения чисел с плавающей точкой (double). При вызове метода компилятор будет выбирать нужную версию на основе типа аргументов. Это делает класс с перегруженными методами более гибким и удобным для использования. 👉 @java_geek0,90%
  • 3 авг.☕️ Лямбды и Функциональные интерфейсы: Как это работает под капотом? Мы все любим лямбды в Java за краткость. Но задумывались ли вы, как строго типизированная Java понимает запись x -> x * 2, не зная типа переменной x? Все дело в Функциональных интерфейсах. Давайте разберем механику, которая превращает "бойлерплейт" в элегантный код. 🧩 Что такое SAM? В основе лежит концепция SAM (Single Abstract Method). Функциональный интерфейс - это интерфейс, у которого есть ровно один абстрактный метод. Лямбда-выражение - это не самостоятельный объект. Это ленивая реализация этого самого единственного метода "на лету". 🔥 До vs После Взгляните, как функциональный интерфейс Predicate<T> убивает лишний шум: // ❌ До Java 8 (Анонимный класс) // Куча лишнего кода ради одной проверки Predicate<String> isLong = new Predicate<String>() { @Override public boolean test(String s) { return s.length() > 5; } }; // ✅ С Лямбдой // Компилятор видит Predicate -> ищет метод test -> подставляет логику Predicate<String> isLong = s -> s.length() > 5; ⚙️ Магия invokedynamic Многие думают, что лямбда - это просто "сахар" для анонимных классов. Это не так! 💜 Анонимный класс создает реальный .class файл на диске при компиляции. 💜 Лямбда использует инструкцию байт-кода invokedynamic. Она связывает метод динамически только когда это нужно. 👉 Итог: Меньше мусора в памяти и быстрее загрузка приложения. 📚 Шпаргалка: "Великолепная четверка" В java.util.function есть интерфейсы на все случаи жизни. Запомните базу: 1. Predicate<T> ➜ boolean 💜 Суть: Проверка условия (фильтры). 💜 Пример: stream().filter(x -> x > 0) 2. Consumer<T> ➜ void 💜 Суть: Потребитель. Что-то делает с объектом, ничего не возвращая. 💜 Пример: list.forEach(System.out::println) 3. Function<T, R> ➜ R 💜 Суть: Преобразователь. Берет T, возвращает R. 💜 Пример: stream().map(User::getName) 4. Supplier<T> ➜ T 💜 Суть: Поставщик. Ничего не принимает, отдает объект. 💜 Пример: Optional.orElseGet(() -> new User()) 💡Всегда ставьте аннотацию @FunctionalInterface над своими интерфейсами. Это защитит от случайного добавления второго абстрактного метода, который сломает все лямбды в проекте. 📲 Мы в MAX 👉 @java_geek0,89%