Maison  >  Article  >  Java  >  array[] : une classe spéciale gérée en interne par la JVM elle-même

array[] : une classe spéciale gérée en interne par la JVM elle-même

DDD
DDDoriginal
2024-09-12 20:16:10733parcourir

La première façon dont nous sommes tous initiés à l'étude des structures de données en Java (et dans d'autres langages) consiste à utiliser des tableaux. En Java, un tableau est une classe, un objet, un enfant d'Object (comme toutes les classes). Cependant, c'est un cours avec un traitement spécial dans la langue.

Contrairement aux classes et objets courants, la syntaxe des tableaux et leur traitement est géré directement par le compilateur et la JVM (Java Virtual Machine). Cela inclut la manière dont les tableaux sont alloués, manipulés et accessibles. Cette classe ne se trouve pas directement dans le code source.

Java traite automatiquement les tableaux comme des instances de cette classe spéciale.

Si vous exécutez le code ci-dessous, vous verrez les résultats suivants :

public class Main
{
    public static void main(String[] args) {
        int[] intArray = new int[5];
        System.out.println(intArray.getClass().getName());
        System.out.println(intArray.getClass().getSuperclass());
    }
}

[Je
classe java.lang.Object

Ce nom de classe "[I" est juste un nom symbolique généré automatiquement, que la JVM utilise pour représenter un tableau d'entiers (int[]). Chaque type a son propre nom symbolique :

array[]: uma classe especial gerenciada internamente pela própria JVM

Les parenthèses "[" indiquent les dimensions. Un tableau à une dimension est représenté par [, tandis qu'un tableau à deux dimensions est représenté par [[, un tableau à trois dimensions est représenté par [[[... et ainsi de suite.

Déclaration

Pour déclarer et initialiser un tableau, il est important de préciser le type de données et la taille de l'objet :

int[] intArray = new int[5]; //array de tamanho 5
char[] charArray = new char[]{'a', 'b', 'c'}; //o compilador entende que é um array de tamanho 3
double[] doubleArray = {1.2, 1.3, 1.4, 1.5}; //o compilador entende que é um array de tamanho 4

Java vous permet de mettre des crochets dans le nom de la variable au lieu du type, par exemple : int intArray[] = new int[5]. Cependant, cela n'est pas recommandé, car cela s'écarte des conventions.

Les données stockées dans les tableaux peuvent être allouées en mémoire « de manière contiguë », c'est-à-dire séquentiellement, par la JVM. Pour accéder aux données, des index sont utilisés et le premier index d'un tableau est toujours 0 en Java.

Par exemple, pour accéder à la lettre « a » du charArray ci-dessus, vous devez la rechercher par charArray[0]. La lettre « b », quant à elle, se trouve dans charArray[1] et la lettre « c », dans charArray[2]. Si vous essayez d'accéder à un index qui n'existe pas dans le tableau, vous recevrez une erreur « IndexOutOfBounce ». Par exemple, si j'essaie d'accéder à la valeur dans charArray[3].

La taille d'un tableau, une fois définie dans la déclaration, ne peut jamais être modifiée. Si je déclarais que charArray aurait 3 éléments, il n'en contiendrait pas plus. Moins oui... plus non.

Et ici, un addendum. Les valeurs non renseignées dans un tableau prendront la même valeur par défaut que le type du tableau. Par exemple, dans un tableau d'entiers, les valeurs vides seront remplies par 0. Dans un tableau booléen, par false. Dans un tableau de chaînes, avec null.

Tout comme la taille, le type d'un tableau ne peut pas être modifié. Mais il est possible de copier des tableaux de types différents, s'il s'agit de sous-types du même type. Déroutant, non ? Un exemple aide : Integer et Double sont des sous-types de Number. Alors...

Integer[] integerArray = {1, 2, 3};
Number[] numberArray = intgerArray;

Ce code est accepté par le compilateur. Cependant, la prudence est de mise. Si nous faisons cela ici, nous générerons une erreur de compilation :

numberArray[0] = 1.2;

C'est parce que integerArray et numberArray pointent vers le même espace mémoire. Même si numberArray prend en charge un double comme premier élément, ce n'est pas le cas de integerArray et, par conséquent, numberArray n'est pas "autorisé" à modifier la valeur d'index 0.

Mémoire

Un tableau peut toujours stocker des données du même type, acceptant des primitives et des objets. Si le tableau est composé d'entiers, il n'acceptera pas char, double, float, String... seulement des valeurs entières.

Le tableau lui-même est une classe (bien que spéciale) et, par conséquent, est stocké sur le tas. De cette façon, le tableau stocke une adresse mémoire qui, à son tour, contient les valeurs saisies dans le tableau.

Un tableau primitif alloue des blocs de mémoire contigus pour stocker directement les valeurs, tandis qu'un tableau d'objets stocke des références (pointeurs) vers des objets, situés ailleurs dans la mémoire.

Cela signifie que les tableaux de types primitifs (comme int[]) et les tableaux d'objets (comme String[]) sont stockés sur le tas. Dans le cas de tableaux de types primitifs, les valeurs des éléments du tableau sont également stockées directement sur le tas, contigu au tableau lui-même. Dans le cas du tableau d'objets, les objets pointés par ces références peuvent être alloués à différents emplacements sur le tas.

Méthodes

Toutes les classes de tableaux ont des méthodes de longueur et de clonage. Le premier renvoie la taille du tableau et le second fait une copie du tableau vers un autre tableau (dans ce cas, le pointeur vers la même adresse mémoire).

Cependant, en tant qu'enfant de la classe Object (ainsi que de toutes les classes en Java), le tableau possède également les méthodes de superclasse : toString, equals et hashCode.

Using arrays behind the scenes, however, is what happens most in real life. Even though arrays are performant, it is much more complicated to iterate their elements and there are classes that make abstractions on top of arrays that make the programmer's life much simpler.

This is the case with the Arrays class (with capital letter). It basically packages arrays in a standard Java class and presents a series of very simple to implement methods for working with the data. The Arrays class has another powerful advantage: it works with dynamic allocation, so it is easier to deal with collections - after all, we rarely know the exact size of the array we may need. The Arrays class can expand the size of the collection on demand, without the programmer having to create new arrays (with lowercase letters) of larger sizes and copying data from the previous array, which suddenly became too small.

Arrays are also the basis of classes such as List, Stack and Queue (which are basically a wrap and include very good methods for dealing with data).

Have you ever stopped to think that String is a class that abstracts a char array?

array[]: uma classe especial gerenciada internamente pela própria JVM

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:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn