Что важно знать
- Байтовые и символьные потоки, буферизация, кодировка явно.
- NIO: каналы, буферы, селекторы — основа Netty.
- Встроенная Java-сериализация небезопасна и хрупка — JSON, protobuf.
- java.time:
Instantдля моментов,ZonedDateTimeдля показа.
Потоки ввода-вывода, NIO, сериализация и java.time.
Instant для моментов, ZonedDateTime для показа.Практика. Обработать большой CSV построчно без загрузки в память и посчитать агрегаты.
Практика. Реализовать хранение событий с датами в UTC и вывод в часовом поясе пользователя с тестами на переход времени.
Войдите, чтобы пройти тест: сданный тест отмечает тему пройденной на карте и в ИПР.
InputStreamReader декодирует байты в символы, OutputStreamWriter кодирует символы в байты. Кодировку указывают явно: new InputStreamReader(in, StandardCharsets.UTF_8).
Полный разборIO (java.io) — потоки байт и символов, блокирующие: чтение держит поток, модель «поток на соединение». NIO (java.nio) — каналы и буферы, неблокирующий режим и Selector: один поток обслуживает тысячи соединений. Виртуальные потоки вернули простой блокирующий…
Полный разборDirect-буфер живёт вне кучи и передаётся ядру без промежуточного копирования (heap-буфер JVM копирует во временный нативный, потому что GC может переместить объект). Минусы: дорогое создание, освобождение недетерминировано (через GC), память не видна в -Xmx.
Полный разборjava.time (Java 8) неизменяем, потокобезопасен и с явной моделью: Instant, LocalDate, LocalTime, ZonedDateTime, Duration, Period. Date и Calendar изменяемы, месяцы с нуля, SimpleDateFormat не потокобезопасен, Date смешивает момент и представление.
Полный разборserialVersionUID — версия класса для встроенной сериализации. При несовпадении версии в потоке и у локального класса — InvalidClassException. Если не объявить, JVM вычислит её из структуры класса, и любое изменение (даже новый метод) сломает совместимость.
Полный разборВернётся новый объект, исходный не изменится — все типы java.time неизменяемы.
Полный разборБайтовые потоки (InputStream/OutputStream) — для любых двоичных данных, символьные (Reader/Writer) — для текста и учитывают кодировку.
Полный разборПочему java.time вытеснил Date/Calendar, машинное (Instant) и человеческое (LocalDateTime) время, часовые пояса, Duration/Period и потокобезопасный DateTimeFormatter.
Байтовые и символьные потоки, кодировки и Charset, буферизация и системные вызовы, декоратор-паттерн и современный файловый API.
io против nio, Channel и ByteBuffer с его flip/clear, Selector и event loop, влияние виртуальных потоков и NIO.2.
Java serialization и её механика, serialVersionUID, почему её опасно использовать и какие форматы выбирают вместо неё.
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.