
- Главная
- Каталог
- Интернет технологии
- Java | Фишки и трюки
Java | Фишки и трюки
Аудитория канала - начинающие или опытные Java программисты. Канал о разработке приложений на Java, в том числе написание бэкенд и web-приложений. Рассматриваются фишки и трюки при программировании на Java.
Статистика канала
byte — (byte)0;
short — (short)0;
int — 0;
long — 0L;
float — 0f;
double — 0d;
char — \u0000;
boolean — false;
Объекты (в том числе String) — null.
{}
#java #initializationFiles
Чтение всего файла в список строк (readAllLines)
import java.nio.file.*;
import java.io.IOException;
import java.util.List;
public class Main {
public static void main(String[] args) throws IOException {
Path path = Paths.get("example.txt");
List<String> lines = Files.readAllLines(path);
lines.forEach(System.out::println);
}
}{}
📌 Читает весь файл в List<String>, удобно для небольших файлов.
Запись в файл (write)
List<String> lines = List.of("Первая строка", "Вторая строка");
Files.write(Paths.get("output.txt"), lines);{}
📌 Если файла нет — создаст, если есть — перезапишет.
Добавление в файл (без перезаписи):
Files.write(Paths.get("output.txt"), lines, StandardOpenOption.APPEND);{}
#java #Files #readAllLines #writeint, double) живут в быстром Стеке (Stack), а вот объекты (new Object()) всегда создаются в медленной Куче (Heap), и потом за ними приходит Garbage Collector".
Спойлер: В некоторых случаях JVM может вообще не создавать объект в heap
Создание объекта в Heap не бесплатно. Нужно выделить память, синхронизировать потоки, а потом еще и напрягать GC, чтобы этот мусор собрать. Поэтому JIT-компилятор научился магии под названием Escape Analysis (Анализ утечки).
Как это работает?
Допустим, у вас есть метод:
public int calculateArea(int x, int y) {
// Создаем временный объект
Point p = new Point(x, y);
return p.getX() * p.getY();
}
{}
Казалось бы, при каждом вызове метода мы засоряем Heap новым объектом Point. Но JIT-компилятор во время работы программы анализирует код и задает себе вопрос: "А убегает ли этот объект за пределы метода?"
В нашем случае p никуда не передается, не сохраняется в глобальную коллекцию и не возвращается наружу (возвращается только int). Объект не убегает (No Escape).
✨ Магия Скалярной замены (Scalar Replacement)
Поняв это, JVM принимает гениальное решение: она вообще не создает объект Point в Куче!
Вместо этого она "расщепляет" объект на его составляющие примитивы (поля x и y) и держит их в регистрах или других внутренних структурах JIT.
Для процессора этот код превращается во что-то такое:
public int calculateArea(int x, int y) {
int p_x = x;
int p_y = y;
return p_x * p_y;
}
{}
Что это дает?
1. 0 байт выделено в Heap.
2. 0 миллисекунд потрачено на работу Garbage Collector.
3. Скорость выполнения может быть очень близка к нативной производительности.
Итог:
В большинстве обычных случаев можно не бояться создавать короткоживущие объекты внутри методов (DTO, обертки, Optional), если это делает код чище. JVM достаточно умна, чтобы "схлопнуть" их и не нагружать память. Экономить на спичках и переиспользовать один объект через reset() больше не нужно.java.lang.Object нельзя переопределить как статические;
null, сортировки коллекций и т.д.
Вызывать static метод интерфейса можно используя имя интерфейса:
interface Paper {
static void show() {
System.out.println("static show()");
}
}
class Licence {
public void showPaper() {
Paper.show();
}
}{}
Stream API, которые упростят код
Stream API – мощный инструмент, но в нём есть интересные методы, о которых многие забывают.
takeWhile() – берёт элементы, пока условие true.
dropWhile() – пропускает элементы, пока условие true.
iterate() – создаёт бесконечный поток.
flatMap() – преобразует вложенные структуры в плоский поток.
collect(Collectors.toMap()) – собирает Stream в Map.
List<Integer> numbers = List.of(1, 2, 3, 4, 5);
numbers.stream()
.takeWhile(n -> n < 4)
.forEach(System.out::println); // 1, 2, 3{}
for.
#java #streamapi #functionalprogramminginterface используется для создания полностью абстрактных классов. Основное предназначение интерфейса - определять каким образом мы можем использовать класс, который его реализует. Создатель интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не реализует их поведение. Все методы неявно объявляются как public.
Начиная с Java 8 в интерфейсах разрешается размещать реализацию методов по умолчанию default и статических static методов.
Интерфейс также может содержать и поля. В этом случае они автоматически являются публичными public, статическими static и неизменяемыми final.NullPointerException. Код молчит, логи не помогают, а прод падает. Это как найти труп без документов — придётся вызывать детектива.
Почему так происходит и как вычислить убийцу — разбираемся -g:none), атрибут не создаётся. Также строки могут отсутствовать у динамически генерируемых классов — лямбд, прокси, байткод-библиотек.
// Пример с лямбдой (частая причина)
List<String> list = null;
list.stream().forEach(s -> System.out.println(s.length()));
// NPE здесь, но стек покажет lambda$... без строки{}
lambda$process$1, значит, беда в первой или второй лямбде внутри метода process. Посмотри на все лямбды в этом методе и проанализируй, что могло быть null.
2. Логируй входные данные перед подозрительным местом
log.debug("Processing order: order={}, customer={}", order, order.getCustomer());
order.getCustomer().applyDiscount(); // потенциальный NPE{}
public void process(Order order) {
Objects.requireNonNull(order, "order must not be null");
Objects.requireNonNull(order.getCustomer(), "customer must not be null");
// ...
}{}
🟡 Всегда компилируй с отладочной информацией (в Maven это <debug>true</debug>).🟡 Используй Optional для явного обозначения возможного null.🟡 Пиши тесты, которые проверяют граничные случаи (null, пустые коллекции).🟡 Включай логирование ключевых параметров на входе в методы.
null явно.TreeSet и HashSet — это два класса, реализующих интерфейс Set, но они имеют разные внутренние механизмы и свойства.
Структура данных
✔️ HashSet использует хеш-таблицу для хранения элементов. Это позволяет быстро добавлять, удалять и искать элементы, не обеспечивая никакого порядка их хранения.
✔️ TreeSet использует красно-черное дерево (Red-Black Tree), что позволяет хранить элементы в отсортированном порядке (естественном порядке элементов или порядке, определённом компаратором).
Порядок элементов
✔️ HashSet не гарантирует какого-либо порядка элементов. Порядок может быть случайным, и он не сохраняется при добавлении/удалении элементов.
✔️ TreeSet хранит элементы в отсортированном порядке. Если элементы реализуют интерфейс Comparable, то сортировка будет основана на их естественном порядке (например, для чисел — по возрастанию). Также можно задать пользовательский порядок с помощью объекта Comparator.
Скорость операций
✔️ HashSet обеспечивает O(1) для операций добавления, удаления и поиска (в среднем, если хеш-функция работает эффективно и коллизий мало).
✔️ TreeSet обеспечивает O(log n) для операций добавления, удаления и поиска из-за использования сбалансированного дерева.
Поддержка дополнительных операций
✔️ HashSet не поддерживает дополнительные методы для работы с диапазонами или порядком элементов.
✔️ TreeSet предоставляет такие методы, как subSet(), headSet(), tailSet(), которые позволяют работать с диапазонами элементов в отсортированном множестве.
Null-значения
✔️ HashSet может хранить одно null значение.
✔️ TreeSet не позволяет хранить null значения, так как при добавлении null неясно, как его сравнивать с другими элементами.
Когда использовать
✔️ Используйте HashSet, если вам не важен порядок элементов и вам нужна максимальная производительность.
✔️ Используйте TreeSet, если нужно поддерживать элементы в отсортированном порядке.
#java #HashSet #TreeSetОтзывы канала
всего 11 отзывов
- Добавлен: Сначала новые
- Добавлен: Сначала старые
- Оценка: По убыванию
- Оценка: По возрастанию
Каталог Телеграм-каналов для нативных размещений
Java | Фишки и трюки — это Telegam канал в категории «Интернет технологии», который предлагает эффективные форматы для размещения рекламных постов в Телеграмме. Количество подписчиков канала в 6.9K и качественный контент помогают брендам привлекать внимание аудитории и увеличивать охват. Рейтинг канала составляет 17.9, количество отзывов – 11, со средней оценкой 5.0.
Вы можете запустить рекламную кампанию через сервис Telega.in, выбрав удобный формат размещения. Платформа обеспечивает прозрачные условия сотрудничества и предоставляет детальную аналитику. Стоимость размещения составляет 2237.76 ₽, а за 86 выполненных заявок канал зарекомендовал себя как надежный партнер для рекламы в TG. Размещайте интеграции уже сегодня и привлекайте новых клиентов вместе с Telega.in!
Вы снова сможете добавить каналы в корзину из каталога
Комментарий