Colección de notas de estudio de colección de Java

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Colección de registros de aprendizaje en Java
Por qué reescribir el método toString
Array: Una vez que se determina la longitud de la matriz en Java, no se puede cambiar y los datos cuya cantidad cambiará no se pueden almacenar.
(2) Almacene el mismo tipo de datos

Colección: Puede almacenar una cantidad indeterminada de datos. Lo más atractivo es que una colección puede almacenar datos con una relación de mapeo. Solo los objetos
(variables de referencia de los objetos) pueden almacenarse en la colección . No es necesario definir la longitud, la colección aumentará o disminuirá dinámicamente la longitud.
Clase de colección, derivada principalmente de dos interfaces Collection y Map
java.util.Collection, java.util.Map

Colecciones: esta clase solo contiene métodos estáticos que operan en colecciones o devuelven colecciones. Contiene un algoritmo polimórfico que opera sobre una colección, un "envoltorio" (envoltorio), que devuelve una nueva colección respaldada por la colección especificada y otros bits y piezas.
Uno, interfaz de Colloction

(1) Establecer características de interfaz: los elementos están desordenados y los elementos no se pueden repetir (no hay ningún método que acepte un comparador como parámetro)
// Es mejor reescribir el método toString para una clase escrita por usted mismo
// Si lo desea para usar la colección Set, entonces ¿también necesita reescribir el método equals () y el método hashcode ()? ? ? (Todavía hay errores, no lo entiendo muy bien)
1. Clase HashSet (Si juzga si el objeto es el mismo objeto de acuerdo con el atributo para completar la instancia, necesita reescribir el método equals y el
método hashcode en el class
(1) Los elementos agregados están fuera de servicio
(2) HashSet No está sincronizado. Si varios subprocesos acceden a un HashSet al mismo tiempo, por ejemplo, al modificarlo, debe sincronizarse manualmente para garantizar la seguridad de los subprocesos.
(3) El valor del elemento puede ser nulo
(4) Al agregar un elemento a la colección HashSet De forma predeterminada, se llama al método hashCode () para obtener el valor del código hash del objeto, que se utiliza para determinar la ubicación del objeto en el HashSet.
(5) Si se comparan dos elementos, el método equals () devuelve verdadero, pero el valor devuelto por hashCode () no es el mismo, lo que indica que los dos elementos no son iguales
(6) Por lo tanto, el conjunto HashSet juzga si dos elementos son iguales, es decir, mediante el método equals () para comparar, y el valor hashCode también se compara.

2. La clase LinkedHashSet, que determina la ubicación de almacenamiento del elemento de acuerdo con el valor hashCode del elemento, pero también usa una lista vinculada para mantener el orden de los elementos.
Al acceder a él, se accederá a los elementos de la colección según el orden en que se añadan los elementos, con la ventaja de que el rendimiento durante el acceso será muy bueno.
Sin embargo, debido a la estructura de la cadena, el rendimiento es ligeramente peor que HashSet al insertar datos, y no se recomienda usarlo al insertar elementos.

En comparación con HashSet, la inserción es lenta y el acceso rápido

3 ... Clase TreeSet (compare la interfaz Comparable y anule el método abstracto. Ordena los datos en orden ascendente entero predeterminado. Consulte pet3 cuando se necesita una clasificación personalizada)
(1) El almacenamiento subyacente está relacionado con árboles rojo-negro y binarios árboles.
(2) La clasificación se puede realizar, porque TreeSet es una clase de implementación de la interfaz SortedSet.
(3) TreeSet puede garantizar que los elementos estén ordenados, por lo que TreeSet utiliza una estructura de datos de números rojos y negros para almacenar elementos del conjunto.
(4) Las reglas de clasificación son: clasificación natural y clasificación personalizada (la clasificación natural es la predeterminada orden ascendente).
Anónimo interno La clase implementa o implementa directamente la interfaz Comparable para toda la clase

import java.util.Comparator;
import java.util.TreeSet;
public class Pet3 {
    
    
    int age;
    public Pet3(int age) {
    
    
        this.age = age;
    }
    @Override
    public String toString() {
    
    
        return "Pet2{" +
                "age=" + age +
                '}';
    }
    public static void main(String[] args) {
    
    
        TreeSet<Pet3> treeSet = new TreeSet<Pet3>(new Comparator<Pet3>() {
    
    
            //匿名内部类
            @Override
            public int compare(Pet3 o1, Pet3 o2) {
    
    
                //现在是降序
                return o1.age-o2.age;
            }
        });
        treeSet.add(new Pet3(18));
        treeSet.add(new Pet3(87));
        treeSet.add(new Pet3(3));
        treeSet.add(new Pet3(3));
        System.out.println(treeSet);
    }
}

```java
import java.util.Comparator;

public class Pet implements Comparable<Pet> {
    
    
    String name;
    String color;
    int age;
    public Pet(String name, String color, int age) {
    
    
        this.name = name;
        this.color = color;
        this.age = age;
    }
    @Override
    public String toString() {
    
    
        return "Pet{" +
                "name='" + name + '\'' +
                ", color='" + color + '\'' +
                ", age=" + age +
                '}';
    }
    @Override
    public int compareTo(Pet o) {
    
    
        return this.age-o.age;
    }
    /**
    @Override
    public int compareTo(Pet2 o) {
        //现在是降序
        if (this.age > o.age) return -1;
        if (this.age < o.age) return +1;
        return 0;
    }
    */
}

(5) TreeSet llamará al método compareTO (Object obj) para comparar la relación de tamaño entre los elementos y ordenarlos en orden ascendente.
(6) La interfaz Comparable proporciona principalmente estándares para comparar tamaños. Algunas clases comunes que se encontrarán en el futuro:
BigDecimal, BigInteger
(6) Cuando TreeSet añade elementos, el método compareTo será llamado para comparar el tamaño y encontrar la posición de acuerdo con el árbol rojo-negro Si las esquinas de la tabla son iguales a través del método compareTo (),.
que no se puede agregar.

4. La
clase EnumSet no tiene un constructor. (1) Los elementos de la clase EnumSet deben ser valores de enumeración del tipo de enumeración especificado. EnumSet determina el orden específico de los elementos del conjunto en el orden de la definición del valor de enumeración
(2 ) EnumSet utiliza principalmente Se almacena en forma de vector de bits, que es muy compacto, eficiente, pequeño en memoria y muy eficiente en operación, por lo que la velocidad de ejecución es muy rápida, especialmente adecuado para
operaciones por lotes
(3) EnumSet no puede agregue nulo; de lo contrario, informará una excepción de puntero nulo
(4) Enumet necesita usar métodos de clase para crear instancias de objetos
(5) El valor de enumeración especificado se almacena en la colección de enumeración.

import java.util.EnumSet;
enum Day {
    
    
    ONE,TWO,THREE,FOUR,FIVE
}
public class EnumSetDemo {
    
    
    public static void main(String[] args) {
    
    
        EnumSet<Day> allof = EnumSet.allOf(Day.class);
        System.out.println(allof);

        EnumSet es2 = EnumSet.noneOf(Day.class);
        System.out.println(es2);

        es2.add(Day.THREE);

        System.out.println(es2);

        //以指定的枚举值创建EnumSet集合
        EnumSet<Day> es3 = EnumSet.of(Day.ONE,Day.THREE);
        System.out.println(es3);

        EnumSet<Day> es4 = EnumSet.range(Day.ONE,Day.THREE);
        System.out.println(es4);

        //es5的集合元素+es4集合元素 = Day枚举类型的全部枚举值
        //排除es4中已有的数据
        EnumSet<Day> es5 = EnumSet.complementOf(es4);
        System.out.println(es5);
    }
}

(2) Interfaz de cola
1. PriorityQueue PriorityBlockingQueue (Priority Queue)
PriorityQueue no es seguro para subprocesos, por lo que Java proporciona PriorityBlockingQueue (implementación de la interfaz BlockingQueue) para el entorno de subprocesos múltiples de Java.

2. Interfaz Deque y clase de implementación ArrayDeque
(1) ArrayDeque es una implementación específica de la interfaz Deque, que depende de la matriz de variables a lograr. ArrayDeque no tiene limitación de capacidad y se puede
expandir automáticamente según la demanda . ArrayDeque no admite elementos cuyo valor sea nulo.
La clase LinkedList implementa la interfaz Deque y la interfaz List

(3) Características de la interfaz de lista: los elementos almacenados se pueden almacenar repetidamente. Los elementos se ordenan
// Uso de interfaz de Iterador y ListIterator y la diferencia entre los dos
: 1 ... La interfaz de iterador es más general, incluyendo Set y Map., ListIterator solo se puede utilizar para List
2. El iterador es unidireccional, de
uso

public class ListDemo {
    
    
    public static void main(String[] args) {
    
    
        List l1 = new ArrayList();
        l1.add("ddd");
        l1.add(1);
        l1.add(1);
        l1.add(1);
        l1.add(1,"张三");
        System.out.println(l1);
        l1.set(2,"还");
        //遍历 for循环 foreach迭代器
        System.out.println(l1.indexOf("张三"));
        System.out.println("***************");
        for (int i = 0;i < l1.size();i++){
    
    
            System.out.println(l1.get(i));
        }
        System.out.println("***************");
        for (Object o1:l1){
    
    
            System.out.println(o1);
        }
        //迭代器
        Iterator iterator = l1.iterator();
        while (iterator.hasNext())
        {
    
    
            System.out.println(iterator.next());
        }
        System.out.println("***************");
        //列表迭代器
        //正序
        ListIterator listIterator = l1.listIterator();
        while (listIterator.hasNext())
        {
    
    
            System.out.println(listIterator.next());
        }
        //倒序----------------------------------------------------
        ListIterator li2 = l1.listIterator();
        while (li2.hasPrevious())
        {
    
    
            System.out.println(li2.previous());
        }
    }
}在这里插入代码片

public Iterator iterator () {return ListIterator ();} // Este es el método de iterador implementado en la clase ArraysList
// La diferencia entre
Comparator y Comparable La diferencia entre Comparator y Comparable se reproduce en dos de Qingfeng de 82 años
Colecciones class Método
public static <T extiende Comparable <? Super T >> void sort (List list) { list.sort (null); } // Cualquier clase que implemente la interfaz Comparable puede usar este método

public static void sort (List list, Comparator <? super T> c) { list.sort ©; } // Necesita pasar un comparador

// Los métodos comunes
agregan (índice int, elemento E) a la posición especificada
agregar (E e) agregan el elemento especificado al final de esta lista
addAll (índice int, Colección <? Extiende E> c) especificará todo en el colección Inserta el elemento en la posición especificada en esta lista (operación opcional).
addAll (Colección <? extiende E> c) Agrega todos los elementos de la colección especificada al final de esta lista en el orden en que los devuelve el iterador de la colección especificada (operación opcional).
clear () Elimina todos los elementos de esta lista (operación opcional).
contiene (Objeto o) devuelve verdadero si esta lista contiene el elemento especificado.
containsAll (Colección <?> c) ​​devuelve verdadero si esta lista contiene todos los elementos de la colección especificada.
get (int index) Devuelve el elemento en la posición especificada en esta lista
// Clases de implementación de uso común relacionadas
1. ArrayList La colección de arreglos subyacente es rápida de recorrer y la velocidad de acceso a los elementos es rápida y asincrónica (inseguridad de subprocesos): Si varios subprocesos acceden y modifican la colección ArrayList,
debe asegurarse manualmente la sincronización de la colección.
2. Características vectoriales: ordenadas y repetibles porque la colección de matrices se recorre rápidamente y el acceso aleatorio a los elementos también es rápido de insertar y eliminar
3. Clases de implementación ArrayList y Vector
Todas son clases List basadas en implementaciones de matrices. Encapsula una matriz Object [] dinámica que permite la redistribución. Se utiliza principalmente para el parámetro initialCapacity para establecer la longitud de la matriz.
Cuando se agregan demasiados elementos, la initialCapacity crecerá automáticamente y la longitud predeterminada es 10

En ocasiones, es necesario prestar atención a los problemas de rendimiento. Si agrega una gran cantidad de elementos a estas dos colecciones, puede usar el método sureCapacity (minCapacity) para aumentar la initialCapacity a la vez.
Esto puede reducir la cantidad de asignaciones y mejorar el rendimiento .

También pueden usar los métodos secureCapacity (minCapacity) y trimToSize () para reasignar la matriz Object []

Vector es una colección relativamente antigua, predecesora de ArrayList, tiene muchas deficiencias y no se recomienda.

ArrayList no es seguro para subprocesos. Si varios subprocesos acceden y modifican la colección ArrayList, debe asegurarse manualmente la sincronización de la colección

Vector es seguro para subprocesos, por lo que el rendimiento será ligeramente más bajo que ArrayList, incluso si es seguro para subprocesos, no se recomienda. Más tarde, podemos usar la
clase de utilidad Colecciones para hablar de que ArrayList se vuelve seguro para subprocesos.

4.
El método asList (Object ... a) de la clase List Arrays con la misma longitud puede convertir una matriz o un número específico de objetos en una colección List, que no es una ArrayList.
Una instancia de la clase de implementación no es una instancia de la clase de implementación Vector, sino una instancia de la clase interna ArrayList of Arrays. (Puede ver
el código fuente de la clase Arrays ).
Arrays.ArraysList es una colección List de longitud fija, que solo puede acceder a elementos y no puede agregar o eliminar elementos en la colección.

5.LinkedList

Supongo que te gusta

Origin blog.csdn.net/weixin_45773632/article/details/109441146
Recomendado
Clasificación