1. Por consideraciones de rendimiento, se prefieren las matrices
Las matrices se utilizan cada vez con menos frecuencia en el desarrollo de proyectos, especialmente en el desarrollo orientado a negocios. En primer lugar, las matrices no tienen muchos métodos proporcionados por colecciones como List y Set. Debe escribir los algoritmos de búsqueda y suma usted mismo. Sin embargo, es extremadamente engorroso y problemático, dado que las colecciones como List y Set usan soporte genérico, todas se almacenan en clases contenedoras y las matrices pueden usar tipos de datos básicos. La velocidad de ejecución de los tipos de datos básicos es mucho más rápida que la de los tipos contenedor. y la capa inferior de la clase de colección También se implementa mediante matrices.
2. Si es necesario, utilice matrices de longitud variable.
Al aprender clases de colección, a muchas personas les gusta comparar la longitud fija de la matriz con la longitud variable del tipo de colección, pero de hecho esta comparación no es apropiada. Al observar la implementación de clases de colección como ArrayList, podemos ver que. la llamada La colección se vuelve más larga, de hecho, simplemente expande la matriz original con tacto.
Copie el código de código de la siguiente manera:
público estático T[] expandCapacity(T[] datos, int nuevaLongitud) {
// Determinar si es un valor negativo
nuevaLongitud = nuevaLongitud < 0 ?
// Genera una nueva matriz, copia el valor original y especifica la longitud
return Arrays.copyOf(datos, nuevaLongitud);
}
Cuando los requisitos de rendimiento son altos, puede considerar encapsular matrices. La longitud constante de la matriz no es una excusa para no usarlas.
3. Tenga cuidado con las copias superficiales de matrices
La copia superficial de una matriz también es la base de la programación Java. La copia superficial significa que al copiar una matriz, el tipo básico copia el valor, mientras que el tipo de referencia copia la dirección de referencia. En el ejemplo anterior, la matriz se copia usando Arrays.copyOf. Es una copia superficial, por lo que debes prestar atención al usarla.
4. En escenarios claros, especifique la capacidad inicial de recolección.
En nuestro uso diario, debido a que el tipo de colección cambia automáticamente en longitud, el valor inicial no se adjuntará a la clase de colección al crear un objeto. Tomemos como ejemplo nuestro ArrayList más utilizado. Primero debemos saber cuándo se crea la colección. se alcanza la capacidad En el punto crítico, la matriz subyacente será La operación copyOf genera una nueva matriz, y la capacidad de la nueva matriz es 1,5 veces mayor que la de la matriz anterior, y la longitud predeterminada de la matriz es 10. Cuando sabemos claramente que la cantidad de datos que se colocarán en el contenedor es grande, debemos especificar el valor inicial para evitar una sobrecarga excesiva de rendimiento causada por el uso de copyOf veces
5. Elija el algoritmo óptimo apropiado
Buscar el valor máximo o mínimo de los datos es el conocimiento más básico de la estructura de datos. También tenemos muchas formas de implementarlo en Java. Aquí hay dos algoritmos.
Copie el código de código de la siguiente manera:
público estático int getMaxByArray(int[] datos) {
//El método de búsqueda autoimplementado más simple
int máx = datos[0];
for (int i = 1, tamaño = datos.longitud; i < tamaño; i++) {
máximo = máximo < yo ? yo : máximo;
}
retorno máximo;
}
Copie el código de código de la siguiente manera:
público estático int getMaxByArray(int[] datos) {
// Ordenar primero y luego obtener el último bit
Arrays.sort(datos);
datos de retorno [datos.longitud - 1];
}
6. ¡Trampa de conversión de matriz de tipo básico!
Por favor observe el siguiente código
Copie el código de código de la siguiente manera:
público estático vacío principal (String [] argumentos) {
int[] números = nuevo int[] { 1, 2, 3, 4, 5 };
Lista lista = Arrays.asList(nums);
System.out.println(lista.tamaño());
//El tamaño de salida en este momento es 1
}
El resultado que esperábamos era convertir los elementos de la matriz en una clase de colección a través de Arrays.asList, pero contrariamente a lo esperado, solo agregamos la matriz en sí y no separamos los valores en la matriz. si la colección Agregar genéricos a la Lista generará un mensaje de error durante la compilación, o cambiar la matriz a Integer puede resolver el problema.
7. El objeto Lista generado por el método asList no se puede cambiar.
A través del ejemplo anterior, podemos ver que el uso del método Arrays.asList puede convertir una matriz en una Lista. Entonces, ¿qué tiene de especial la Lista devuelta por el método asList? Tenga en cuenta que la Lista devuelta no admite cambios porque ¿El método asList devuelve? no java.util.ArrayList, sino Array Una clase interna privada estática en la clase de herramienta s, aunque tiene la misma clase principal AbstractList que ArrayList, pero al anular add y otros métodos, se lanza una excepción UnsupportedOperationException. Esta clase interna privada estática solo implementa size, toArray, Get y contiene estos. metodos
8. Utilice diferentes métodos transversales para diferentes estructuras de datos.
Por favor mire el siguiente código
Copie el código de código de la siguiente manera:
público estático vacío principal (String [] argumentos) {
// El siguiente es el método transversal de la colección ArrayList
número int = 80 * 10000;
Lista arrayList = nueva ArrayList(num);
for (int i = 0, tamaño = arrayList.size(); i < tamaño; i++) {
arrayList.get(i);
}
// El siguiente es el método transversal de la colección LinkedList
Lista ListaEnlazada = nueva ListaEnlazada();
para (entero entero: lista vinculada) {
}
}
¿Por qué elegir diferentes métodos transversales para LinkedList y ArrayList?
1. Debido a que ArrayList implementa la interfaz RamdomAccess (interfaz de acceso aleatorio), la interfaz RamdomAccess es la misma interfaz de marcado en Java que las interfaces serializables y clonables, lo que significa que se puede acceder a esta clase de forma aleatoria. Para ArrayList, significa que hay entre datos. sin correlación, es decir, dos posiciones adyacentes no tienen relación de interdependencia y se puede acceder a ellas de forma aleatoria.
2. La sintaxis foreach en Java es una variante del uso de iterador (iterador). Sabemos que el iterador es uno de los 23 patrones de diseño, pero el iterador necesita conocer la relación de tiempo entre dos elementos; de lo contrario, ¿cómo proporcionar soporte hasNext? Es porque el elemento anterior necesita determinar si existe el siguiente elemento, y esta relación se establece a la fuerza, lo que viola las características especiales del acceso aleatorio ArrayList.
3. En LinkedList, debido a que se almacena en forma de una lista doblemente vinculada, el soporte para iteradores es muy bueno. Debido a que existe una relación inherente entre dos elementos adyacentes en LinkedList, se deben adoptar diferentes métodos de recorrido para LinkedList y ArrayList. Los lectores interesados pueden intentar acceder a LinkedList en forma de subíndices y descubrirán que existe una gran brecha en la eficiencia entre los dos.
8. Elija ArrayList o LinkedList cuando corresponda
Las principales diferencias entre ArrayList y LinkedList:
1. La estructura de datos subyacente de ArrayList es una matriz, mientras que la estructura subyacente de LinkedList es una lista doblemente vinculada.
2. Al insertar datos, dado que ArrayList necesita mover los elementos de la matriz hacia atrás después de cada inserción, LinkedList solo necesita cambiar el nodo principal y el nodo final para completar la operación de inserción, por lo que cuando las operaciones de inserción son más frecuentes, se prefiere LinkedList.
3. Al eliminar datos, debido a que ArrayList necesita mantener el orden de la matriz, los elementos también deben desplazarse hacia atrás o hacia adelante después de la eliminación, mientras que LinkedList aún cambia los nodos de cabeza y cola.
4. Al actualizar, dado que LinkedList utilizará un método de medio recorrido para encontrar el elemento posicionado y luego actualizarlo, en comparación con el reemplazo directo de elementos de subíndice posicionados por parte de ArrayList, ArrayList es más eficiente en la actualización.
5.LinkedList puede simular una cola mediante operaciones como addFirst y addLast de LinkedList.
9. Cuando las listas son iguales, solo debes preocuparte por los datos del elemento.
Para que podamos programar interfaces como List, Set y Map con tranquilidad, Java ha anulado equlas en la clase de colección, de modo que al comparar si dos colecciones son iguales, solo necesitamos comparar si los datos del elemento son iguales. Esto evita que se corrija el código Java erróneo causado al reemplazar la clase de implementación de la colección.
Copie el código de código de la siguiente manera:
público estático vacío principal (String [] argumentos) {
Lista arrayList = nueva ArrayList();
arrayList.add(1);
arrayList.add(2);
Lista ListaEnlazada = nueva ListaEnlazada();
lista vinculada.add(1);
lista enlazada.add(2);
System.out.println(arrayList.equals(linkedList));
// No nos importa la implementación específica, el resultado es verdadero
}