"Bueno, ¿cómo está tu procesador?"

"Está bien. Me senté en nitrógeno líquido durante una hora, ¡así que ahora estoy como nuevo!"

"Genial. Entonces continuemos."

"Establecer colecciones".

Matemáticamente hablando, un conjunto es un grupo de elementos únicos. Así, en programación, un Conjunto es una colección de elementos únicos, es decir, una colección que no permite almacenar elementos idénticos.

"No sé si Ellie te mostró la jerarquía de herencia de Set. Si no, aquí está:"

Implementaciones de las interfaces Set y Queue - 1

"Un HashSet es una colección que almacena elementos internamente utilizando los valores hash devueltos por el método hashCode ()".

"Para simplificar, HashSet<E> almacena un objeto HashMap<E, Object> que almacena los valores de HashSet como claves".

"¡Vaya!"

"El uso de códigos hash le permite buscar, agregar y eliminar rápidamente elementos del conjunto".

"Pero tenga en cuenta que su clase debe implementar correctamente los métodos hashCode & equals para agregar objetos de sus clases a un Conjunto y encontrarlos correctamente allí".

"Ambos métodos se usan mucho dentro de HashSet/HashMap " .

"Si olvida implementar el método hashCode (), corre el riesgo de no poder encontrar su objeto en el Conjunto, incluso si está presente".

"Sí, lo recuerdo, lo recuerdo. Me hablaste de esto antes. Lo he oído todo".

"Está bien. Entonces aquí hay más información útil para ti".

"Supongamos que ha implementado correctamente hashCode y equals  en su clase, y felizmente almacena sus objetos en un Conjunto".

"Pero luego vas y cambias uno de los objetos, y al hacerlo cambias los datos internos utilizados para calcular su hash . Entonces, el hash del objeto cambia".

"Y esto significa que cuando lo busques en el Set, probablemente no lo encuentres".

"¡Vaya! ¿Cómo funciona eso?"

"Este es un escollo bien conocido cuando se trabaja con hashes. Esencialmente, las búsquedas de HashSet (y HashMap) solo están garantizadas para funcionar correctamente si los objetos son inmutables ".

"¡Vaya! ¿Y qué, nadie hace nada al respecto?"

"Todo el mundo finge que el problema no existe. Pero esto surge con frecuencia en las entrevistas, por lo que vale la pena recordarlo..."

"Un LinkedHashSet es un HashSet cuyos elementos también se almacenan en una lista enlazada. Los HashSets normales no admiten el orden de los elementos. Primero, simplemente no es una operación oficial. Segundo, incluso el orden interno puede cambiar significativamente cuando un solo se añade el elemento".

Pero puede obtener un iterador de un LinkedHashSet y usarlo para revisar todos los elementos en el orden en que se agregaron al LinkedHashSet . No sucede a menudo, pero a veces esto es muy necesario".

"Ya veo. Me encanta cuando existen clases para estos escenarios de "por si acaso". Tales casos no son tan raros".

" TreeSet es una colección que almacena elementos en forma de árbol ordenados por valores. Un TreeSet <E> contiene un TreeMap <E, Object> que almacena todos estos valores. Y este TreeMap usa un árbol equilibrado rojo - negro para almacenar elementos Como resultado, admite operaciones muy rápidas de agregar, eliminar y contener ".

"Sí, lo recuerdo. Hablamos de eso recientemente. Y también pensé en dónde se usa esto".

"Y resulta que algunas de las colecciones más populares de Java lo usan".

"Sí. Por cierto, los entrevistadores a menudo preguntan sobre TreeSet . Por lo general, intentan engañarte. Dirán: 'si un TreeSet usa un árbol binario, entonces todos los elementos pueden formar una rama larga, por lo que las búsquedas tomarán un mucho tiempo. «Este es el momento justo para poner al tipo insolente en su lugar al afirmar: "Incluso un niño sabe que TreeSet y TreeMap usan árboles equilibrados en rojo y negro , por lo que esa situación es realmente imposible".

"Ah. Me encantaría ver la cara de la persona que hizo esa pregunta. Incluso podría memorizar esa frase..."

"Pero en la práctica, Set resultó no ser tan simple como pensé inicialmente".

"Por otro lado, la situación con Queue es mucho más simple:"

Implementaciones de las interfaces Set y Queue - 2

" Queue implementa una cola. Los elementos se agregan al final de la cola y se toman del frente".

" PriorityQueue es en realidad la única implementación clásica de la interfaz Queue , sin contar LinkedList , que técnicamente también es una cola".

"Está bien, me estoy cansando. Eso es todo por hoy. Hasta la próxima".