Conceptos básicos de JAVA: colección de conjuntos

Capítulo 4 Establecer interfaz

java.util.SetAl igual que la interfaz java.util.List, la interfaz también hereda de la Collectioninterfaz. CollectionEs básicamente el mismo que el método de la interfaz. No Collectionamplía la función de la interfaz, pero Collectiones más estricta que la interfaz. ListA diferencia de la interfaz, los Setelementos de la interfaz están desordenados y se utilizan algunas reglas para garantizar que los elementos almacenados no aparezcan duplicados.

SetLas colecciones tienen múltiples subclases, y aquí presentamos estas java.util.HashSetdos java.util.LinkedHashSetcolecciones.

Sugerencias: La forma de extraer elementos de la colección Set puede ser: iterador, mejorado para.

4.1 Introducción a la colección HashSet

java.util.HashSetEs Setuna clase de implementación de la interfaz, y los elementos que almacena no son repetibles , y todos los elementos están desordenados (es decir, el orden de acceso es inconsistente). java.util.HashSetLa implementación subyacente es en realidad un java.util.HashMapsoporte, ya que aún no lo hemos aprendido, entendámoslo primero.

HashSetSe basa en el valor hash del objeto para determinar la ubicación de almacenamiento del elemento en la colección, por lo que tiene un buen rendimiento de acceso y búsqueda. La forma de garantizar la unicidad de los elementos depende del método : hashCodey equals.

Primero usemos el almacenamiento de la colección Set, veamos el fenómeno y luego expliquemos el principio:

public class HashSetDemo {
    
    
    public static void main(String[] args) {
    
    
        //创建 Set集合
        HashSet<String>  set = new HashSet<String>();

        //添加元素
        set.add(new String("cba"));
        set.add("abc");
        set.add("bac"); 
        set.add("cba");  
        //遍历
        for (String name : set) {
    
    
            System.out.println(name);
        }
    }
}

El resultado es el siguiente, lo que indica que los elementos duplicados no se pueden almacenar en la colección:

cba
abc
bac

Sugerencias: según los resultados, encontramos que solo se almacena una cadena "cba", es decir, la colección de conjuntos de elementos repetidos no se almacena.

2.2 La estructura de la colección HashSet que almacena datos (tabla hash)

¿Qué es una tabla hash?

Antes de JDK1.8 , la capa inferior de la tabla hash se implementaba mediante una matriz + lista enlazada, es decir, se usaba una lista enlazada para manejar conflictos y las listas enlazadas con el mismo valor hash se almacenaban en una lista enlazada. Sin embargo, cuando hay muchos elementos en un depósito, es decir, hay muchos elementos con el mismo valor hash, la eficiencia de la búsqueda secuencial por valor clave es baja. En JDK1.8, el almacenamiento de tablas hash se implementa mediante matriz + lista vinculada + árbol rojo-negro. Cuando la longitud de la lista vinculada supera el umbral (8), la lista vinculada se convierte en un árbol rojo-negro, lo que reduce en gran medida el tiempo de búsqueda.

En pocas palabras, la tabla hash se implementa mediante una matriz + lista vinculada + árbol rojo-negro (JDK1.8 agregó la parte del árbol rojo-negro).

En general, JDK1.8 introdujo el árbol rojo-negro para optimizar en gran medida el rendimiento de HashMap, por lo que, para nosotros, la singularidad de los elementos de la colección HashSet se determina de acuerdo con el método hashCode y equals del objeto. Si almacenamos un objeto personalizado en la colección, para garantizar su singularidad, debemos anular los métodos hashCode y equals para establecer un método de comparación que pertenezca al objeto actual.

2.3 HashSet almacena elementos de tipo personalizado

Al almacenar elementos de tipo personalizado en HashSet, debe volver a escribir los métodos hashCode y equals en el objeto y establecer su propio método de comparación para asegurarse de que los objetos en la colección HashSet sean únicos.

Crear una clase de estudiante personalizada

public class Student {
    
    
    private String name;
    private int age;

    public Student() {
    
    
    }

    public Student(String name, int age) {
    
    
        this.name = name;
        this.age = age;
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
    
    
        if (this == o)
            return true;
        if (o == null || getClass() != o.getClass())
            return false;
        Student student = (Student) o;
        return age == student.age &&
               Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(name, age);
    }
}
public class HashSetDemo2 {
    
    
    public static void main(String[] args) {
    
    
        //创建集合对象   该集合中存储 Student类型对象
        HashSet<Student> stuSet = new HashSet<Student>();
        //存储 
        Student stu = new Student("于谦", 43);
        stuSet.add(stu);
        stuSet.add(new Student("郭德纲", 44));
        stuSet.add(new Student("于谦", 43));
        stuSet.add(new Student("郭麒麟", 23));
        stuSet.add(stu);

        for (Student stu2 : stuSet) {
    
    
            System.out.println(stu2);
        }
    }
}
执行结果:
Student [name=郭德纲, age=44]
Student [name=于谦, age=43]
Student [name=郭麒麟, age=23]

2.3 Conjunto de hash vinculado

Sabemos que HashSet garantiza que los elementos son únicos, pero los elementos se almacenan sin orden, por lo que debemos garantizar el orden, ¿qué debemos hacer?

Hay una subclase bajo HashSet java.util.LinkedHashSet, que es una estructura de almacenamiento de datos combinada con una lista vinculada y una tabla hash.

El código de demostración es el siguiente:

public class LinkedHashSetDemo {
    
    
	public static void main(String[] args) {
    
    
		Set<String> set = new LinkedHashSet<String>();
		set.add("bbb");
		set.add("aaa");
		set.add("abc");
		set.add("bbc");
        Iterator<String> it = set.iterator();
		while (it.hasNext()) {
    
    
			System.out.println(it.next());
		}
	}
}
结果:
  bbb
  aaa
  abc
  bbc

Supongo que te gusta

Origin blog.csdn.net/qq_44660367/article/details/108107179
Recomendado
Clasificación