☕ Java

Полный справочник: типы, строки, управляющие конструкции, ООП, record и enum, коллекции, Stream API, исключения, потоки, современные возможности и экосистема.

Шпаргалки · Программирование · #java #jvm #backend

Запуск и окружение

javac Main.java && java Main        java Main.java           # запуск одного файла (11+)
mvn clean package                   gradle build              # сборка
jshell                                                          # интерактивная оболочка

JDK: Temurin, Oracle, Corretto, Zulu. Версии LTS: 8, 11, 17, 21, 25. IDE: IntelliJ IDEA, Eclipse, VS Code.

Минимальная программа

public class Main {
    public static void main(String[] args) {
        System.out.println("Привет");
    }
}

Имя файла совпадает с именем публичного класса. Пакеты: package com.example.app;, импорт import java.util.*;.

Типы данных

Тип Размер Диапазон / пример
byte 8 бит −128…127
short 16 бит −32 768…32 767
int 32 бита ±2,1 млрд
long 64 бита 123L
float / double 32 / 64 бита 1.5f / 1.5
char 16 бит 'a'
boolean true, false

Обёртки: Integer, Long, Double, Boolean, Character. Ссылочные типы: String, массивы, классы, интерфейсы.

int n = 5; long big = 10_000_000_000L; double d = 3.14; var list = new ArrayList<String>();   // var (10+)
int[] arr = {1, 2, 3}; int[][] grid = new int[3][4]; arr.length;
Integer a = 127, b = 127;  a.equals(b);       // для объектов сравнивайте equals, не ==
(int) 3.9;  // 3 (приведение)   10 / 3;  // 3 (целочисленное)   10 / 3.0;  // 3.33

BigDecimal для денег, BigInteger для больших чисел.

Строки

String s = "Привет";
s.length(); s.charAt(0); s.substring(1, 3); s.indexOf("и"); s.contains("р"); s.toUpperCase();
s.trim(); s.strip(); s.isBlank(); s.replace("a", "b"); s.split(","); String.join(", ", list);
s.equals(t); s.equalsIgnoreCase(t); s.compareTo(t);
String.format("%s: %d (%.2f)", name, 5, 3.14159);   "x=%d".formatted(5);
"a".repeat(3);
String text = """
    Текстовый блок
    на несколько строк
    """;                                              // 15+
StringBuilder sb = new StringBuilder(); sb.append("a").append(1); sb.toString();

String неизменяем. Для склейки в цикле используйте StringBuilder.

Операторы и управление

if (x > 0) {} else if (x == 0) {} else {}
String r = x > 0 ? "+" : "-";
switch (day) {                                         // современное выражение (14+)
    case MON, TUE -> System.out.println("будни");
    case SAT, SUN -> System.out.println("выходные");
    default -> System.out.println("?");
}
int len = switch (obj) { case String s -> s.length(); case Integer i -> i; default -> 0; };   // шаблоны (21)
for (int i = 0; i < 3; i++) {}
for (String x : list) {}
while (cond) {}  do {} while (cond);
break; continue; outer: for (...) { break outer; }

Операторы: + - * / %, ++ --, == != < >, && || !, & | ^ ~ << >> >>>, instanceof, ?:.

Классы, интерфейсы, enum, record

public class User implements Comparable<User> {
    private final String name;
    private int age;
    public User(String name, int age) { this.name = name; this.age = age; }
    public String getName() { return name; }
    @Override public String toString() { return name + " (" + age + ")"; }
    @Override public boolean equals(Object o) { return o instanceof User u && name.equals(u.name); }
    @Override public int hashCode() { return java.util.Objects.hash(name); }
    @Override public int compareTo(User o) { return Integer.compare(age, o.age); }
}

interface Shape { double area(); default String info() { return "area=" + area(); } }
abstract class Base { abstract void run(); }

record Point(int x, int y) {}                               // 16+: неизменяемые данные
enum Role { ADMIN, USER; boolean isAdmin() { return this == ADMIN; } }
sealed interface Expr permits Num, Add {}                    // 17+: закрытая иерархия

Модификаторы доступа: public, protected, пакетный (по умолчанию), private. Ключевые слова: static, final, abstract, this, super.

Обобщения (generics)

class Box<T extends Comparable<T>> { T value; }
static <T> T first(List<T> xs) { return xs.get(0); }
List<? extends Number> ro; List<? super Integer> wo;        // wildcard

Стирание типов: на runtime параметры T недоступны.

Коллекции

Интерфейс Реализации Особенность
List ArrayList, LinkedList, List.of(...) порядок, дубли
Set HashSet, LinkedHashSet, TreeSet уникальность
Map HashMap, LinkedHashMap, TreeMap, ConcurrentHashMap ключ → значение
Queue / Deque ArrayDeque, PriorityQueue, LinkedList очередь, стек
List<Integer> l = new ArrayList<>(List.of(3, 1, 2));
l.add(4); l.get(0); l.remove(Integer.valueOf(3)); l.contains(2); Collections.sort(l); l.sort(Comparator.reverseOrder());
Map<String, Integer> m = new HashMap<>();
m.put("a", 1); m.getOrDefault("b", 0); m.merge("a", 1, Integer::sum); m.computeIfAbsent("k", k -> 0);
for (Map.Entry<String, Integer> e : m.entrySet()) { e.getKey(); e.getValue(); }

List.of, Set.of, Map.of создают неизменяемые коллекции.

Stream API и Optional

List<String> names = users.stream()
    .filter(u -> u.getAge() >= 18)
    .sorted(Comparator.comparing(User::getName))
    .map(User::getName)
    .toList();
int sum = nums.stream().mapToInt(Integer::intValue).sum();
Map<Role, List<User>> byRole = users.stream().collect(Collectors.groupingBy(User::getRole));
String csv = names.stream().collect(Collectors.joining(", "));
boolean any = users.stream().anyMatch(u -> u.getAge() > 60);

Optional<User> u = repo.findById(1);
String n = u.map(User::getName).orElse("гость");
u.ifPresent(System.out::println);

Параллельные потоки (parallelStream) используйте только на проверенных тяжёлых вычислениях.

Исключения

try (var in = new FileInputStream("a.txt")) {               // try-with-resources закрывает ресурс
    ...
} catch (FileNotFoundException | IllegalStateException e) {
    log.error("ошибка", e);
} finally { }
throw new IllegalArgumentException("значение должно быть > 0");
class AppException extends RuntimeException { AppException(String m, Throwable c) { super(m, c); } }

Проверяемые (IOException, обязательны к обработке) и непроверяемые (RuntimeException). Не глотайте исключения молча.

Файлы и ввод-вывод

Path p = Path.of("data", "a.txt");
String text = Files.readString(p);   List<String> lines = Files.readAllLines(p);
Files.writeString(p, "текст");        Files.exists(p);   Files.createDirectories(p.getParent());
try (var lines2 = Files.lines(p)) { lines2.filter(l -> !l.isBlank()).forEach(System.out::println); }
Scanner sc = new Scanner(System.in); sc.nextLine();

Многопоточность

ExecutorService pool = Executors.newFixedThreadPool(4);
Future<Integer> f = pool.submit(() -> 42); f.get();
pool.shutdown();

CompletableFuture<String> cf = CompletableFuture.supplyAsync(() -> "a").thenApply(String::toUpperCase);
cf.join();
try (var ex = Executors.newVirtualThreadPerTaskExecutor()) { ex.submit(task); }     // 21+: виртуальные потоки

AtomicInteger counter = new AtomicInteger(); counter.incrementAndGet();
synchronized (lock) { }    ReentrantLock lock2 = new ReentrantLock();

Правила: общее изменяемое состояние защищайте (synchronized, Lock, атомарные классы, ConcurrentHashMap), не используйте Thread.stop.

Дата и время

LocalDate d = LocalDate.of(2026, 5, 1); LocalDateTime.now(); Instant.now(); ZonedDateTime.now(ZoneId.of("Europe/Moscow"));
d.plusDays(7); ChronoUnit.DAYS.between(a, b); Duration.ofMinutes(5);
DateTimeFormatter.ofPattern("dd.MM.yyyy").format(d);

Класс java.util.Date и SimpleDateFormat устарели.

Тесты

@Test void adds() { assertEquals(3, calc.add(1, 2)); }
@ParameterizedTest @ValueSource(ints = {1, 2}) void positive(int n) { assertTrue(n > 0); }
@Mock Repo repo;   when(repo.find(1)).thenReturn(user);   verify(repo).find(1);

JUnit 5, Mockito, AssertJ, Testcontainers.

Подводные камни

  • == для строк и обёрток сравнивает ссылки: equals.
  • Переопределяйте equals и hashCode вместе.
  • NullPointerException: Optional, Objects.requireNonNull, аннотации.
  • Целочисленное переполнение без исключения: Math.addExact.
  • Мутация коллекции при обходе: ConcurrentModificationException.
  • Утечки ресурсов: всегда try-with-resources.

Экосистема по задачам

Задача Что взять
Веб Spring Boot, Quarkus, Micronaut, Javalin
БД Hibernate / JPA, jOOQ, Spring Data, Flyway, Liquibase
JSON Jackson, Gson
HTTP-клиент java.net.http.HttpClient, OkHttp, Feign
Логи SLF4J + Logback
Утилиты Guava, Apache Commons, Lombok
Сообщения Kafka, RabbitMQ клиенты, Spring Cloud Stream
Сборка Maven, Gradle
Качество Checkstyle, SpotBugs, SonarQube