Java | Фишки и трюки
Open in Telegram
Java: примеры кода, интересные фишки и полезные трюки Купить рекламу: https://telega.in/c/java_tips_and_tricks ✍️По всем вопросам: @Pascal4eg
Show more6 811
Subscribers
-624 hours
-137 days
-6930 days
Posts Archive
6 812
+4
⚡️ Linux теперь в Telegram!
Ребята сделали крутейший канал про Linux, где на простых картинках и понятном языке обучают работе с этой ОС, делятся полезными фишками и инструментами
Подписывайтесь: @linuxos_tg
6 812
☕️ JGraphT
🔄JGraphT - это мощная библиотека для работы с графами в Java. Она предоставляет широкий спектр алгоритмов и структур данных для решения задач, связанных с теорией графов.
✔️ Пример: Поиск кратчайшего пути в взвешенном графе
import org.jgrapht.Graph;
import org.jgrapht.alg.shortestpath.DijkstraShortestPath;
import org.jgrapht.graph.DefaultWeightedEdge;
import org.jgrapht.graph.SimpleWeightedGraph;
public class RoadNetworkExample {
public static void main(String[] args) {
// Создаем взвешенный граф
Graph roadNetwork =
new SimpleWeightedGraph<>(DefaultWeightedEdge.class);
// Добавляем города (вершины)
roadNetwork.addVertex("Москва");
roadNetwork.addVertex("Санкт-Петербург");
roadNetwork.addVertex("Нижний Новгород");
roadNetwork.addVertex("Казань");
// Добавляем дороги (ребра) с расстояниями
roadNetwork.setEdgeWeight(roadNetwork.addEdge("Москва", "Санкт-Петербург"), 700);
roadNetwork.setEdgeWeight(roadNetwork.addEdge("Москва", "Нижний Новгород"), 400);
roadNetwork.setEdgeWeight(roadNetwork.addEdge("Нижний Новгород", "Казань"), 400);
roadNetwork.setEdgeWeight(roadNetwork.addEdge("Санкт-Петербург", "Казань"), 1500);
// Находим кратчайший путь
DijkstraShortestPath dijkstraAlg =
new DijkstraShortestPath<>(roadNetwork);
var path = dijkstraAlg.getPath("Москва", "Казань");
System.out.println("Кратчайший путь: " + path.getVertexList());
System.out.println("Общее расстояние: " + path.getWeight() + " км");
}
}
🛠JGraphT предоставляет мощные инструменты для работы с графами, что делает его незаменимым для решения задач оптимизации, анализа сетей и многих других областей, где применяется теория графов.6 812
⚡ Новые каналы с вакансиями и стажировками для джунов
В этих каналах публикуются все свежие вакансии и стажировки
🔺 ВАКАНСИИ
Горячие вакансии с привлекательными офферами для джуниор разработчиков, аналитиков, дизайнеров и QA-специалистов.👉 ПОДПИСАТЬСЯ 🔺СТАЖИРОВКИ
Стажировки для начинающих специалистов в IT независимо от возраста!👉 ПОДПИСАТЬСЯ 🔺IT interns
Свежие стажировки для junior специалистов в топовых компании России и мира👉 ПОДПИСАТЬСЯ 🔺Junojobs
Вакансии и стажировки для junior-разработчиков на удалёнке.👉 ПОДПИСАТЬСЯ 🔺БИГТЕХ
Junior вакансии и стажировки в крупнейших IT-компаниях мира: NVidia, Apple, T-банк, Яндекс, Google и т. д.👉 ПОДПИСАТЬСЯ 🔺Макс из < codereview />
Эксперименты про трудоустройство в IT, советы для быстрого поиска работы и офферы для джунов.👉 ПОДПИСАТЬСЯ
6 812
☕️Библиотека Java: AssertJ
💻AssertJ — это библиотека для написания fluent-assertions в тестах, которая предоставляет удобный и читаемый синтаксис для проверок. Основные возможности:1. ⏺Богатый набор утверждений для всех стандартных типов 2. ⏺Поддержка коллекций, массивов, Optional, дат 3. ⏺Расширяемый API для кастомных проверок 4. ⏺Читаемый синтаксис с цепочкой вызовов 🗂Примеры :
// Проверки строк
assertThat("Hello Java")
.startsWith("Hello")
.endsWith("Java")
.hasSize(10)
.contains(" ");
// Проверки коллекций
assertThat(userList)
.hasSize(3)
.extracting(User::getName)
.containsExactly("Alice", "Bob", "Charlie");
// Проверки исключений
assertThatThrownBy(() -> service.process(null))
.isInstanceOf(IllegalArgumentException.class)
.hasMessage("Parameter cannot be null");
🗂Расширенные возможности:
1.🗣 Для дат и времени:
assertThat(localDate)
.isAfter("2023-01-01")
.isBeforeOrEqualTo("2023-12-31");
2.🗣 Для Optional:
assertThat(optionalValue)
.isPresent()
.contains("expected");
3.🗣 Кастомные проверки:
assertThat(book)
.matches(b -> b.getPages() > 100, "толстая книга")
.matches(b -> b.getAuthor() != null, "имеет автора");
🟦Преимущества перед JUnit Assert:
1. 💬Более информативные сообщения об ошибках 2. 💬Поддержка цепочек проверок 3. 💬Встроенные проверки для коллекций 4. 💬Удобная работа с исключениями 5. 💬Поддержка Java 8+ features
6 812
Каждый день без изучения ИИ — это упущенная возможность
Пока другие осваивают нейросети и зарабатывают на этом, вы тратите время впустую.
Канал «That's IT» — проводник в мире технологий, интернет-культуры, трендов и нейросетей.
Здесь вы найдете:
— Ежедневные дайджесты главных новостей ИИ.
— Эксклюзивные инсайты о разработках и технологиях
— Айтишный юмор и немного милых котиков
Подписывайтесь и читайте самое важное из мира искуственного интеллекта: @thats_it_ai_tech
6 812
☕️ Lambda - выражения
⏺Одной из наиболее полезных фишек в Java, которая упрощает написание кода, является:
🔴Lambda-выражения.
Позволяют писать код более кратко и читаемо, особенно при работе с функциональными интерфейсами.
❔Что такое Lambda-выражения?
🖌Lambda-выражения — это анонимные функции, которые могут принимать аргументы и возвращать значения. Они похожи на методы, но не имеют имени и могут быть определены прямо в теле метода. Это позволяет упростить код, удалив ненужную обертку.
📁 Пример использования Lambda-выражений
// Без Lambda
File directory = new File("./src/main/java");
String[] list = directory.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
});
// С Lambda
File directory = new File("./src/main/java");
String[] list = directory.list((dir, name) -> name.endsWith(".java"));
📈 Преимущества Lambda-выражений
1. 🔺Уменьшение количества кода: Lambda-выражения позволяют избежать создания анонимных классов, что делает код более лаконичным.
2. 🔺Улучшение читаемости: Код становится более понятным, так как основное внимание уделяется логике, а не обертке.
3.🔺 Упрощение работы с функциональными интерфейсами: Lambda-выражения идеально подходят для реализации функциональных интерфейсов, которые имеют только один абстрактный метод.6 812
Время автоматизировать QA на JavaScript 🌚
Автоматизация шагает вперед: спрос на автотесты на JS продолжает расти!
По данным последнего опроса Stack Overflow, больше 60% QA-инженеров начинают карьеру с изучения JS. И даже фреймворк Allure 3, который раньше ассоциировался в основном с Java, теперь переписан на JavaScript.
В этот четверг в 20:00 (мск) у школы QA-инженеров QA.GURU пройдет вебинар по автоматизации тестирования на JavaScript.
👉 На занятии вы узнаете о профессии QA и трендах профессии.
👉 Поработаете с фреймворком Playwright.
👉 Напишете и запустите свой автотест на JS.
А еще после урока вас ждет полноценная домашка, которую проверит преподаватель школы. Все участники вебинара получат обратную связь по ДЗ.
🔗 Зарегистрируйтесь на открытый урок, чтобы получить ссылку на трансляцию.
Попробуйте себя в новой профессии!
6 812
⌨️ Неочевидный момент: Переполнение при умножении
Integer
В Java тип int (и его обёртка Integer) имеют фиксированный размер 32 бита. Если происходит переполнение (overflow), Java не выбрасывает ошибку, а просто "заворачивает" число.
✔️ Пример:
public class OverflowTest {
public static void main(String[] args) {
int max = Integer.MAX_VALUE; // 2147483647
int result = max * 2; // Переполнение!
System.out.println("Max: " + max); // Max: 2147483647
System.out.println("Result: " + result); // Result: -2
}
}
Почему? Потому что переполнение не вызывает ошибку — результат выходит за границу int и сбрасывается.
✔️ Что бы проверить переполнение используйте Math.multiplyExact():
public class SafeMultiply {
public static void main(String[] args) {
try {
int safeResult = Math.multiplyExact(Integer.MAX_VALUE, 2);
System.out.println(safeResult);
} catch (ArithmeticException e) {
System.out.println("Переполнение!");
}
}
}
Теперь при переполнении выбросится ArithmeticException.6 812
Вы ведь тоже хотите изучать программирование с легкостью и вдохновением?
Мой коллега из FAANG открыл свои каналы, где объясняет сложные темы простым языком, дерзайте 🔥
🐍 Ghostly Python - Разбираем код, автоматизируем рутину, пишем ботов, скрипты и полезные утилиты. Все что нужно для уверенного старта в программировании на Python.
☕️ Easy Java - вскрываем Java изнутри. Все тонкости этого универсального языка в одном канале, врывайся!
😎 IT Syndicate - петабайты свежего материала по всем направлениям. Backend, DevOps, Frontend - и это лишь малая часть..
6 812
☕️ Javassist
🌐Javassist - это мощная библиотека для манипуляции байткодом Java во время выполнения программы. Она позволяет динамически создавать и модифицировать классы и методы без необходимости перекомпиляции исходного кода.
💎Пример: Добавление логирования ко всем методам класса
import javassist.*;
public class LoggingExample {
public static void main(String[] args) throws Exception {
// Получаем пул классов
ClassPool pool = ClassPool.getDefault();
// Получаем класс, который хотим модифицировать
CtClass ctClass = pool.get("com.example.MyClass");
// Получаем все методы класса
CtMethod[] methods = ctClass.getDeclaredMethods();
for (CtMethod method : methods) {
// Добавляем логирование в начало каждого метода
method.insertBefore("System.out.println(\"Вызван метод: " + method.getName() + "\");");
// Добавляем логирование в конец каждого метода
method.insertAfter("System.out.println(\"Метод " + method.getName() + " завершен\");");
}
// Заменяем оригинальный класс модифицированным
ctClass.toClass();
// Теперь при использовании MyClass все его методы будут логироваться
// Например:
// MyClass obj = new MyClass();
// obj.someMethod();
}
}
🛠Javassist предоставляет мощные инструменты для метапрограммирования в Java. Это делает его незаменимым для разработки фреймворков, систем аспектно-ориентированного программирования и инструментов профилирования.6 812
🔍Тестовое собеседование на Middle Java-разработчика завтра
26 марта(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
📂 Илья Аров, старший разработчик в Т1, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Илья будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Илье
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2Vtzqx4kzGQ
6 812
⚡️ Как ускорить работу
HashMap?
HashMap – одна из самых эффективных структур, но её можно ещё ускорить.
✔️ 3 способа оптимизации:
🟢Задавайте начальный размер – по умолчанию HashMap увеличивается при заполнении на 75%, что может приводить к перераспределению. Укажите new HashMap<>(1000) для больших данных.
🟢Используйте computeIfAbsent() – сокращает проверку наличия ключа перед вставкой.
🟢Не используйте synchronized HashMap – вместо этого применяйте ConcurrentHashMap.
✔️ Пример:
Map<String, Integer> map = new HashMap<>(1000);
map.computeIfAbsent("key", k -> 42);
💡 Совет: Настраивайте HashMap под свои задачи, особенно если храните большие объёмы данных.
#java #hashmap #performance6 812
⌨️ Java | Tests - проверь свои знания в Java!
Только тесты, ничего лишнего!
Присоединяйся! 😉
👉 @java_tsts
6 812
☕️ Apache PDFBox
🌐Apache PDFBox - это мощная библиотека с открытым исходным кодом для работы с PDF-документами в Java. Она позволяет создавать новые PDF-файлы, манипулировать существующими и извлекать содержимое из PDF-документов.
👁 Пример: Создание PDF с таблицей и изображением
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import java.io.IOException;
public class PDFCreationExample {
public static void main(String[] args) throws IOException {
try (PDDocument document = new PDDocument()) {
PDPage page = new PDPage();
document.addPage(page);
try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
// Добавляем заголовок
contentStream.beginText();
contentStream.setFont(PDType1Font.HELVETICA_BOLD, 16);
contentStream.newLineAtOffset(50, 750);
contentStream.showText("Отчет о продажах");
contentStream.endText();
// Добавляем таблицу
drawTable(contentStream, 50, 700, new String[][] {
{"Продукт", "Количество", "Цена"},
{"Яблоки", "100", "50"},
{"Бананы", "150", "40"},
{"Апельсины", "75", "60"}
});
// Добавляем изображение
PDImageXObject image = PDImageXObject.createFromFile("path/to/image.jpg", document);
contentStream.drawImage(image, 50, 500, 200, 150);
}
document.save("Отчет_о_продажах.pdf");
}
}
private static void drawTable(PDPageContentStream contentStream, float x, float y, String[][] content) throws IOException {
// Метод для рисования таблицы (код опущен для краткости)
}
}
🛠Apache PDFBox предоставляет разработчикам гибкие инструменты для работы с PDF. Это делает его идеальным выбором для приложений, требующих создания отчетов, обработки форм или извлечения данных из PDF-документов.6 812
Битрикс24
💻Один онлайн-сервис для совместной работы.
📱10+ инструментов.
✅0 денег.
Счастливые сотрудники. Прибыльный бизнес.
Регистрируйтесь и забирайте себе
Зарегистрироваться
#реклама 16+
office-online.bitrix24.ru
О рекламодателе
6 812
⌨️ Сравнение
ArrayList vs LinkedList
Оба класса реализуют List, но имеют разные внутренние структуры и производительность.
ArrayList использует динамический массив, а LinkedList использует двусвязный список.
🤔 Что выбрать?
✔️ Используйте ArrayList, если важен быстрый доступ по индексу и добавление в конец.
✔️ Используйте LinkedList, если часто удаляете/вставляете элементы в середину.
📌 ArrayList чаще предпочтительнее, так как LinkedList требует больше памяти и редко даёт преимущества. 🚀6 812
🖥 Наконец-то нормальный канал по Python!
PytStart – для каждого питониста!
🔸 Полезные статьи
🔸 Лайфхаки и советы
🔸 Разбор кода и практические задания
Присоединяйся и начни свой путь в Python уже сегодня: @pytstart
6 812
⌨️
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];
}
}6 812
⌨️ Перегрузка (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");
}
}
⚡ Вывод:
✔️Перегрузка – это создание нескольких версий метода в одном классе.
✔️Переопределение – это изменение поведения метода родителя в подклассе.6 812
⌨️ 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 инициализация считается антипаттерном из-за проблем с производительностью и возможных утечек памяти.