"Bem, como está o seu processador?"

"Está tudo bem. Sentei-me em nitrogênio líquido por uma hora, então agora estou como novo!"

"Ótimo. Então vamos continuar."

"Definir coleções."

Matematicamente falando, um conjunto é um grupo de elementos únicos. Assim, em programação, um Set é uma coleção de elementos únicos, ou seja, uma coleção que não permite armazenar elementos idênticos.

"Não sei se Ellie mostrou a você a hierarquia de herança de Set. Se não, aqui está:"

Implementações das interfaces Set e Queue - 1

"Um HashSet é uma coleção que armazena elementos internamente usando os valores de hash retornados pelo método hashCode ()."

"Para simplificar, HashSet<E> armazena um objeto HashMap<E, Object> que armazena os valores do HashSet como chaves."

"Uau!"

"O uso de códigos hash permite pesquisar, adicionar e remover rapidamente elementos do conjunto."

"Mas lembre-se de que sua classe deve implementar corretamente os métodos hashCode & equals para adicionar objetos de suas classes a um conjunto e encontrá-los corretamente lá."

"Ambos os métodos são muito usados ​​dentro do HashSet/HashMap. "

"Se você esquecer de implementar o método hashCode (), corre o risco de não conseguir encontrar seu objeto no Set, mesmo que ele esteja presente."

"Sim, eu me lembro, eu me lembro. Você me contou sobre isso antes. Eu ouvi tudo sobre isso."

"OK. Então aqui estão algumas informações mais úteis para você."

"Suponha que você tenha implementado hashCode e equals  corretamente em sua classe e armazene alegremente seus objetos em um Set."

"Mas então você muda um dos objetos e, ao fazer isso, altera os dados internos usados ​​para calcular seu hash . Portanto, o hash do objeto muda."

"E isso significa que, quando você procurar no Set, provavelmente não o encontrará."

"Uau! Como isso funciona?"

"Essa é uma armadilha bem conhecida ao trabalhar com hashes. Essencialmente, as pesquisas de HashSet (e HashMap) só têm garantia de funcionar corretamente se os objetos forem imutáveis ."

"Uau! E o que, ninguém faz nada sobre isso?"

"Todo mundo finge que o problema não existe. Mas isso aparece com frequência nas entrevistas, então vale a pena lembrar..."

"Um LinkedHashSet é um HashSet cujos elementos também são armazenados em uma lista vinculada. HashSets normais não suportam a ordenação dos elementos. Primeiro, simplesmente não é uma operação oficial. Segundo, até mesmo a ordem interna pode mudar significativamente quando um único elemento é adicionado."

Mas você pode obter um iterador de um LinkedHashSet e usá-lo para percorrer todos os elementos na ordem em que foram adicionados ao LinkedHashSet . Não acontece com frequência, mas às vezes é muito necessário."

"Entendo. Adoro quando existem aulas para esses cenários de 'apenas no caso'. Esses casos não são tão raros."

" TreeSet é uma coleção que armazena elementos na forma de uma árvore ordenada por valores. Um TreeSet <E> contém um TreeMap <E, Object> que armazena todos esses valores. E este TreeMap usa uma árvore balanceada vermelho -preto para armazenar elementos . Como resultado, ele suporta adicionar, remover e contém operações muito rápidas."

"Sim, eu me lembro. Discutimos isso recentemente. E também pensei sobre onde isso é usado."

"E acontece que algumas das coleções mais populares de Java o utilizam."

"Sim. A propósito, os entrevistadores costumam perguntar sobre o TreeSet . Eles geralmente estão tentando enganá-lo. Eles dirão: 'se um TreeSet usa uma árvore binária, todos os elementos podem formar uma ramificação longa, portanto, as pesquisas levarão um tempo muito tempo. «Este é apenas o momento de colocar o sujeito insolente em seu lugar, afirmando: "Até uma criança sabe que TreeSet e TreeMap usam árvores vermelho -preto balanceadas , de modo que essa situação é realmente impossível.»"

"Ah. Eu adoraria ver o rosto da pessoa que fez essa pergunta. Talvez até memorize essa frase...."

"Mas, na prática, Set acabou não sendo tão simples quanto eu pensava inicialmente."

"Por outro lado, a situação com Queue é muito mais simples:"

Implementações das interfaces Set e Queue - 2

" Queue implementa uma fila. Os elementos são adicionados ao final da fila e retirados da frente."

" PriorityQueue é, na verdade, a única implementação clássica da interface Queue , sem contar LinkedList , que tecnicamente também é uma fila."

"Ok, estou ficando cansado. Por hoje é só. Até a próxima."