Aula 01 - Linguagem Java¶
Surgimento¶
Quando Java foi lançada em 1995, ela se destacou das outras linguagens de programação devido a várias características inovadoras. Aqui estão as principais que a diferenciaram na época:
1. "Write Once, Run Anywhere" (WORA) – Portabilidade¶
- Java foi projetada para ser independente de plataforma, graças à Java Virtual Machine (JVM).
- O código Java é compilado para bytecode, que pode ser executado em qualquer dispositivo com uma JVM, sem necessidade de recompilação.
- Isso foi revolucionário em comparação com linguagens como C e C++, que exigiam compilação específica para cada sistema operacional.
2. Orientação a Objetos Pura (OOP)¶
- Java foi uma das primeiras linguagens a adotar orientação a objetos de forma consistente (com exceção dos tipos primitivos).
- Recursos como herança, encapsulamento e polimorfismo foram implementados de maneira mais rígida do que em C++.
3. Gerenciamento Automático de Memória (Garbage Collection)¶
- Java introduziu um coletor de lixo (garbage collector) que automaticamente liberava memória não utilizada.
- Em linguagens como C e C++, o programador precisava gerenciar memória manualmente (com
malloc/freeounew/delete), o que podia levar a vazamentos e erros.
4. Segurança¶
- Java foi criada com foco em segurança, especialmente para execução de código remoto (como applets em navegadores).
- A JVM tinha um verificador de bytecode (bytecode verifier) para evitar operações maliciosas.
- Não havia ponteiros explícitos (como em C/C++), reduzindo riscos de acesso indevido à memória.
5. Multithreading Integrado¶
- Java trouxe suporte nativo a threads, facilitando a programação concorrente.
- Em outras linguagens, como C, o multithreading exigia bibliotecas externas ou chamadas específicas do sistema operacional.
6. Ausência de Ponteiros Explícitos¶
- Java removeu a aritmética de ponteiros, presente em C/C++, evitando erros comuns como corrupção de memória e acessos inválidos.
7. Biblioteca Padrão Rica (Java API)¶
- Java foi lançada com uma biblioteca robusta, incluindo:
- Coleções (
java.util.*) - Rede (
java.net.*) - E/S (
java.io.*) - Interface gráfica básica (
AWT, depoisSwing)
- Coleções (
8. Linguagem Simples (Comparada a C++)¶
- Java eliminou complexidades do C++, como:
- Herança múltipla (substituída por interfaces).
- Sobrecarga de operadores.
- Templates (genéricos só foram adicionados posteriormente).
9. Suporte a Rede e Internet¶
- Java foi criada na era da internet e trouxe recursos nativos para programação em rede, como sockets e HTTP.
10. Applets (Inovação na Web)¶
- Os applets Java permitiam executar código dinâmico em navegadores, algo revolucionário nos anos 90 (antes do JavaScript dominar).
Comparação com Linguagens da Época (1995):¶
| Característica | Java | C/C++ | Pascal | Visual Basic | Perl/Python |
|---|---|---|---|---|---|
| Portável (JVM) | ✅ | ❌ | ❌ | ❌ | ✅ (interpretado) |
| Garbage Collection | ✅ | ❌ | ❌ | ✅ | ✅ |
| Orientação a Objetos | ✅ | ✅ (C++) | ❌ | Parcial | ✅ (Python) |
| Multithreading | ✅ | ❌ (depende do SO) | ❌ | ❌ | ✅ (limitado) |
| Segurança | ✅ | ❌ | ❌ | ❌ | ❌ |
Conclusão:¶
Java se diferenciou por ser portável, segura, orientada a objetos e com gerenciamento automático de memória, combinando o melhor de linguagens como C++ e Smalltalk, enquanto eliminava suas complexidades. Isso a tornou ideal para a internet emergente e aplicações empresariais.
Comparação Java x Python¶
A comparação entre Java e Python hoje envolve diferenças significativas em desempenho, sintaxe, ecossistema e casos de uso. Vamos analisar os principais aspectos:
1. Paradigma e Sintaxe¶
| Característica | Java | Python |
|---|---|---|
| Paradigma | Orientado a objetos (rígido) | Multiparadigma (OO, funcional, procedural) |
| Sintaxe | Verbosa (exige tipos e {}) |
Concisa e legível (indentação obrigatória) |
| Exemplo (Hello World) | System.out.println("Hello"); |
print("Hello") |
| Tipagem | Estática e forte | Dinâmica e forte |
🔹 Python é mais fácil para scripts rápidos, enquanto Java exige mais estrutura.
2. Desempenho¶
| Característica | Java | Python |
|---|---|---|
| Compilação | Bytecode (JVM) | Interpretado (com otimizações em CPython) |
| Velocidade | Mais rápido (JIT da JVM) | Mais lento (exceto com PyPy/Cython) |
| Uso de Memória | Alto (JVM) | Geralmente menor |
🔹 Java é melhor para aplicações de alto desempenho (ex: sistemas financeiros).
🔹 Python é suficiente para scripts, automação e prototipagem.
3. Ecossistema e Bibliotecas¶
| Área | Java | Python |
|---|---|---|
| Web (Backend) | Spring, Jakarta EE | Django, Flask, FastAPI |
| Ciência de Dados | Weka, Deeplearning4j | Pandas, NumPy, TensorFlow, PyTorch |
| Automação/DevOps | Maven, Gradle | Scripting nativo, Ansible |
| Mobile | Android (Kotlin está substituindo) | Kivy (pouco usado) |
🔹 Python domina em IA, dados e scripts.
🔹 Java é forte em aplicações empresariais, bancos e Android.
4. Concorrência e Multithreading¶
| Característica | Java | Python |
|---|---|---|
| Threads | Nativo (mas pesado) | Limitado pelo GIL (Global Interpreter Lock) |
| Alternativas | Virtual Threads (Java 21+) | Multiprocessamento (multiprocessing) ou async (asyncio) |
🔹 Java é melhor para aplicações concorrentes pesadas.
🔹 Python sofre com o GIL, mas compensa com assincronia (FastAPI) ou processos paralelos.
5. Segurança e Manutenção¶
| Característica | Java | Python |
|---|---|---|
| Verificação de Tipos | Compilação rigorosa | Erros só em runtime |
| Legado Corporativo | Muito usado em bancos e governo | Mais comum em startups e pesquisa |
🔹 Java é mais seguro para sistemas críticos (ex: bancos).
🔹 Python é ágil, mas pode esconder bugs até a execução.
6. Mercado de Trabalho¶
| Característica | Java | Python |
|---|---|---|
| Demanda | Alta em empresas tradicionais | Explosão em IA, dados e startups |
| Salários | Consistentes (especialmente em fintechs) | Altos em áreas de dados/ML |
🔹 Java ainda domina em vagas de backend corporativo.
🔹 Python lidera em ciência de dados e automação.
Quando Usar Cada Um?¶
- Escolha Java se:
- Precisar de alta performance e escalabilidade (ex: sistemas bancários).
- Desenvolver para Android (embora Kotlin seja preferido hoje).
-
Trabalhar em grandes empresas com legado Java (ex: Oracle, IBM).
-
Escolha Python se:
- Prototipar rápido ou trabalhar com dados/IA (ML, análise de dados).
- Escrever scripts ou automações (DevOps, web scraping).
- Priorizar produtividade em vez de desempenho bruto.
Conclusão¶
- Java é poderoso, estruturado e rápido, mas exige mais código.
- Python é flexível e produtivo, mas menos eficiente em performance pura.
Ambos têm espaço no mercado, mas a escolha depende do projeto e do contexto. Se precisar de um meio-termo, linguagens como Kotlin (JVM) ou Go podem ser alternativas.
A linguagem Java passou por diversas mudanças significativas desde seu lançamento em 1996 até a versão 25 (JDK 25), prevista para setembro de 2025. Vamos explorar sua evolução, destacando as principais features e mudanças em cada versão:
Evolução¶
📌 JDK 1.0 (1996) – O Começo¶
- Primeira versão pública.
- Principais recursos:
- Applets Java (para navegadores).
- Biblioteca básica (AWT, IO, Threads).
- JVM (Java Virtual Machine).
📌 JDK 1.1 (1997) – Melhorias Iniciais¶
- Inner Classes (classes aninhadas).
- JDBC (conexão com bancos de dados).
- RMI (Remote Method Invocation).
- Reflection API.
📌 J2SE 1.2 (1998) – Java 2 Platform¶
- Divisão em J2SE, J2EE, J2ME.
- Collections Framework (
List,Set,Map). - Swing (substituiu parcialmente AWT).
- JIT Compiler (melhor desempenho).
📌 J2SE 1.4 (2002) – Maturação¶
- Expressões Regulares (
java.util.regex). - NIO (New I/O para operações não-bloqueantes).
- Logging API (
java.util.logging). - Assertions (
assertkeyword).
📌 Java 5 (2004) – Revolução (JDK 1.5)¶
- Generics (
List<String>). - Anotações (
@Override,@Deprecated). - Varargs (
void method(String... args)). - Enhanced for-loop (
for (String s : list)). - Enums (
enum Season { SPRING, SUMMER }).
📌 Java 6 (2006) – Estabilidade¶
- Scripting Engine (suporte a linguagens como JavaScript via
javax.script). - JDBC 4.0 (melhorias em conexão com bancos).
- Java Compiler API (programaticamente compilar código).
📌 Java 7 (2011) – Projeto Coin (pequenas melhorias)¶
- Strings em switch (
switch (str) { ... }). - Try-with-resources (
try (FileInputStream fis = ...)). - Diamond Operator (
List<String> list = new ArrayList<>()). - NIO.2 (
Files,Pathspara manipulação de arquivos).
📌 Java 8 (2014) – A Grande Revolução (Lambdas + Streams)¶
- Lambdas (
(x, y) -> x + y). - Stream API (
list.stream().filter(...).map(...)). - Optional (evitar
NullPointerException). - Default Methods em interfaces (
default void log() { ... }). - Nova API de Data/Hora (
java.time).
📌 Java 9 (2017) – Modularidade (Project Jigsaw)¶
- Módulos (
module-info.java). - JShell (REPL interativo).
- Factory Methods para Collections (
List.of(1, 2, 3)).
📌 Java 10 (2018) – Inferência de Tipo Local¶
var(var list = new ArrayList<String>()).
📌 Java 11 (2018) – LTS (Long-Term Support)¶
- HTTP Client (API nativa
java.net.http). - Remoção de recursos (Applets, JavaFX separado).
String::lines,isBlank().
📌 Java 12-16 (2019-2021) – Novidades Incrementais¶
- Switch Expressions (Java 14):
String dayType = switch (day) { case "MON", "TUE" -> "Weekday"; default -> "Weekend"; }; - Records (Java 16) – Classes imutáveis simplificadas:
record Person(String name, int age) {} - Text Blocks (Java 15) – Strings multilinha:
String json = """ { "name": "Java", "version": 15 } """; - Pattern Matching for
instanceof(Java 16):if (obj instanceof String s) { System.out.println(s.length()); }
📌 Java 17 (2021) – LTS (Atual Estável em 2024)¶
- Sealed Classes (limita herança):
public sealed class Shape permits Circle, Square {} - Novo Garbage Collector (ZGC, Shenandoah).
switchcom padrões (preview).
📌 Java 18-24 (2022-2024) – Novidades Contínuas¶
- Java 18: UTF-8 por padrão, API de vetores (incubadora).
- Java 19: Virtual Threads (Project Loom – concorrência leve).
- Java 20: Scoped Values (alternativa a
ThreadLocal). - Java 21 (LTS, 2023): Virtual Threads estáveis,
SequencedCollection. - Java 22-24: Melhorias incrementais em pattern matching, performance.
📌 Java 25 (Previsto para Set/2025) – O Que Esperar?¶
- Aprimoramento do Project Loom (mais recursos para virtual threads).
- Novas APIs de concorrência.
- Possível evolução do pattern matching.
- Melhorias na JVM (desempenho, segurança).
Resumo da Evolução do Java¶
| Versão | Ano | Destaques |
|---|---|---|
| 1.0 | 1996 | Applets, JVM básica |
| 1.2 | 1998 | Collections, Swing |
| 5 | 2004 | Generics, Annotations, Enums |
| 8 | 2014 | Lambdas, Streams, Optional |
| 9 | 2017 | Módulos (Project Jigsaw) |
| 11 (LTS) | 2018 | HTTP Client, var |
| 17 (LTS) | 2021 | Sealed Classes, ZGC |
| 21 (LTS) | 2023 | Virtual Threads estáveis |
| 25 | 2025 | Mais concorrência, performance |
Conclusão¶
Java evoluiu de uma linguagem para applets nos anos 90 para uma plataforma robusta usada em cloud, big data e sistemas críticos. As principais revoluções foram:
1. Java 5 (Generics, Annotations)
2. Java 8 (Lambdas, Streams)
3. Java 9 (Modularidade)
4. Java 17+ (Concorrência moderna com Virtual Threads)
A linguagem continua se modernizando, competindo com Kotlin, Go e Rust, mas mantendo seu ecossistema gigante. 🚀