Colección de conjuntos detallada: colección de conjuntos

Configurar interfaz

La interfaz de conjunto es una subinterfaz de Colección y la interfaz de conjunto no proporciona métodos adicionales

No se permite que la colección Set contenga los mismos elementos. Si intentas agregar dos elementos iguales a la misma colección Set, la operación de adición fallará.

Establecer jueces si dos objetos son iguales en lugar de usar el operador ==, pero de acuerdo con el método equals ()

Una de las clases de implementación de la interfaz Set: HashSet

HashSet es una implementación típica de la interfaz Set, y esta clase de implementación se usa la mayor parte del tiempo cuando se usa la colección Set.

HashSet almacena los elementos en el conjunto de acuerdo con el algoritmo Hash, por lo que tiene un buen rendimiento de acceso, búsqueda y eliminación.

HashSet tiene las siguientes características:

  • Trastorno: no es igual a la aleatoriedad. Los datos almacenados no se agregan en el orden del índice de la matriz en la matriz subyacente, sino que se determinan de acuerdo con el valor hash de los datos.
  • No repetibilidad: se garantiza que cuando el elemento agregado se juzga de acuerdo con equals (), no puede devolver verdadero, es decir, solo se puede agregar uno del mismo elemento.
  • Los elementos de la colección pueden ser nulos

HashSet establece los criterios para juzgar la igualdad de dos elementos: dos objetos se comparan para que sean iguales mediante el método hashCode () y los valores de retorno del método equals () de los dos objetos también son iguales.

Para los objetos almacenados en el contenedor Set, la clase correspondiente debe anular los métodos equals () y hashCode (Object obj) para implementar la regla de igualdad de objetos. Es decir: "Los objetos iguales deben tener códigos hash iguales".

向HashSet中添加元素的过程:
    向HashSet中添加元素a,首先调用元素a所在类的hashCode()方法,计算元素a的哈希值,此哈希值接着通过某种算法计算出在		HashSet底层数组中的存放位置(即为:索引位置),判断数组此位置上是否已经有元素:
        如果此位置上没有其他元素,则元素a添加成功。 --->情况1
        如果此位置上其他有元素(或以链表形式存在的多个元素),则比较元素a与元素b的hash值:
            如果hash值不相同,则元素a添加成功。--->情况2
            如果hash值相同,进而需要调用元素a所在的类的equals()方法:
                equals()返回true,元素a添加失败
                equals()返回false,则元素a添加成功。--->情况2
	对于添加成功的情况2和情况3而言:元素a 与已经存在指定索引位置上数据以链表的方式存储。
    其中jdk7和jdk8中添加的位置还有所不同
    	jdk7:头插法
    	jdk8:尾插法

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-OUEcKkCz-1614868232498) (assets / image-20210212132446570.png)]

El principio básico de reescritura del método hashCode ()

  • Cuando el programa se está ejecutando, varias llamadas al método hashCode () en el mismo objeto deben devolver el mismo valor.
  • Cuando el método equals () de dos objetos se compara y devuelve verdadero, el valor de retorno del método hashCode () de los dos objetos también debe ser igual.
  • Los campos usados ​​para la comparación en el método equals () del objeto deben usarse para calcular el valor hashCode.

Principios básicos de anular el método equals ()

  • Cuando una clase tiene su propio concepto único de "igualdad lógica", al reescribir equals (), siempre reescribe hashCode (). De acuerdo con el método equals de una clase (después de reescribir), dos instancias completamente diferentes pueden estar en lógica. iguales, pero, según el método Object.hashCode (), son solo dos objetos.
  • Por lo tanto, viola "los objetos iguales deben tener códigos hash iguales".
  • Conclusión: al copiar el método equals, generalmente es necesario copiar el método hashCode al mismo tiempo. Por lo general, los atributos de los objetos involucrados en el cálculo de hashCode también deben participar en el cálculo en iguales ().

Establecer la categoría de implementación dos: LinkedHashSet

  • LinkedHashSet es una subclase de HashSet

  • LinkedHashSet determina la ubicación de almacenamiento del elemento de acuerdo con el valor hashCode del elemento, pero también usa una lista doblemente vinculada para mantener el orden de los elementos, lo que hace que los elementos parezcan almacenados en el orden de inserción.

  • El rendimiento de inserción de LinkedHashSet es ligeramente inferior al de HashSet, pero
    tiene un buen rendimiento cuando se accede de forma iterativa a todos los elementos del conjunto .

  • LinkedHashSet no permite elementos de colección duplicados.

[Error en la transferencia de la imagen del enlace externo. El sitio de origen puede tener un mecanismo de enlace anti-sanguijuela. Se recomienda guardar la imagen y subirla directamente (img-HwpTgeO9-1614868232504) (assets / image-20210212133058338.png)]

Establecer la categoría de implementación tres: TreeSet

TreeSet es una clase de implementación de la interfaz SortedSet y TreeSet puede garantizar que los elementos de la colección estén ordenados.

La capa inferior de TreeSet utiliza una estructura de árbol rojo-negro para almacenar datos. Características: ordenada, la velocidad de consulta es más rápida que la lista.

El nuevo método es el siguiente:

  • Comparador comparador ()
  • Objeto primero ()
  • Objeto último ()
  • Objeto inferior (Objeto e)
  • Objeto más alto (Objeto e)
  • SortedSet subSet (fromElement, toElement)
  • SortedSet headSet (toElement)
  • SortedSet tailSet (fromElement)

TreeSet tiene dos métodos de clasificación: clasificación natural y clasificación personalizada. De forma predeterminada, TreeSet utiliza la clasificación natural.

Clasificación: comparable

TreeSet llamará al método compareTo (Object obj) de los elementos de la colección para comparar la relación de tamaño entre los elementos, y luego organizará los elementos de la colección en orden ascendente (predeterminado)

Si intenta agregar un objeto al TreeSet, la clase del objeto debe implementar la interfaz Comparable.

  • La clase que implementa Comparable debe implementar el método compareTo (Object obj), y los dos objetos se comparan en tamaño por el valor de retorno del método compareTo (Object obj).

Una implementación típica de Comparable:

  • BigDecimal, BigInteger y todas las clases de empaquetado correspondientes al tipo numérico:
    compárelas según sus valores numéricos correspondientes
  • Carácter: compare según el valor Unicode del carácter
  • Booleano: la instancia de la clase contenedora correspondiente a true es mayor que la instancia de la clase contenedora correspondiente a false
  • Cadena: compare de acuerdo con el valor Unicode de los caracteres en la cadena
  • Fecha, hora: la hora y la fecha posteriores son mayores que la hora y la fecha anteriores

Al agregar elementos al TreeSet, solo el primer elemento no necesita ser comparado con el método compareTo (), y todos los elementos agregados más tarde llamarán al método compareTo () para la comparación.

Debido a que solo se compararán en tamaño dos instancias de la misma clase, los objetos de la misma clase deben agregarse al TreeSet.

Para la colección TreeSet, el único criterio para juzgar si dos objetos son iguales es: los dos objetos comparan el valor de retorno mediante el método compareTo (Object obj).

Cuando necesite poner un objeto en el TreeSet y reescribir el método equals () correspondiente al objeto, debe asegurarse de que el método y el método compareTo (Object obj) tengan resultados consistentes: si dos objetos se comparan a través de equals () método, devuelve verdadero, entonces la comparación a través del método compareTo (Object obj) debería devolver 0.

Clasificación: comparador

El orden natural de TreeSet requiere que la clase a la que pertenece el elemento implemente la interfaz Comparable. Si la clase a la que pertenece el elemento no implementa la interfaz Comparable, o si no desea organizar los elementos en orden ascendente (predeterminado) o desea ordenarlos según el tamaño de otros atributos, considere la posibilidad de utilizar una ordenación personalizada. La clasificación personalizada se implementa a través de la interfaz Comparator. Necesita reescribir el método de comparación (T o1, T o2).

Utilice el método int compare (T o1, T o2) para comparar los tamaños de o1 y o2: si el método devuelve un entero positivo, significa que o1 es mayor que o2; si devuelve 0, significa igual; devuelve un número negativo entero, lo que significa que o1 es menor que o2.

Para implementar la ordenación personalizada, una instancia que implemente la interfaz Comparator debe pasarse al constructor TreeSet como parámetro formal.

En este punto, todavía puede agregar objetos del mismo tipo al TreeSet. De lo contrario, se produce una excepción ClassCastException.

El criterio para juzgar la igualdad de dos elementos mediante la ordenación personalizada es: El comparador compara dos elementos y devuelve 0.

Supongo que te gusta

Origin blog.csdn.net/qq_44346427/article/details/110729387
Recomendado
Clasificación