Maison  >  Article  >  Java  >  Java comprend la copie de tableau via le code source sous-jacent

Java comprend la copie de tableau via le code source sous-jacent

WBOY
WBOYavant
2022-07-22 16:42:591784parcourir

Cet article vous apporte des connaissances pertinentes sur java Il présente principalement l'analyse détaillée de la compréhension de la copie de tableau à travers le code original sous-jacent, y compris la copie en boucle du tableau, la méthode Arrays.copyOf, la méthode Arrays.copyofRange, etc. au contenu ci-dessous, j’espère que cela sera utile à tout le monde.

Java comprend la copie de tableau via le code source sous-jacent

Étude recommandée : "Tutoriel vidéo Java"

Boucle pour copier un tableau

Utiliser une boucle pour copier un tableau est très simple, c'est-à-dire utiliser une boucle pour attribuer les éléments du tableau à copiés dans un nouveau tableau un par un. L'implémentation spécifique du code est la suivante :

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

C'est la méthode à laquelle nous pensons généralement. Voici quelques méthodes plus pratiques fournies par JAVA pour nous.

Méthode Arrays.copyOf

Parce que je copie un tableau d'entiers, j'utilise donc la méthode Arrays.copyOf pour copier un tableau d'entiers. Des tableaux d'autres types peuvent également être copiés, pas seulement des tableaux d'entiers.

Ce qui suit explique la méthode Arrays.copyOf en copiant un tableau d'entiers. Jetons d'abord un coup d'œil au code original sous-jacent de la méthode Arrays.copyOf :

public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

Nous pouvons voir que la valeur de retour de la méthode Array.copyOf est. un tableau d'entiers et le paramètre formel a deux paramètres, l'un est un tableau d'entiers et l'autre est une variable entière.

Le tableau entier dans le paramètre formel est le nom du tableau que nous voulons copier

La variable entière dans le paramètre formel est la longueur du tableau que nous voulons copier

Parce qu'il y a une valeur de retour, nous utilisons la méthode Arrays.copyOf À ce stade, un tableau est requis pour recevoir la valeur de retour. Le code est implémenté comme suit :

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

Remarque : La longueur de la copie peut dépasser la longueur du tableau à copier. Si elle dépasse la longueur du tableau à copier, la valeur de l'élément supplémentaire sera 0 ; par exemple : je veux copier le tableau arr, mais la taille du tableau arr est de 5. Si je modifie arr.length*2 lors de la copie, alors la taille du tableau copié deviendra 10 et la valeur de 6~10 les éléments seront 0. Ceci est également considéré comme une expansion.

Méthode Arrays.copyofRange

Si nous voulons copier une partie d'un tableau, nous pouvons utiliser la méthode Arrays.copyRange. Comme ci-dessus, nous utilisons également la copie d'un tableau d'entiers pour expliquer. Jetons d'abord un coup d'œil à son code original sous-jacent :

public static int[] copyOfRange(int[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        int[] copy = new int[newLength];
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

Nous pouvons voir à partir du code original de Arrays.copyRange que la valeur de retour est un tableau d'entiers, et le paramètre formel est un tableau d'entiers, deux variables entières.

Le tableau d'entiers dans le paramètre formel est le nom du tableau à copier.

Les deux variables entières de et vers dans le paramètre formel sont la plage des éléments du tableau que vous souhaitez copier. [formulaire, to). La gauche est fermée et la droite est ouverte, à l'exclusion de l'élément à cette position. Le code est implémenté comme suit :

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = Arrays.copyOfRange(arr,1,3);
    }

Remarque : l'indice du tableau commence à 0 et les éléments de 1 à 3 font référence à 2, 3 et 4. Cependant, le côté droit est un intervalle ouvert, donc 4 n'est pas inclus , donc la connaissance du tableau est copiée Les deux éléments 2 et 3.

Méthode System.arraycopy

Parlons ensuite de la méthode System.arraycopy. En fait, des étudiants attentifs ont découvert qu'il existe une méthode System.arraycopy dans le code original des deux premières méthodes, et que leur couche inférieure repose également sur. Méthode System.arraycopy à réaliser. Jetons d'abord un coup d'œil à son code original sous-jacent

public static native void arraycopy(Object src,  int  srcPos,
                                        Object dest, int destPos,
                                        int length);

System.arraycopy ne peut pas voir le code original de l'implémentation La raison en est que sa couche sous-jacente native est implémentée en C/C++. Mais l’avantage de la méthode native est qu’elle s’exécute très rapidement. Le code est implémenté comme suit :

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

À ce stade, l'intégralité du tableau de arr est copiée. Si vous souhaitez faire une copie partielle, vous pouvez terminer la copie partielle en modifiant les paramètres formels

méthode de clonage

. la dernière est la méthode array name.clone. Cette méthode comprend Ça y est, le code est implémenté comme suit :

public static void main(String[] args) {
        int[] arr = {1,2,3,4,5};
        int[] copy = arr.clone();
    }

La copie est terminée Cette méthode produit principalement une copie de l'objet, mais l'adresse est toujours différente.

Apprentissage recommandé : "Tutoriel vidéo Java"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer