Java for Beginner
описание
Канал от новичков для новичков! Изучайте Java вместе с нами! Здесь мы обмениваемся опытом и постоянно изучаем что-то новое! Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev Наш канал на RUTube - https://rutube.ru/channel/37896292/
Лучшие посты
за три месяцабез подписи
Что выведет код? import java.io.*; public class Task050626 { public static void main(String[] args) throws IOException { try (FileOutputStream fos = new FileOutputStream("data.bin")) { fos.write(300); } try (FileInputStream fis = new FileInputStream("data.bin")) { System.out.println(fis.read()); } } } #Tasks
Что выведет код? import java.io.*; public class Task010626 { public static void main(String[] args) throws IOException { byte[] data = {10, 20, 30, 40, 50}; InputStream is = new BufferedInputStream(new ByteArrayInputStream(data), 2); is.mark(1); is.read(); is.read(); is.reset(); System.out.println(is.read()); } } #Tasks
Что выведет код? public class Task020626 { private static volatile int counter = 0; public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(() -> { for (int i = 0; i < 10000; i++) { counter++; } }); Thread t2 = new Thread(() -> { for (int i = 0; i < 10000; i++) { counter++; } }); t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter); } } #Tasks
Что такое NavigableMap и NavigableSet?🤓 Ответ: NavigableMap (реализация — TreeMap) и NavigableSet (TreeSet) расширяют SortedMap/SortedSet, добавляя методы для навигации, близкие к запросам "ближайший меньший/больший элемент". Полезные методы: lowerKey() / lowerEntry() (строго меньше), floorKey() (меньше или равно), ceilingKey() (больше или равно), higherKey() (строго больше), descendingMap() (обратный порядок), subMap(from, to) (диапазон с опциями включения границ). Удобно для поиска интервалов, например, в системах бронирования. #собеседование
Что такое ReadWriteLock? Когда применять?🤓 Ответ: ReadWriteLock (интерфейс, реализация ReentrantReadWriteLock) разделяет блокировки на чтение и запись. Правила: несколько потоков могут одновременно захватить блокировку чтения, если нет блокировки записи. Блокировка записи эксклюзивна — захватывается только одним потоком, и при этом не должно быть активных читателей. Это повышает производительность в системах с частыми чтениями и редкими записями (например, кэш, конфигурация). Поток, захвативший блокировку чтения, не может "апгрейдиться" до блокировки записи (приведет к deadlock). #собеседование
Что такое DirectByteBuffer и off-heap memory? 🤓 Ответ: DirectByteBuffer — это класс, который выделяет память вне кучи (off-heap), напрямую через операционную систему. Такая память не управляется GC (но объект-буфер — в куче). Преимущества: 1) эффективный ввод-вывод (можно передать ядру без копирования). 2) снижение нагрузки на GC. 3) работа с большими блоками памяти. Недостатки: сложность управления (ручное освобождение через Cleaner или sun.misc.Unsafe). Используется в NIO, Netty, Cassandra. Утечки off-heap памяти могут привести к OutOfMemoryError типа "Direct buffer memory". #собеседование
Что выведет код? import java.io.*; import java.nio.charset.StandardCharsets; public class Task190626 { public static void main(String[] args) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); OutputStreamWriter writer = new OutputStreamWriter(baos, StandardCharsets.US_ASCII); writer.write('€'); writer.flush(); ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray()); InputStreamReader reader = new InputStreamReader(bais, StandardCharsets.US_ASCII); int ch = reader.read(); System.out.println(ch); } } #Tasks
С 23.05 по 29.05 Предыдущий пост(с 09.05 по 22.05) Запись встреч/видео: В разработке Обучающие статьи: [Совет по Java #041] Тема: Integer кэширует значения от -128 до 127. [Совет по Java #042] Тема: Comparator.comparing(Function) требует, чтобы ключ сравнения был Comparable. [Совет по Java #043] Тема: java.lang.Number — абстрактный класс, нельзя создать экземпляр. Раздел 9. Исключения, логирование, отладка Глава 2. Логирование (Logging) MDC (Mapped Diagnostic Context) – привязка контекстной информации к логам Логирование в «Библиотеке» Полезные статьи и видео: Как мы ускорили расчёт факторов ранжирования в поиске Ozon с помощью динамической компиляции Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Что такое ThreadFactory? 🤓 Ответ: ThreadFactory — это интерфейс для создания новых потоков с возможностью кастомизации. Единственный метод: Thread newThread(Runnable r). Используется в ExecutorService (например, Executors.newFixedThreadPool(10, myThreadFactory)). Позволяет задавать: имена потоков (для упрощения отладки), приоритеты, демонический статус, UncaughtExceptionHandler. Хорошая практика — создавать потоки с понятными именами (например, "db-pool-%d"). Утилита Executors.defaultThreadFactory() возвращает стандартную фабрику. #собеседование
Что такое record (Record-классы)? 🤓 Ответ: Records (Java 14 preview, финал в Java 16) — это неизменяемые (immutable) классы-носители данных. Объявляются как record Point(int x, int y) {}. Компилятор автоматически генерирует: конструктор, геттеры (с теми же именами), equals(), hashCode(), toString(). Можно добавить компактный конструктор для валидации. Records не могут наследоваться, но могут реализовывать интерфейсы. Идеальны для DTO, value objects, кортежей. Упрощают создание классов-данных, уменьшая шаблонный код. #собеседование
без подписи
С 09.05 по 22.05 Предыдущий пост(с 02.05 по 08.05) Запись встреч/видео: 13. Kafka: переход от очереди задач к журналу событий Keycloak с нуля: от первого токена до современной auth-архитектуры Обучающие статьи: [Совет по Java #035] Тема: java.util.Timer создает один поток для всех задач. [Совет по Java #037] Тема: File.delete() не бросает исключение при неудаче. [Совет по Java #038] Тема: SimpleDateFormat не потокобезопасен. [Совет по Java #039] Тема: String.split() принимает регулярное выражение. [Совет по Java #040] Тема: Переменные в catch и finally не видны снаружи. Раздел 9. Исключения, логирование, отладка Глава 2. Логирование (Logging) Подключение SLF4J + Logback в проект (Maven/Gradle). Базовый пример получения логгера Уровни логирования: TRACE, DEBUG, INFO, WARN, ERROR. Когда что использовать. Иерархия и фильтрация Параметризованные сообщения SLF4J: почему это лучше конкатенации строк Логирование исключений — правильная передача throwable последним параметром Конфигурация Logback через logback.xml (или logback-test.xml) Полезные статьи и видео: Java нас обманывает: скрытая цена чистого кода Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
С 30.05 по 12.06 Предыдущий пост(с 23.05 по 29.05) Запись встреч/видео: 14. Transactional Outbox: как гарантировать публикацию события Обучающие статьи: Раздел 11. Работа с файлами, I/O и сетью (NIO.2) Глава 1. Классический Java I/O (java.io (https://java.io/)) Байтовые потоки: абстрактные классы InputStream и OutputStream FileInputStream – чтение байтов из файла. Путь данных в памяти JVM FileOutputStream – запись байтов в файл. Путь данных от heap к диску Проблема производительности побайтового ввода/вывода. Идея буфера BufferedInputStream – буферизованное чтение. Путь данных через память JVM [Совет по Java #045] Тема: volatile не гарантирует атомарность. [Совет по Java #046] Тема: java.lang.Enum не может наследовать другой класс, потому что уже наследует Enum [Совет по Java #047] Тема: clone() — опасный метод с неясной семантикой. [Совет по Java #048] Тема: finalize() — устаревший и непредсказуемый. [Совет по Java #049] Тема: System.gc() не гарантирует запуск сборщика мусора. Полезные статьи и видео: Ты не хочешь стать программистом. Как и всегда, задачи можно найти под тегом - #Tasks, вопросы с собеседований - #собеседование
Какие новые методы появились в Stream API в Java 9? 🤓 Ответ: В Java 9 добавлены: Stream.iterate(T seed, Predicate hasNext, UnaryOperator next) — возможность задать условие остановки (усовершенствованный for-цикл). takeWhile(Predicate) — берёт элементы, пока условие истинно, затем прерывает поток. dropWhile(Predicate) — отбрасывает элементы, пока условие истинно, затем возвращает остаток. Эти методы позволяют работать с бесконечными стримами и условными потоками без использования limit или filter с побочным эффектом. Они эффективны для частичной обработки потоков. #собеседование
Что выведет код? import java.util.*; public class Task270526 { public static void main(String[] args) { List<Person> people = Arrays.asList( new Person("Alice", 25), new Person("Bob", 30), new Person("Charlie", 20) ); Comparator<Person> comparator = Comparator.comparing(p -> p.age); people.sort(comparator); System.out.println(people); } static class Person { String name; int age; Person(String name, int age) { this.name = name; this.age = age; } @Override public String toString() { return name + ":" + age; } } } #Tasks
Что такое JNI? Какие проблемы при его использовании? 🤓 Ответ: JNI (Java Native Interface) — это фреймворк, позволяющий Java-коду вызывать и быть вызванным нативными приложениями (C/C++). Используется для доступа к системным функциям, устройствам, оптимизации. Проблемы: 1) потеря переносимости (нужно компилировать под каждую ОС/архитектуру). 2) сложность отладки (ошибки в нативном коде могут крашнуть JVM). 3) утечки памяти в нативной части не отслеживаются GC. 4) накладные расходы на маршалинг данных. 5) несовместимость с модульной системой Java 9+. Альтернативы: Project Panama (Foreign Function API) в новых версиях Java. #собеседование
Что выведет код? import org.yaml.snakeyaml.Yaml; import java.util.Map; public class Task060826 { public static void main(String[] args) { String yaml = "enabled: on\nvalue: 010"; Yaml yamlParser = new Yaml(); Map<String, Object> data = yamlParser.load(yaml); System.out.println(data.get("enabled") + ", " + data.get("value")); } } #Tasks
Как работает finally с return?🤓 Ответ: Если в блоках try или catch есть оператор return, то блок finally всё равно выполнится перед фактическим возвратом значения. Если finally также содержит return, то он переопределит возвращаемое значение из try/catch. Исключение, выброшенное в finally, будет иметь приоритет над исключением из try/catch. Поэтому в finally не рекомендуется использовать return или бросать исключения — это может скрыть важную информацию. Лучше использовать finally только для освобождения ресурсов. #собеседование
История технологии сегодня — 07 августа ℹ️ Кто родился в этот день Джи́мми До́нал Уэ́йлс (англ. Jimmy Donal Wales, также известный под псевдонимом Джи́мбо (англ. Jimbo); род. 7 августа 1966, Хантсвилл, Алабама) — американский и британский интернет-предприниматель, идеолог концепции вики, основатель Википедии, председатель Фонда Викимедиа (2003—2006). С лета 2011 года — почётный председатель Фонда Викимедиа; директор компании Fandom (ранее — Wikia). 🌐 Знаковые события 1944 — запущен первый американский программируемый компьютер «Марк I». 1970 — проведён первый компьютерный шахматный турнир. #Biography #Birth_Date #Events #07августа