web-dev-qa-db-fra.com

passer tableau par référence en java

Est-il possible de passer un tableau sous forme d'argument sous Java comme ceci: int[5] &result? Je souhaite transmettre la référence au tableau car je souhaite modifier le tableau dans la fonction d'appel. Quelle serait la syntaxe?

11
maryam
private void demo() {
    int[] array = new int[5];
    System.out.println(Arrays.toString(array)); // 0, 0, 0, 0, 0
    fillArray(array);
    System.out.println(Arrays.toString(array)); // 0, 1, 2, 3, 4
}

private void fillArray(int[] array) {
    for (int i = 0; i < array.length; i++) {
        array[i] = i;
    }
}

Les tableaux sont des objets en Java. Et les références aux objets sont passées par valeur.

33
JB Nizet

En Java, un tableau est passé par valeur, mais la valeur est une référence à un tableau. Supposons que vous ayez un tableau arr. Lorsque vous le transmettez, vous pouvez modifier le tableau auquel arr fait référence, mais vous ne pouvez pas changer le tableau auquel arr fait référence; c’est-à-dire qu’à l’intérieur d’une méthode, vous pouvez modifier l’objet référencé, mais vous ne pouvez pas modifier la variable transmise qui fera toujours référence au même objet. Je vais essayer d'illustrer avec un exemple: 

public static void swap(StringBuffer a, StringBuffer b)
{
    StringBuffer t = a;
    a = b;
    b = t;
}

public static void change(StringBuffer a, StringBuffer b)
{
    a = a.append("1");
    b = b.append("2");
}

public static void main(String[] args)
{
    StringBuffer a = new StringBuffer("First");
    StringBuffer b = new StringBuffer("Second");
    swap(a, b);
    System.out.println(a + " " + b);
    change(a, b);
    System.out.println(a + " " + b);
}

Sortie: 

First Second
First1 Second2

Vous pouvez voir dans l'exemple que First Second est obtenu dans la sortie au lieu de Second First. En effet, dans la fonction swap, des copies utilisées n’ont aucune incidence sur les références dans l’essentiel. Ainsi, illustrant le fait que vous ne pouvez pas modifier la variable transmise qui sera toujours une référence au même objet. Cependant, la fonction change produit l'effet souhaité car vous pouvez modifier l'objet référencé.

Pour plus de références, voir ceci:
Java est-il «référence par référence»?

17
bane

Java est passé par valeur. Cette référence sera passée par valeur, qui est copiée. Il sera toujours dirigé vers le tableau d'origine.

int[] arrayToPass
5
RNJ

Cela pourrait être une façon de penser impopulaire à ce sujet, mais étant moi-même du côté du C/C++, cela m’a facilité la tâche. 

En Java, les objets sont types de référence. Ce qui signifie que l'objet réel se trouve quelque part sur le tas et que vous utilisez réellement n'est qu'un référence à cet objet. Ainsi, il est plus simple de penser cela en termes de pointeurs C (comme une analogie). 

Classname object;

se comporterait de la même manière que ci-dessous en C/C++

Classname *object; 

De même, dans le cas de fonctions, elles se comportent comme si les paramètres de la fonction étaient passés en tant que pointeurs. Semblable à la façon dont vous simuleriez une référence au passage en C

void Function(Classname object)

Est plus comme la version C ci-dessous

void Function(Classname *object)

et tant que vous ne modifiez pas la valeur du pointeur lui-même (en Java en réaffectant la variable avec une nouvelle instance), vous pouvez l'utiliser pour accéder à l'instance d'origine et la modifier. 

Enfin, TOUS les types autres que les types primitifs (int, double, boolean, etc.) sont des types de référence (même des types tels que Integer, Double, Boolean et tableaux) 

Donc, comme d'autres l'ont déjà expliqué, vous vous n'avez pas besoin d'ajouter le & pour qu'il se comporte comme prévu

1
Karthik T

Pourrait changer votre paramètre de fonction pour accepter une liste?

La méthode statique asList de Java.util.Arrays doit renvoyer une liste qui utilise le tableau comme stockage.

class Example
{
  public static void changeArray( List t )
  {
    //
  }
}

// a caller
int[] test = new int[5];
Example.changeArray( Arrays.asList( test ) ); //list backed with array

Je vais revoir cela plus tard.

0
cavila