LinkedHashSet explicación detallada

¡Trabajar juntos para crear y crecer juntos! Este es el día 30 de mi participación en el "Nuggets Daily New Plan·August Update Challenge", haz clic para ver los detalles del evento

Visión general

No sé si usa mucho el contenedor LInkedHashSet en su trabajo diario. De todos modos, básicamente no lo he usado. Por lo tanto, este artículo explica principalmente sus características, escenarios de uso y principios de implementación, con la esperanza de ayudarlo en su trabajo habitual ayuda.

Introducción a LinkedHashSet

LinkedHashSet es una lista ordenada de conjuntos de deduplicación implementados en función de LinkedHashMap.

  • Los elementos en LinkedHashSet no están duplicados
  • Los elementos en LinkedHashSet están ordenados, manteniendo el orden de adición
  • LInkedHashSet puede almacenar valores nulos
  • LinkedHashSet es un contenedor no seguro para subprocesos

Lo anterior es el diagrama de estructura de clases de LinkedHashSet:

  • HashSet heredado, por lo que mantiene la función de agregar orden de elementos en base a HashSet

Método de construcción

  • LinkedHashSet()

Descripción: crea una lista de contenedores vacíos con una capacidad inicial predeterminada de 16 y un factor de carga de 0,75

  • LinkedHashSet(int initialCapacity, float factor de carga)

Descripción: crea un contenedor especificando una capacidad inicial y un factor de carga

método clave

  • agregar booleano público (E e)

Descripción: Agregar un elemento a una colección

  • eliminación booleana pública (Objeto o)

Descripción: Eliminar un elemento de una colección

  • vacío público claro ()

Descripción: Elementos de colección vacíos

  • tamaño int público ()

Descripción: Devuelve el número de elementos de la colección.

Casos de uso

  1. Verificar la secuencialidad de LinkedHashSet
@Test
    public void test1() {
        Set<Integer> set = new LinkedHashSet<>();
        set.add(5);
        set.add(4);
        set.add(5);
        set.add(3);
        set.add(1);
        set.add(9);
        //正顺序遍历
        System.out.print("遍历:");
        set.forEach(item -> {
            System.out.print(item + "  ");
        });
    }
复制代码

resultado de la operación:

  1. Verifique que LinkedHashSet almacene un valor nulo
 @Test
    public void test2() {
        Set<Integer> set = new LinkedHashSet<>();
        set.add(null);
        set.add(5);
        System.out.println(set);
    }
复制代码

resultado de la operación:

mecanismo central

El mecanismo subyacente de realización de órdenes

La capa inferior de LinkedHashSet es un LinkedHashMap, y la capa inferior mantiene una matriz + una lista doblemente vinculada. Determina la ubicación de almacenamiento del elemento en función del valor hashCode del elemento y utiliza una lista vinculada para mantener el orden de los elementos, lo que hace que los elementos parezcan estar almacenados en orden de inserción.

Análisis de código fuente

Este artículo analiza principalmente el punto de vista del código fuente de que LinkedhashSet realmente depende de LinkedHashMap, y la lógica específica aún debe prestar atención a la implementación de LinkedHashMap.

public class LinkedHashSet<E>
    extends HashSet<E>
    implements Set<E>, Cloneable, java.io.Serializable {

    
    public LinkedHashSet(int initialCapacity, float loadFactor) {
        super(initialCapacity, loadFactor, true);
    }

    
    public LinkedHashSet(int initialCapacity) {
        super(initialCapacity, .75f, true);
    }


    public LinkedHashSet() {
        super(16, .75f, true);
    }

    
    public LinkedHashSet(Collection<? extends E> c) {
        super(Math.max(2*c.size(), 11), .75f, true);
        addAll(c);
    }
}
复制代码
  • LinkedHashSet hereda de HashSet, su código fuente es muy pequeño, solo hay unos pocos constructores, básicamente llamando al constructor de la clase principal HashSet.
  • Mire el constructor de la clase principal, es un constructor no público que crea un LinkedHashMap, por lo que depende de la implementación de LinkedHashMap.

Resumir

LinkedHashSet es principalmente adecuado para escenarios que requieren que se lea el orden de los elementos, como FIFO.

En cuanto al rendimiento, no se preocupe demasiado, el rendimiento de inserción de LinkedHashSet es ligeramente inferior al de HashSet, pero tiene un buen rendimiento cuando accede iterativamente a todos los elementos del conjunto.

Supongo que te gusta

Origin juejin.im/post/7136555701563818021
Recomendado
Clasificación