Object
, notamment
toString()
;
Exemple 43. Déclaration d'un tableau
int [] tab1 ; // déclaration d'un tableau pouvant contenir des entiers int tab2 [] ; // déclaration équivalente à la précédente
Exemple 44. Création d'un tableau, initialisation dans une boucle
for
int nombreMarins = 10 ; // taille initiale du tableau Marin [] marins = new Marin [nombreMarins] ; // création du tableau for (int i = 0 ; i < marins.length ; i++) { marins[i] = new Marin() ; // initialisation de chaque case du tableau }
length
, disponible pour tout tableau, qui donne la longueur de ce tableau. Ce champ est à utiliser toutes les fois que l'on souhaite parcourir les cases de ce tableau.
Notons que l'on peut aussi parcourir les tableaux à l'aide de la syntaxe
foreach
, à partir de Java 5.
Exemple 45. Parcours d'un tableau dans une boucle
foreach
for (Marin marin : marins) {
marin = new Marin() ; // initialisation de chaque case du tableau
}
NPE
, que nous avons déjà vue.
Marin [] marins = new Marin[10] ; String nom = marins[3].getNom() ; // ERREUR !!!!!
Exemple 46. Initialisation d'un tableau de types de base
int tableau [] = {0, 1, 2, 3, 4} ; // on peut aussi placer les [] juste après int int [] autreTableau ; autreTableau = new int [] {0, 1, 2, 3, 4} ;
Exemple 47. Initialisation d'un tableau d'objets
Marin marins [] ;
marins = new Marin [] {
new Marin(),
new Marin("Surcouf"),
null
} ;
Object
sont accessibles sur toute variable de type tableau. Malheureusement, on pourrait s'attendre de leur part à un comportement sympathique, ou tout du moins qu'elles expriment un peu de compassion pour les malheureux développeurs que nous sommes, mais il n'en est rien. Si l'on déclare deux tableaux de la façon suivante :
int [] tab1 = {0, 1, 2, 3, 4} ; int [] tab2 = {0, 1, 2, 3, 4} ;La méthode
toString()
de
tab1
nous retourne l'indigeste chaîne de caractères suivante :
tab1.toString() -> [I@18d107fLa comparaison de ces deux tableaux par la méthode
equals()
nous retourne un désespérant :
tab1.equals(tab2) -> falseEt pour couronner le tout, les deux codes de hachage de ces deux tableaux sont différents. Il n'est malheureusement pas possible de surcharger ces méthodes. Cela dit, on dispose d'une classe utilitaire,
Arrays
, qui nous propose des méthodes statiques afin de palier ce manque. Parmi elles, des méthodes de comparaison, de calcul de code de hachage, et
toString()
. Nous verrons cette classe dans la partie sur l'API Java Collection.
Exemple 48. Déclaration d'un tableau bidimensionnel
int [][] tableauBidi ; tableauBidi = new int [10][5] ;
Exemple 49. Initialisation d'un tableau bidimensionnel
int tableauBidi [][] ; tableauBidi = new int [][] { {0, 1, 2}, {1, 2, 3}, {2, 3, 4} } ;
Exemple 50. Initialisation d'un tableau bidimensionnel - bis
int tableauBidi [][] = new int [3][] ; for (int i = 0 ; i < tableauBidi.length ; i++) { // tableauBidi.length vaut 3 tab[i] = new int [] {i, i + 1, i + 2} ; }
tableauBidi
est un tableau de tableau,
tableauBidi.length
est défini, de même que
tableauBidi[i].length
, qui, dans notre exemple, vaut 3 pour le valeurs de
i
: 0, 1, 2.
On peut s'amuser à construire des tableaux bizarres, c'est assez amusant à faire, et encore plus à débugger :
Exemple 51. Un tableau bizarre
int tableauBidi [][] = new int [3][] ; tableauBidi[0] = new int [] {0, 1, 2} ; tableauBidi[1] = new int [2] ; tableauBidi[2] = null ;
length
lorsque l’on veut accéder aux différents éléments d’un tableau.
System.arraycopy
, dont voici la signature.
public static void arraycopy(Object src, int src_pos, Object dest, int dest_pos, int length)Les objets
src
et
dest
doivent être des tableaux de même type, sans quoi une exception est générée. Ces deux tableaux doivent avoir été correctement déclarés et initialisés.
Lors de cette opération, la machine Java va tenter de copier
length
éléments du tableau
src
à partir de l'index
src_pos
, vers le tableau
dest
, à partir de l'index
dest_pos
. Si un dépassement de capacité a lieu, une exception est générée. Ce dépassement peut avoir lieu en lecture (si
src_pos + length
dépasse la taille du tableau
src
), ou en écriture (si
dest_pos + length
dépasse la taille du tableau
dest
).
Voici un exemple d'utilisation de cette méthode :
Exemple 52. Copie de tableau par
System.arraycopy
int tab1 [] = new int [] {0, 1, 2, 3, 4, 5} ; int tab2 [] = new int [] {0, 10, 20, 30, 40} ; System.arraycopy(tab1, 1, tab2, 1, 2) ;
tab1
est inchangé, et le contenu de
tab2
est le suivant :
tab2 -> {0, 1, 2, 30, 40}Rappelons qu'une fois un tableau créé, il n'est plus possible d'en changer la taille. L'utilisation de
System.arraycopy
ne déroge pas à cette règle.
String
StringBuffer
et
StringBuilder