[JavaSE] Explicación súper detallada de los arreglos [comprende los problemas de los arreglos al mismo tiempo]

Espero comunicarnos y aprender unos de otros a través del blog, si hay algún error, por favor corrígeme en el área de comentarios.

Una matriz es una colección de elementos de datos del mismo tipo, que se almacenan de forma contigua en la memoria (el significado es el mismo que en el lenguaje C, por lo que no lo repetiré aquí)

contenido

Primero, defina la matriz

1. Inicialización estática

2. Inicialización dinámica

3. Definición irregular de matriz bidimensional

¿Dónde están las matrices en la memoria de Java?

Aviso

En segundo lugar, la longitud de la matriz y la impresión de la matriz

Tercero, la matriz como parámetro del método.

pasar parámetros

¿Qué es una cita?

nulo

 En cuarto lugar, la clase de herramienta para matrices operativas (java.util.Arrays)

1. Arrays.toString();

2. Matrices.copyOf();

3. Arrays.copyOfRange();

4. Arrays.clon();


Primero, defina la matriz

1. Inicialización estática

数据类型[] 数组名称 = { 初始化数据 };
int[] arr = {1, 2, 3, 4, 5};
int[][] array = {
   
   {1,2,3},{4,5,6}};

Defina una matriz con 5 elementos en ella, cada tipo de elemento es int 

2. Inicialización dinámica

数据类型[] 数组名称 = new 数据类型 [] { 初始化数据 };

ej.1. 

int[] arr2 = new int[]{1, 2, 3, 4, 5};
int[][] array2 = new int[][]{
   
   {1,2,3},{4,5,6}};

ej.2.

int[] arr3 = new int[5];
int[][] array3 = new int[2][3];

En la inicialización dinámica, un objeto de matriz es instanciado por new, hay un total de 5 elementos en él, y cada tipo de elemento es int

El anterior arr, arr2, arr3 son los nombres de los arreglos, es decir, los nombres de las variables, y el lado derecho del signo igual es el objeto del arreglo.

Cuando la matriz se crea en eg2, no hay un valor inicial asignado, entonces es 0 (observe la diferencia con el lenguaje C)

3. Definición irregular de matriz bidimensional

int[][] array3 = new int[2][];

 Esto debe distinguirse del lenguaje C. En el lenguaje C, las filas de la matriz se pueden omitir, pero las columnas no se pueden omitir.

En Java, las filas de la matriz deben tener, las columnas se pueden omitir, pero las columnas no se pueden deducir automáticamente

Esta definición significa que la matriz tiene dos filas, varias columnas son indeterminadas y el número de columnas en cada fila en Java puede ser diferente , de la siguiente manera:

int[][] array3 = new int[2][];
array3[0] = new int[2];
array3[1] = new int[3];

¿Dónde están las matrices en la memoria de Java?

Deberíamos responder esta pregunta con rigor, el objeto de matriz está en el montón , pero las variables de matriz arr, arr2, arr3 están en la pila, lo que parece incómodo, pero es la verdad.

8 tipos básicos, que almacenan directamente los datos que queremos almacenar, en la pila, pero arr es un tipo de referencia, que almacena la dirección del objeto al que apunta

Ilustramos con la siguiente figura

p.ej. int[] arr = new int[]{1, 2, 3, 4, 5};

 podemos verificar

public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3, 4, 5};
    System.out.println(arr);
}

resultado de la operación:

Aviso

 Esta no es una dirección real en el montón, es procesada por Java

En segundo lugar, la longitud de la matriz y la impresión de la matriz

Java es un lenguaje orientado a objetos. Prestamos atención al objeto en sí. En Java, un atributo de una matriz es la longitud, que podemos usar directamente, de la siguiente manera:

public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3, 4, 5};
    int len = arr.length;
    System.out.println(len);
}

matriz de impresión

Forma 1:

public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3, 4, 5};
    for (int i = 0; i < arr.length; i++) {
        System.out.print(arr[i] + " ");
    }
}

 resultado de la operación:

 Imprime una matriz bidimensional:

public static void main(String[] args) {
    int[][] array = new int[][]{
   
   {1,2,3},{4,5,6}};
    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j]);
        }
        System.out.println();
    }
}

 

El diseño de la memoria de los arreglos bidimensionales es muy diferente al del lenguaje C, como se muestra en la siguiente figura:

Forma 2:

for (int e : arr) {
    System.out.print(e + " ");
}

 Hay un bucle for en el modo 2 :  el siguiente es el arreglo que se imprimirá, y el frente es el tipo de elemento del arreglo que se imprimirá

Matriz bidimensional:

public static void main(String[] args) {
    int[][] array = new int[][]{
   
   {1,2,3},{4,5,6}};
    for (int[] cur : array) {
        for (int val : cur) {
            System.out.print(val + " ");
        }
        System.out.println();
    }
}

 

 Manera 3:

También puede convertir la matriz en una cadena e imprimir la salida

import java.util.Arrays;
public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3, 4, 5};
    String str = Arrays.toString(arr);
    System.out.println(str);
}

 

 Matriz bidimensional:

public static void main(String[] args) {
    int[][] array = new int[][]{
   
   {1,2,3},{4,5,6}};
    System.out.println(Arrays.deepToString(array));
}

 

 

Tercero, la matriz como parámetro del método.

pasar parámetros

Cuando usamos una matriz para pasar parámetros, ¿qué debemos recibir?

La variable de matriz es en realidad una referencia. La pasamos en el pasado y tomamos directamente la variable de matriz para recibirla (evitando la sobrecarga de pasar toda la matriz en el pasado)

El siguiente código:

public static void print(int[] array) {
    for (int i : array) {
        System.out.print(i + " ");
    }
}
public static void main(String[] args) {
    int[] arr = new int[]{1, 2, 3, 4, 5};
    print(arr);
}

 Icono:

 Dos referencias apuntan al mismo bloque de memoria.

¿Qué es una cita?

Referencia es en realidad equivalente a un puntero en lenguaje C, que se utiliza para apuntar a una parte de la memoria.Podemos encontrar esta parte de la memoria o este objeto por referencia, y realizar una serie de operaciones en este objeto por referencia

Emoticonos: Resultados de imagen para objetos

 Como se muestra abajo:

Java establece la matriz como un tipo de referencia. En este caso, la transferencia de parámetros de matriz subsiguiente solo se pasa en la dirección de la matriz al parámetro de función, lo que puede evitar copiar toda la matriz (la matriz puede ser larga, por lo que la sobrecarga de copia será grande)

nulo

Cuando el puntero en lenguaje C no quiere apuntar a ninguna variable después de la creación, apuntará a NULL, que representa la dirección de 0x00000000

Entonces hay tal situación en Java, dejamos que el punto de referencia sea nulo, pero el nulo aquí no está en la dirección de 0x00000000, pero dejamos que la referencia no apunte a ningún objeto.

Emoji: resultado de imagen para objeto vacío

int[] arr = null;

es equivalente a una referencia inválida

Cuando operamos en esta referencia, ocurrirá una NullPointerException

public static void main(String[] args) {
    int[] arr = null;
    System.out.println(arr[0]);
}

 En cuarto lugar, la clase de herramienta para matrices operativas (java.util.Arrays)

Java proporciona muchos métodos para manipular arreglos, lo cual es muy conveniente cuando se escribe código.

Emoticonos: potentes resultados de imagen

 Al usarlo, importe el paquete java.util.Arrays

1. Arrays.toString();

Convierta los datos en la matriz en una cadena

 En IDEA, puede ver que Java ha sobrecargado el método toString para que pueda operar en diferentes tipos de arreglos.

prototipo de función

static String toString(int[] a)

 Devuelve una representación de cadena del contenido de la matriz especificada

Ejemplo de código :

import java.util.Arrays;
public class Demo2 {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        String str = Arrays.toString(arr);
        System.out.println(str);
    }
}

En este código, los datos en la matriz arr se convierten en una cadena mediante Arrays.toString(); (muy conveniente)

resultado de la operación:

 Implementación simulada :

public static String toString(int[] arr) {
    String str = "[";
    for (int i = 0; i < arr.length - 1; i++) {
        str = str + arr[i] + ",";
    }
    if (arr.length != 0) {
        str = str + arr[arr.length - 1];   // 对最后一个元素做特殊处理
    }
    str = str + "]";
    return str;
}

Otros tipos de matrices se pueden sobrecargar

2. Matrices.copyOf();

También puede usar System.arraycopy();

copiar matriz

Este método no solo realiza operaciones como arr = arr2, sino que crea un nuevo objeto y copia el valor del objeto original en el nuevo objeto. De esta manera, la modificación de la matriz original naturalmente no afectará el valor de la nueva matriz.

prototipo de función 

static int[] copyOf(int[] original, int newLength)

 Copia la matriz especificada, truncándola o rellenando con ceros (si es necesario) para que la copia tenga la longitud especificada.

Ejemplo de código:

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    int[] arr2 = Arrays.copyOf(arr, arr.length);
    System.out.println(Arrays.toString(arr2));
}

Complete una copia profunda de una matriz llamando a Arrays.copyOf();

 El segundo parámetro de este método también puede ser mayor o menor que la longitud original de la matriz.

Si el newLength entrante > arr.length, el resto se completará con 0

Si newLength < arr.length, copie desde el principio hasta la longitud especificada

p.ej.

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    int[] arr2 = Arrays.copyOf(arr, 8);
    System.out.println(Arrays.toString(arr2));
    int[] arr3 = Arrays.copyOf(arr, 3);
    System.out.println(Arrays.toString(arr3));
}

 Implementación de simulación

public static int[] copyOf(int[] arr, int newLength) {
    int[] array = new int[newLength];
    int minLength = arr.length < newLength ? arr.length : newLength;
    for (int i = 0; i < minLength; i++) {
        array[i] = arr[i];
    }
    return array;
}

Nota : el subíndice de la matriz no puede estar fuera de los límites y se deben tener en cuenta los tres casos.

3. Arrays.copyOfRange();

copiar un rango de una matriz

prototipo de función

static int[] copyOfRange(int[] original, int from, int to)

Copia el rango especificado de la matriz especificada en una nueva matriz

ejemplo de código

public static void main(String[] args) {
    int[] arr = {1,2,3,4,5};
    int[] arr2 = Arrays.copyOfRange(arr, 0, 5);
    System.out.println(Arrays.toString(arr2));
    int[] arr3 = Arrays.copyOfRange(arr, 2, 8);
    System.out.println(Arrays.toString(arr3));
    int[] arr4 = Arrays.copyOfRange(arr, 0, 0);
    System.out.println(Arrays.toString(arr4));
}

resultado de la operación:

 Nota: el rango en Java es básicamente un intervalo cerrado a la izquierda y abierto a la derecha

Implementación de simulación

public static int[] copyOfRange(int[] arr, int fromIndex, int toIndex) {
    int[] newArray = new int[toIndex - fromIndex];
    int toIndexMin = arr.length < toIndex ? arr.length : toIndex;
    for (int i = fromIndex; i < toIndexMin; i++) {
        newArray[i - fromIndex] = arr[i];
    }
    return newArray;
}

4. Arrays.clon();

hizo una copia del objeto (método de clonación del objeto)

Esta es una copia superficial.

¡Bienvenidos todos a prestar atención! ! !

¡Aprender a comunicarnos juntos! ! !

¡Vamos a programar hasta el final! ! !

-------------- No es fácil de organizar, apoye tres consecutivos -------------------

Supongo que te gusta

Origin blog.csdn.net/weixin_46531416/article/details/122261697
Recomendado
Clasificación