☕ 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 |