Java Fundamentals

Guia comprehensive da linguagem Java — do básico ao moderno (Java 8 → 25). Para um senior em entrevista internacional, o que importa não é decorar sintaxe — é entender a JVM, dominar Collections e Streams, saber quando usar cada feature e reconhecer as armadilhas clássicas. Para deep dive em concorrência (Memory Model, locks, Virtual Threads), veja Java Concurrency.

O que é

Java é uma linguagem orientada a objetos, fortemente e estaticamente tipada, compilada para bytecode, garbage-collected, e projetada em torno do princípio “write once, run anywhere” via JVM. Criada em 1995 por James Gosling na Sun Microsystems (hoje Oracle), é a espinha dorsal de sistemas enterprise, microserviços backend, Android (até recentemente), big data (Hadoop, Spark, Kafka), e de toda a stack Spring.

Em entrevistas, o que diferencia um senior em Java:

  1. Entender a JVM — memória, GC, JIT, classloader — não apenas usar como caixa preta
  2. Dominar Collections — saber escolher ArrayList vs LinkedList vs ArrayDeque com argumentos
  3. Streams com parcimônia — saber quando Stream adiciona clareza e quando for-loop é melhor
  4. Concorrência — Memory Model, happens-before, quando usar synchronized vs Lock vs atômicos
  5. Modern Java — Records, pattern matching, sealed classes, Virtual Threads
  6. Pitfalls — autoboxing em loops, == em Strings, mutação acidental, exceptions mal tratadas

JVM (Java Virtual Machine)

Migrado para galho próprio


Sintaxe básica e tipos

Migrado para galho próprio


Estruturas de controle

Migrado para galho próprio


Strings

Migrado para galho próprio


Arrays

Migrado para galho próprio


OOP em Java

Migrado para galho próprio


Records (Java 16+)

Migrado para galho próprio


Sealed Classes (Java 17+)

Migrado para galho próprio


Pattern Matching

Migrado para galho próprio


Annotations

Migrado para galho próprio

Expandido no galho Linguagem e sintaxe moderna. Veja 11 - Annotations.


Collections Framework

Migrado para galho próprio


Lambdas e Interfaces Funcionais

Migrado para galho próprio


Streams API

Migrado para galho próprio


Date/Time API (Java 8+)

Migrado para galho próprio


I/O (Arquivos)

Migrado para galho próprio


Exceções

Migrado para galho próprio


Optional

Migrado para galho próprio


Generics

Migrado para galho próprio


Concorrência (visão geral)

Migra em galho futuro

Este tópico será expandido em galho próprio (Galho 4 (Concorrência e paralelismo)). Por ora permanece aqui.

Deep dive: Java Concurrency — Memory Model, happens-before, locks avançados, java.util.concurrent, Virtual Threads, Structured Concurrency, patterns e pitfalls.

Primitivas essenciais

// Thread básica (raramente criada diretamente em código moderno)
Thread thread = new Thread(() -> System.out.println("Running"));
thread.start();
 
// ExecutorService — pool gerenciado (preferido para código tradicional)
try (ExecutorService executor = Executors.newFixedThreadPool(4)) {
    Future<String> future = executor.submit(() -> fetchData());
    String result = future.get();  // bloqueia até completar
}  // executor fechado automaticamente (Java 19+)
 
// CompletableFuture — composição assíncrona declarativa
CompletableFuture.supplyAsync(() -> fetchUser(id))
    .thenApply(user -> enrichWithOrders(user))
    .thenAccept(user -> sendNotification(user))
    .exceptionally(ex -> { log.error("Failed", ex); return null; });
 
// Paralelismo com múltiplos CompletableFutures
var userFuture = CompletableFuture.supplyAsync(() -> fetchUser(id));
var ordersFuture = CompletableFuture.supplyAsync(() -> fetchOrders(id));
CompletableFuture.allOf(userFuture, ordersFuture).join();
User user = userFuture.join();
List<Order> orders = ordersFuture.join();

Sincronização

  • synchronized — implícito, mais simples, monitor intrínseco do objeto. Default para a maioria dos casos.
  • ReentrantLock — explícito, tryLock com timeout, interruptível, fair mode. Para cenários avançados.
  • volatile — garante visibilidade entre threads, mas não atomicidade. Para flags e publicação segura.
  • java.util.concurrent.atomicAtomicInteger, AtomicReference, LongAdder para operações atômicas lock-free.

Virtual Threads (Java 21)

Threads leves gerenciadas pela JVM (não pelo OS). Ideais para I/O-bound.

// Virtual threads — milhões de threads sem overhead
try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
    IntStream.range(0, 100_000).forEach(i ->
        executor.submit(() -> {
            var data = httpClient.send(request, bodyHandler);  // bloqueia, mas barato
            return process(data);
        })
    );
}

Quando usar:

  • I/O-bound (HTTP, DB, fila) — ganho enorme
  • CPU-bound — não ajuda (use platform threads)
  • Código que já depende de ThreadLocal — pode não performar bem (use Scoped Values)

→ Para detalhes e patterns, ver Java Concurrency


Features modernas por versão

Migrado para galho próprio


Armadilhas comuns

  • NullPointerException: usar Optional para retornos, Objects.requireNonNull() para validação
  • Mutabilidade acidental: List.of() é imutável, Collections.unmodifiableList() é view (original mutável!)
  • ConcurrentModificationException: modificar coleção durante iteração. Usar Iterator.remove() ou Streams.
  • Autoboxing em loops: Integer em vez de int em loops grandes = milhões de objetos
  • String concatenação em loop: usar StringBuilder, não +=
  • == para comparar Strings: usar .equals(). == funciona com literais por causa do pool, mas falha com new String()
  • Parallel streams sem pensar: ForkJoinPool compartilhado, poucos elementos = overhead > ganho

Na prática

Em projetos enterprise com Java 21, Records são o padrão para DTOs — eliminam boilerplate de equals/hashCode/toString mantendo imutabilidade. Streams e lambdas cobrem a maior parte das transformações de dados; CompletableFuture é o padrão para orquestrar chamadas paralelas a serviços externos. A adoção de Virtual Threads (Java 21) elimina a necessidade de tuning fino de thread pools em endpoints I/O-bound, simplificando a operação de microserviços com alto volume de chamadas blocking. Collections e Streams representam a maior fatia do uso cotidiano; concorrência e I/O completam o quadro em integrações e processamento assíncrono.

Como explicar em inglês

Vocabulário de entrevista migrou para os galhos

Cada nota dos galhos tem uma seção “Em entrevista” com frase pronta em inglês (3+ sentenças) e vocabulário PT→EN. Para Collections/Streams/funcional, ver Collections, Streams e Programação Funcional; para linguagem, Linguagem e sintaxe moderna; para concorrência, Concorrência e paralelismo.

Recursos

Veja também