Cómo entender la colección de conjuntos en Java: racionalización

Introducción

En el contenido anterior, primero introdujimos los tipos de colecciones en la colección Collection uno por uno, y explicamos el conocimiento relevante en la colección List en detalle, luego hoy explicaremos en detalle otra rama en la colección Collection - —Set series collection . Finalmente, espero que estos artículos puedan ser de ayuda para tu aprendizaje en colecciones y Java, bueno, vayamos directo al tema sin más preámbulos.

concepto

Establecer características de colección de series:

  •  Fuera de servicio: orden de acceso inconsistente
  • Sin duplicados: los duplicados se pueden eliminar
  • Sin índice: no hay ningún método con un índice, por lo que no puede usar un bucle for normal para atravesar, y no puede obtener elementos por índice

Establecer características de clase de implementación de colección:

HashSet: desordenado, no repetitivo, sin índice

LinkedHashSet: ordenado, no repetitivo, sin índice

TreeSet: ordenado, único, sin índice

La funcionalidad de la colección Set es básicamente la misma que la API de colección.

 colección HashSet

Colección HashSet:

Set<String> set = new HashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

 Resultado de salida:

 A través del código anterior y los resultados de la ejecución, podemos ver claramente que la colección HashSet está desordenada y no es repetitiva;

En combinación con las imágenes anteriores, se puede ver que la colección HashSet no puede obtener datos a través del índice del método get(), y al eliminar los datos de la colección, los datos solo se pueden eliminar por dirección. 

 Colección LinkedHashSet:

Colección LinkedHashSet:

Set<String> set = new LinkedHashSet<>();
        set.add("石原里美");
        set.add("石原里美");
        set.add("工藤静香");
        set.add("朱茵");
        System.out.println(set);
        set.remove("朱茵");
        System.out.println(set);

Resultado de salida:

Al comparar el código anterior con los resultados de salida, puede ver la diferencia entre desorden y orden. El primero interrumpirá el orden de los datos entrantes, mientras que el segundo aún almacenará los datos en el orden de los datos de entrada, por lo que la salida se encuentra en un estado ordenado. 

Colección TreeSet: 

Colección TreeSet:

Set<Integer> set = new TreeSet<>();
        set.add(13);
        set.add(23);
        set.add(23);
        set.add(11);
        System.out.println(set);
        set.remove(23);
        System.out.println(set);

 Resultado de salida:

 A través del código anterior y los resultados de salida, podemos entender literalmente por qué TreeSet se caracteriza por la clasificación, es decir, los datos almacenados se clasifican de acuerdo con el método de clasificación predeterminado de Java.

Sin embargo, si almacena un objeto personalizado como Personas en este momento, el TreeSet no se puede ordenar directamente y se producirá un error.

//People类:
public class People{
    private String name;
    private int age;
    private String classroom;

    public People(){

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

    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;
    }

    public String getClassroom() {
        return classroom;
    }

    public void setClassroom(String classroom) {
        this.classroom = classroom;
    }

    @Override
    public String toString() {
        return "People{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", classroom='" + classroom + '\'' +
                '}';
    }
}
//main方法:
public static void main(String[] args) {
        Set<People> p = new TreeSet<>();
        p.add(new People("张三",19,"智能"));
        p.add(new People("李四",18,"数据库"));
        p.add(new People("王五",20,"渗透"));
        System.out.println(p);
    }

Para resolver este problema, necesitamos personalizar el tipo de almacenamiento para la colección TreeSet. Hay dos formas de resolver este problema: una es implementar la interfaz Comparable y reescribir el método compareTo en la clase personalizada para especificar las reglas; la otra es to Es el objeto comparador propio de la colección para la definición de reglas.

Método 1: la clase personalizada implementa la interfaz Comparable y reescribe el método compareTo en ella para especificar las reglas de comparación (el código redundante e irrelevante no se repetirá aquí, solo se mostrará la parte importante del código)

//改变的第一个地方:实现Comparable类
public class People implements Comparable<People> {
//改变的第二个地方:重写Comparable类中的compareTo方法    
    @Override
    public int compareTo(People o) {
        return this.age-o.age;
    }
}

La salida (en comparación con la edad): 

En el método anulado, el código después de la devolución determina con qué criterio se comparará el objeto. Las reglas de comparación son las siguientes:

  • Si se considera que el primer elemento es mayor que el segundo, devuelve un entero positivo
  • Si se considera que el primer elemento es menor que el segundo, devuelve un entero negativo
  • Si cree que el primer elemento es igual al segundo elemento, puede devolver 0. En este momento, la colección Treeset solo conservará un elemento y los dos se considerarán repetidos.

Método 2: la colección tiene su propio objeto comparador para la definición de reglas

Set<People> p = new TreeSet<>(new Comparator<People>() {
            @Override
            public int compare(People o1, People o2) {
                return o1.getAge()-o2.getAge();
            }
        });

La creación del conjunto se cambia sobre la base original, y el criterio de comparación es similar al método de definición anterior.En comparación con el método anterior, este método será más conveniente y rápido. Aquí, también podemos revisar algunos de los conocimientos sobre "expresiones lambda" aprendidas anteriormente para simplificar el bloque de código.

Set<People> p = new TreeSet<>((o1, o2) -> o1.getAge()-o2.getAge());

Si no ha aprendido las expresiones lambda, o su conocimiento de las expresiones lambda no es claro, puede leer cómo entender las expresiones lambda en Java; simplificar la explicación de este artículo puede ayudarlo.

escena de combate real 

  • Los elementos se pueden repetir, hay índices y la velocidad de consulta del índice es rápida

Use la colección ArrayList, basada en la matriz

  •  Los elementos se pueden repetir, tener índices y agregar y eliminar operaciones de inicio y fin rápidamente

Usar la colección LinkedList, basada en la lista vinculada

  • Agrega, elimina, busca y corrige más rápido, pero los elementos no se duplican, desordenan ni indexan

Use la colección HashSet, basada en la tabla hash

  • Agrega, elimina, busca y corrige más rápido, pero los elementos no se repiten, ordenan ni indexan

Use la colección LinkedHashSet, basada en la tabla hash y la lista de doble enlace

  • Los objetos necesitan ser ordenados

El uso de la colección TreeSet, basada en el árbol rojo-negro, también se puede implementar utilizando la colección List más adelante.

No es fácil de crear, dale tres consecutivos 

Supongo que te gusta

Origin blog.csdn.net/weixin_50635856/article/details/124806587
Recomendado
Clasificación