🧠 O que é TreeMap?
TreeMap é uma implementação da interface NavigableMap baseada em uma árvore rubro-negra.
Ele mantém as chaves ordenadas de acordo com a ordem natural (Comparable) ou por meio de um Comparator fornecido.
🧪 Características principais
- Ordena as chaves automaticamente (ordem natural ou por Comparator)
- Não permite
nullcomo chave, mas permitenullcomo valor - Métodos especiais de navegação como
lowerKey,higherKey,ceilingKey,floorKey - Complexidade de tempo para operações: O(log n)
📘 Principais métodos
| Método | Descrição |
|---|---|
put(K key, V value) | Adiciona uma chave e valor |
get(K key) | Retorna o valor da chave |
remove(K key) | Remove uma chave e seu valor |
firstKey() | Retorna a primeira chave (menor) |
lastKey() | Retorna a última chave (maior) |
lowerKey(K key) | Retorna a maior chave estritamente menor que key |
floorKey(K key) | Maior chave ≤ key |
ceilingKey(K key) | Menor chave ≥ key |
higherKey(K key) | Menor chave estritamente maior que key |
descendingMap() | Retorna um NavigableMap com a ordem reversa |
keySet() | Retorna um Set das chaves |
values() | Retorna uma Collection dos valores |
entrySet() | Retorna um Set de Map.Entry<K, V> |
✅ Exemplo prático com comentários
import java.util.*;
import static java.lang.System.out;
public class ExemploTreeMap {
public static void main(String[] args) {
TreeMap<Integer, String> mapa = new TreeMap<>();
mapa.put(3, "Três");
mapa.put(1, "Um");
mapa.put(4, "Quatro");
mapa.put(2, "Dois");
out.println(mapa);
// {1=Um, 2=Dois, 3=Três, 4=Quatro}
out.println(mapa.firstKey()); // 1
out.println(mapa.lastKey()); // 4
out.println(mapa.lowerKey(3)); // 2
out.println(mapa.higherKey(3)); // 4
out.println(mapa.ceilingKey(3)); // 3
out.println(mapa.floorKey(3)); // 3
out.println(mapa.descendingMap());
// {4=Quatro, 3=Três, 2=Dois, 1=Um}
}
}
🔑 keySet()
Retorna: um Set<K> contendo somente as chaves do mapa.
Você pode usar esse método quando precisa iterar ou verificar apenas as chaves do Map.
TreeMap<Integer, String> map = new TreeMap<>();
map.put(1, "A");
map.put(2, "B");
for (Integer chave : map.keySet()) {
System.out.println(chave);
}
🖨️ Saída:
1
2
📦 values()
Retorna: uma Collection<V> com todos os valores do mapa.
Use quando você precisa trabalhar só com os valores, sem se importar com as chaves.
for (String valor : map.values()) {
System.out.println(valor);
}
🖨️ Saída:
A
B
🔑📦 entrySet()
Retorna: um Set<Map.Entry<K, V>> — ou seja, um conjunto de objetos contendo par chave-valor.
É o mais completo: permite acessar chave e valor ao mesmo tempo, ideal para iteração geral.
for (Map.Entry<Integer, String> entrada : map.entrySet()) {
System.out.println("Chave: " + entrada.getKey() + ", Valor: " + entrada.getValue());
}
🖨️ Saída:
Chave: 1, Valor: A
Chave: 2, Valor: B
🆚 Comparação rápida:
| Método | Retorna | Permite acessar | Pode modificar o valor? |
|---|---|---|---|
keySet() | Set<K> | Chave | Não diretamente |
values() | Collection<V> | Valor | Não diretamente |
entrySet() | Set<Map.Entry<K,V>> | Chave e Valor | ✅ Sim |
🧠 Dica de prova
- Se a questão pede apenas os valores, escolha
values(). - Se pede apenas as chaves, use
keySet(). - Se pede chave e valor, ou modificação, use
entrySet().
❌ Erro comum:
Tentar modificar um valor com keySet() ou values():
for (String valor : map.values()) {
// ❌ Isso não altera o mapa!
valor = "novo";
}
✅ Para alterar o valor corretamente:
for (Map.Entry<Integer, String> e : map.entrySet()) {
if (e.getKey() == 2) {
e.setValue("Novo Valor");
}
}
❌ Exemplos incorretos
TreeMap<String, String> mapa = new TreeMap<>();
mapa.put(null, "valor");
// ❌ NullPointerException
Comentário: TreeMap não permite null como chave pois precisa comparar as chaves com compareTo.
TreeMap<Object, String> mapa = new TreeMap<>();
mapa.put("a", "valor");
mapa.put(1, "outro"); // ❌
// ❌ ClassCastException em tempo de execução
Comentário: as chaves precisam ser mutuamente comparáveis, ou seja, a mesma classe ou classes compatíveis com compareTo.
🪄 Dicas e pegadinhas da prova
TreeMapnão permitenullcomo chave.- Os métodos de navegação (
lowerKey,higherKey, etc.) são muito cobrados. - O comportamento de
TreeMapmuda quando usamos umComparatorpersonalizado. - A ordenação é pela chave, não pelo valor.
- Se duas chaves forem consideradas iguais pelo
Comparator, apenas a última prevalece.
🎯 Simulado
1️⃣Qual a saída do seguinte código?
a – menor chave é 5
TreeMap<Integer, String> map = new TreeMap<>();
map.put(10, "A");
map.put(5, "B");
map.put(15, "C");
System.out.println(map.firstKey());
a) 5
b) 10
c) 15
d) A
2️⃣ Qual método retorna a maior chave estritamente menor que a chave fornecida?
c – lowerKey é menor estritamente
a) ceilingKey
b) floorKey
c) lowerKey
d) higherKey
3️⃣ O que acontece se você tentar adicionar null como chave em um TreeMap?
c – NullPointerException
a) Nada
b) Armazena normalmente
c) Lança NullPointerException
d) Substitui a chave anterior
4️⃣ Qual saída desse código?
c – chave 2 tem valor “B”
TreeMap<Integer, String> map = new TreeMap<>();
map.put(2, "B");
map.put(1, "A");
map.put(3, "C");
System.out.println(map.get(2));
a) null
b) A
c) B
d) 2
5️⃣ Como se obtém um Map ordenado em ordem reversa?
c – descendingMap()
a) map.reverse()
b) map.orderByDesc()
c) map.descendingMap()
d) map.sortDesc()
6️⃣ É possível usar tipos diferentes como chave em um TreeMap?
b – chaves precisam ser do mesmo tipo compatível com comparação
a) Sim
b) Não
c) Sim, se ambos implementarem Serializable
d) Sim, se ambos implementarem Comparable
7️⃣ Qual a saída?
b – lança NoSuchElementException
TreeMap<Integer, String> map = new TreeMap<>();
System.out.println(map.firstKey());
a) null
b) lança exceção
c) 0
d) compila e não imprime nada
8️⃣ Com relação à interface de TreeMap, qual afirmação é verdadeira?
d – usa uma árvore balanceada (Rubro-Negra)
a) É baseada em LinkedList
b) Permite chaves duplicadas
c) Ordena os elementos por valor
d) É baseada em árvore balanceada
9️⃣ O que map.ceilingKey(5) retorna se o mapa contém as chaves 3, 5 e 7?
b – ceilingKey retorna a chave igual ou maior mais próxima
a) 3
b) 5
c) 7
d) null
🔟 Qual a complexidade de tempo para inserções e buscas no TreeMap?
c – tempo logarítmico
a) O(1)
b) O(n)
c) O(log n)
d) O(n log n)
🧾 Resumo
TreeMapmantém chaves ordenadas.- Não permite
nullcomo chave. - Usa
Comparablepor padrão, mas pode aceitarComparator. - Ideal para buscas ordenadas e intervalares.
- Muito útil quando a ordem das chaves importa.
- Métodos como
lowerKey,ceilingKey,descendingMapsão favoritos na prova.