Marco de colección de Java: lista, conjunto, mapa

 1. Descripción general del marco de recopilación de Java:

1.1 Árbol de herencia de la interfaz de colección

 La API de recopilación proporcionada por el JDK se encuentra en el paquete java.util.

 Árbol de herencia de la interfaz del mapa

 1.2 Métodos de interfaz de colección

Interfaz de colección

La interfaz Colección es la interfaz principal de las interfaces Lista, Conjunto y Cola. Los métodos definidos en esta interfaz se pueden utilizar para operar tanto la colección Conjunto como las colecciones Lista y Cola.

JDK no proporciona ninguna implementación directa de esta interfaz, pero proporciona una implementación de subinterfaz más específica (como: Set y List).

Antes de Java5, las colecciones de Java perderían los tipos de datos de todos los objetos en el contenedor y tratarían todos los objetos como tipos de objetos. Después de agregar genéricos en JDK 5.0, las colecciones de Java pueden recordar los tipos de datos de los objetos en el contenedor.

Métodos de interfaz de colección

1.3 Interfaz iteradora

        Utilice la interfaz Iterator para recorrer elementos de la colección

        El objeto Iterador se denomina iterador (un tipo de patrón de diseño) y se utiliza principalmente para recorrer los elementos de una Colección.

        GOF define el patrón iterador como: proporcionar un método para acceder a cada elemento en un objeto contenedor sin exponer los detalles internos del objeto. El patrón iterador nace para contenedores. Similar a "revisor de autobús", "revisor de tren", "azafata".

        La interfaz Collection hereda la interfaz java.lang.Iterable, que tiene un método iterator(). Luego, todas las clases de colección que implementan la interfaz Collection tienen un método iterator() para devolver un objeto que implementa la interfaz Iterator.

        Iterator solo se usa para atravesar colecciones, y el Iterator en sí no proporciona la capacidad de contener objetos. Si necesita crear un objeto Iterador, debe tener una colección sobre la que iterar.

        Cada vez que se llama al método iterador () en un objeto de colección, se obtiene un nuevo objeto iterador y el cursor predeterminado está antes del primer elemento de la colección.

        Métodos de interfaz Iterator

 

 Se debe llamar a It.hasNext() para su detección antes de llamar al método it.next(). Si no es llamado, y

El siguiente registro no es válido. Llamarlo directamente a it.next() generará una excepción NoSuchElementException.

        Método remove() de la interfaz iteradora

Iterador iter = coll.iterator();//Regresar al punto de partida

mientras ( iter .hasNext()){

        Objeto obj = iter.next();

        si ( obj.equals ( "Tom" )){

        iter.remove();

        }

}

Aviso:

        El iterador puede eliminar elementos de una colección, pero a través del método de eliminación del objeto iterador durante el proceso transversal, no a través del método de eliminación del objeto de colección.

        Si no se ha llamado a next() o se ha llamado al método remove después de la última llamada al método siguiente, se informará una IllegalStateException al llamar a remove nuevamente.

         Utilice el bucle foreach para iterar sobre los elementos de la colección

Java 5.0 proporciona un bucle foreach para acceder iterativamente a colecciones y matrices.

La operación transversal no requiere obtener la longitud de la colección o matriz, y no es necesario utilizar un índice para acceder a los elementos.

La capa subyacente de atravesar la colección llama a Iterator para completar la operación.

foreach también se puede utilizar para iterar sobre una matriz.

 2. Una de las subinterfaces de la Colección : interfaz de lista

2.1  Descripción general de la interfaz de lista

En vista de las limitaciones de las matrices en Java para almacenar datos, generalmente usamos Lista en lugar de matrices.

Los elementos de la clase de colección List están ordenados y repetibles.Cada elemento de la colección tiene su índice secuencial correspondiente.

Cada elemento en el contenedor Lista corresponde a un número de serie entero que registra su posición en el contenedor. Se puede acceder a los elementos en el contenedor según el número de serie.

Las clases de implementación más utilizadas de la interfaz List en la API JDK son: ArrayList, LinkedList y Vector.

2.2 Método de interfaz de lista

2.3 Una de las clases de implementación de List: ArrayList

ArrayList es la clase de implementación típica y la clase de implementación principal de la interfaz List.

Esencialmente, una ArrayList es una matriz de referencias de objetos de "longitud variable".

¿Cuál es la diferencia entre la implementación de ArrayList antes y después de JDK1.8 ?

        JDK1.7: ArrayList es como un chino hambriento, que crea directamente una matriz con una capacidad inicial de 10.

        JDK1.8: ArrayList es como un hombre perezoso: crea una matriz con una longitud de 0 al principio y luego crea una matriz con una capacidad inicial de 10 cuando se agrega el primer elemento.

La colección List devuelta por el método Arrays.asList(…) no es una instancia de ArrayList ni una instancia de Vector.

El valor de retorno de Arrays.asList(…) es una Lista de longitud fija.

ArrayList es una matriz dinámica.

Ventajas: la estructura de datos subyacente es una matriz, que es rápida de consultar y lenta de agregar y eliminar.

Desventajas: Hilo inseguro, alta eficiencia.
 

2.3.1 Constructor ArrayList

2.3.2 Método ArrayList

public class Test01 {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("a");
        System.out.println(list);
        System.out.println(list.get(1));
        System.out.println("list集合遍历:");
        /*
        for (int i = 0;i< list.size();i++){
            String s = list.get(i);
            System.out.println(s);
        }
         */
        //增强for循环
        for (String s :list){
            System.out.println(s);
        }

    }
}

 Se escribe sobre ArrayList en otro blog, por lo que no lo describiré aquí. 

2.4 Clase de implementación de lista dos: LinkedList

Para operaciones frecuentes de inserción o eliminación de elementos, se recomienda utilizar la clase LinkedList, que es más eficiente.

LinkedList es una estructura de almacenamiento basada en una lista vinculada.

LinkedList: Lista doblemente enlazada , no se declara ninguna matriz internamente, pero se definen el primero y el último del tipo de Nodo, que se utilizan para registrar el primer y último elemento. Al mismo tiempo, defina la clase interna Nodo como la estructura básica para almacenar datos en LinkedList. Además de guardar datos, Node también define dos variables:

        La variable prev registra la posición del elemento anterior.

        La siguiente variable registra la posición del siguiente elemento.

Ventajas: la estructura de datos subyacente es una lista vinculada, lo que hace que las consultas sean lentas y las operaciones de agregar y eliminar sean rápidas.

Desventajas: hilo inseguro, alta eficiencia

2.4.1 Constructor de lista enlazada

2.4.2 Método de lista vinculada

 2.5 Clase de implementación de lista tres: Vector

Vector es una colección antigua que existía en JDK1.0. La mayoría de las operaciones son las mismas que para ArrayList, excepto que Vector es seguro para subprocesos.

Entre varias listas, es mejor utilizar ArrayList como opción predeterminada. Cuando las inserciones y eliminaciones sean frecuentes, utilice LinkedList; Vector siempre es más lento que ArrayList, así que trate de evitar su uso.

Ventajas: la estructura de datos subyacente es una matriz, que es rápida de consultar y lenta de agregar y eliminar.

Desventajas: seguridad del hilo, baja eficiencia.

2.5.1 Campo vectorial

 2.5.2 Método de construcción de vectores

 2.5.3 Método vectorial

 

Similitudes y diferencias entre ArrayList y LinkedList

Ambos no son seguros para subprocesos y Vector relativamente seguro para subprocesos tiene una alta eficiencia de ejecución.

Además, ArrayList implementa una estructura de datos basada en matrices dinámicas y LinkedList implementa una estructura de datos basada en listas vinculadas. Para obtener y configurar acceso aleatorio, ArrayList es mejor que LinkedList porque LinkedList necesita mover el puntero. Para agregar y eliminar, agregar (específicamente insertar) y eliminar, LinkedList tiene la ventaja porque ArrayList necesita mover datos.

3. Una de las subinterfaces de la Colección : Establecer interfaz

La interfaz Set es una subinterfaz de Collection y no proporciona métodos adicionales.

No se permite que las colecciones de conjuntos contengan los mismos elementos. Si intenta agregar dos elementos idénticos a la misma colección de conjuntos, la operación de suma fallará.

Set determina si dos objetos son iguales en lugar de usar el operador ==, pero se basa en el método igual ().

3.1  Una de las clases de implementación de Set : HashSet

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

HashSet almacena 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:

        El orden de los elementos no está garantizado.

        HashSet no es seguro para subprocesos

        Los elementos de la colección pueden ser nulos.

El estándar para juzgar la igualdad de dos elementos en una colección HashSet : los dos objetos se comparan 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 contenedores Set, las clases correspondientes deben anular los métodos equals() y hashCode(Object  obj) para implementar reglas de igualdad de objetos. Es decir: "Los objetos iguales deben tener códigos hash iguales".

El proceso de agregar elementos a HashSet:

        Al almacenar un elemento en la colección HashSet, HashSet llamará al método hashCode() del objeto para obtener el valor hashCode del objeto y luego usará una determinada función hash para determinar la ubicación de almacenamiento del objeto en la matriz subyacente de el HashSet basado en el valor hashCode. (Esta función hash se calculará con la longitud de la matriz subyacente para obtener el subíndice en la matriz, y este cálculo de la función hash también garantizará que los elementos se puedan almacenar de manera tan uniforme como sea posible. Cuanto mayor sea la distribución hash, mejor la función hash está diseñada (bueno).

        Si los valores hashCode() de los dos elementos son iguales, se seguirá llamando al método igual. Si el resultado del método igual es verdadero, la suma falla; si es falso, el elemento se guardará, pero no Ya hay un elemento en la posición de la matriz, luego continúa el enlace a través de una lista enlazada.

Si el método equals () de dos elementos devuelve verdadero, pero sus valores de retorno hashCode () no son iguales, hashSet los almacenará en diferentes ubicaciones, pero aún se pueden agregar correctamente.

Principios básicos para anular el método hashCode()

        Mientras el programa se está ejecutando, llamar al método hashCode() varias veces en el mismo objeto debería devolver el mismo valor.

        Cuando la comparación del método igual () de dos objetos devuelve verdadero, los valores de retorno del método hashCode () de los dos objetos también deben ser iguales.

        Los campos de los objetos utilizados para la comparación mediante el método equals() deben usarse para calcular los valores de hashCode.

3.1.1 Método de construcción HashSet

 3.1.2 Método HashSet

public class Test01 {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("x");
        set.add("y");
        set.add("z");
        set.add("x");
        System.out.println(set);
        System.out.println("set集合的遍历:");
        //set集合用迭代器来遍历
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String s = iterator.next();
            System.out.println(s);
        }

    }
}

 3.2  Establecer clase de implementación dos: LinkedHashSet

LinkedHashSet es una subclase de HashSet.

LinkedHashSet determina la ubicación de almacenamiento de los elementos en función de sus valores de hashCode, pero también utiliza una lista doblemente vinculada para mantener el orden de los elementos, lo que hace que los elementos parezcan guardados en orden de inserción.

El rendimiento de inserción de LinkedHashSet es ligeramente inferior al de HashSet, pero tiene un buen rendimiento al acceder iterativamente a todos los elementos del conjunto.

LinkedHashSet no permite elementos de conjunto duplicados.

3.2.1 Método de construcción LinkedHashSet

3.3  Establecer clase de implementación tres: TreeSet

TreeSet es la 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.

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

4. Una de las subinterfaces de la Colección : interfaz de mapa

  Descripción general de la interfaz del mapa

El mapa y la colección existen uno al lado del otro. Se utiliza para guardar datos con relaciones de mapeo : clave-valor.

Tanto la clave como el valor en Map pueden ser datos de cualquier tipo de referencia.

Las claves en el Mapa se almacenan en Set y no se permite la duplicación , es decir, la clase correspondiente al mismo objeto Map debe anular los métodos hashCode () y equals ().

La clase String se usa comúnmente como la "clave" de Map.

Existe una relación unidireccional uno a uno entre la clave y el valor, es decir, el valor único y cierto siempre se puede encontrar a través de la clave especificada.

Clases de implementación comunes de la interfaz Map: HashMap, TreeMap, LinkedHashMap y Properties. Entre ellos, HashMap es la clase de implementación más utilizada de la interfaz Map.

 4.1 Interfaz de mapa: métodos comunes

 4.2  Una de las clases de implementación de Map : HashMap

HashMap es la clase de implementación más utilizada de la interfaz Map.

Se permiten claves nulas y valores nulos y, al igual que HashSet, el orden del mapeo no está garantizado.

El conjunto compuesto por todas las claves es Conjunto: desordenado y no repetible. Por lo tanto, es necesario reescribir la clase donde se encuentra la clave: igual a () y hashCode ().

La colección de todos los valores es una Colección: desordenada y repetible. Por lo tanto, es necesario reescribir la clase donde se encuentra el valor: igual a ().

Un valor-clave constituye una entrada.

El conjunto compuesto por todas las entradas es Conjunto: desordenado y no repetible.

El estándar para que HashMap juzgue que dos claves son iguales es: las dos claves devuelven verdadero a través del método igual () y los valores de hashCode también son iguales.

El estándar para que HashMap juzgue que dos valores son iguales es: los dos valores devuelven verdadero a través del método igual ().

4.2.1 Método de construcción HashMap

 4.2.2 Método HashMap

public class Test01 {
    public static void main(String[] args) {
        //创建一个map key为string类型 数据是object类型
        Map<String,Object> map = new HashMap<>();
        //添加数据,通过key
        map.put("name","张三");
        map.put("age",20);
        map.put("sex","男");
        System.out.println("Map集合的遍历:");
        //通过keyset获取map中所有key值并把它们保存在set集合
        Set<String> ks = map.keySet();
        //迭代器
        Iterator<String> i = ks.iterator();
        //用hasNext查找key
        while (i.hasNext()){
            //获取key值
            String key = i.next();
            Object value = map.get(key);
            System.out.println(key+"--->"+value);
        }
    }
}

4.3  Clase de implementación de mapas dos: HashMap vinculado

LinkedHashMap es una subclase de HashMap.

Basado en la estructura de almacenamiento de HashMap, se utilizan un par de listas doblemente vinculadas para registrar el orden en que se agregan los elementos.

De manera similar a LinkedHashSet, LinkedHashMap puede mantener el orden de iteración del mapa: el orden de iteración es coherente con el orden de inserción de los pares clave-valor.

4.3.1 Método de construcción LinkedHashMap

 4.3.2 Método LinkedHashMap

4.4  Clase de implementación de mapas tres: TreeMap

Cuando TreeMap almacena pares clave-valor, debe ordenarse según pares clave-valor.

        TreeMap puede garantizar que todos los pares clave-valor estén en un estado ordenado .

La capa inferior de TreeSet utiliza una estructura de árbol rojo-negro para almacenar datos.

Clasificación de la clave de TreeMap:

        Clasificación natural : todas las claves en TreeMap deben implementar la interfaz Comparable y todas las claves deben ser objetos de la misma clase; de ​​lo contrario, se generará ClasssCastException.

        Clasificación personalizada : al crear un TreeMap, pase un objeto Comparador, que es responsable de ordenar todas las claves en el TreeMap. En este momento, no es necesario que Map's Key implemente la interfaz Comparable.

Criterio de TreeMap para juzgar la igualdad de dos claves : las dos claves devuelven 0 mediante el método compareTo () o el método compare ().

4.4.1 Método de construcción TreeMap

 4.4.2 Método TreeMap

4.5  Clase de implementación de mapa cuatro: Hashtable

Hashtable es una clase de implementación de mapas antigua, proporcionada por JDK1.0. A diferencia de HashMap, Hashtable es seguro para subprocesos.

El principio de implementación de Hashtable es el mismo que el de HashMap y las funciones son las mismas. La capa inferior utiliza una estructura de tabla hash, la velocidad de consulta es rápida y puede interoperarse en muchos casos.

A diferencia de HashMap, Hashtable no permite valores nulos como clave y valor.

Al igual que HashMap, Hashtable no garantiza el orden de los pares clave-valor.

Los criterios de Hashtable para juzgar que dos claves son iguales y dos valores son iguales y son consistentes con HashMap.

4.5.1 Método de construcción de tabla hash

4.5.2 Método de tabla hash

 4.6  Clase de implementación de mapa cuatro: Propiedades

La clase Propiedades es una subclase de Hashtable, un objeto utilizado para procesar archivos de propiedades.

Dado que las claves y los valores en el archivo de propiedades son ambos tipos de cadenas, las claves y los valores en Propiedades son ambos tipos de cadenas.

Al acceder a los datos, se recomienda utilizar el método setProperty (clave de cadena, valor de cadena) y el método getProperty (clave de cadena).

 4.6.1 Método de construcción de propiedades

4.6.2 Método de propiedades

5. Clase de herramienta de colecciones

Colecciones es una clase de herramienta para operar colecciones como Set, List y Map.

Colecciones proporciona una serie de métodos estáticos para ordenar, consultar y modificar elementos de la colección. También proporciona métodos para establecer la inmutabilidad de los objetos de la colección e implementar el control de sincronización en los objetos de la colección.

Operación de clasificación : (todos los métodos estáticos )

        inversa (Lista): invierte el orden de los elementos en la Lista

        shuffle (Lista): ordena aleatoriamente los elementos de la colección Lista

        ordenar (Lista): ordena los elementos de la colección de Lista especificados en orden ascendente de acuerdo con el orden natural de los elementos.

        ordenar (Lista, Comparador): ordena los elementos de la colección de Lista de acuerdo con el orden producido por el Comparador especificado

        swap(List, int, int): intercambia el elemento en i y el elemento en j en la colección de listas especificada

Métodos comunes  de colecciones : control de sincronización

La clase Colecciones proporciona múltiples métodos sincronizadosXxx(), que pueden encapsular la colección especificada en una colección sincronizada con subprocesos, resolviendo así el problema de seguridad de subprocesos cuando varios subprocesos acceden a la colección al mismo tiempo.

 

 5.1 Método de cobranza

Supongo que te gusta

Origin blog.csdn.net/weixin_67224308/article/details/128121166
Recomendado
Clasificación