2016-05-17 1 views
0

Mon sentiment divin me dit que la réponse est "Integer et String sont immuables", mais je veux obtenir la confirmation des experts ici.ma méthode traverse ne transmet pas la valeur de int mais peut transmettre la valeur de ArrayList

J'ai une méthode de traverse, qui va fondamentalement traverser l'arbre entier à partir de la racine. Voici deux types d'utilisation, le premier ne fonctionnera pas, retournera toujours 0, le second fonctionne, le résultat ArrayList peut s'accumuler en travers.

Voici le premier:

public int whateverSum(TreeNodeType root, int target) { 
    int sum = 0; 
    traverse(root, target, sum); 
    return sum; 
} 

Voici le second:

public List<String> whateverSum(TreeNode root, int target) { 
    List<String> result = new ArrayList<String>(); 
    traverse(root, target, result); 
    return result; 
} 

S'il vous plaît aidez-moi la confirmer ma pensée si elle est correcte.

Répondre

2

Vous avez raison. En fait, ce qui se passe est que la méthode traverse transmet la valeur d'un int mais pas la valeur de ArrayList.

Eh bien, ce qui se passe est la différence entre les valeurs et la référence. Lorsque vous transmettez un int à une fonction, la valeur est copiée. La fonction accède à la copie de la valeur. Il l'utilise de toutes les façons possibles, mais à la fin toutes les opérations sont effectuées sur la copie de la valeur, sans que l'original soit modifié. Lorsque vous transmettez un objet à une fonction, vous lui transmettez une référence, tout comme une adresse mémoire.

Cela est logique car lorsque vous passez une ArrayList de millions d'éléments, vous préférez ne pas copier ces millions d'éléments à chaque fois. Donc, ce qui est copié est la référence à cet objet, qui pointe vers la structure d'origine. C'est pourquoi, lorsque vous passez un int à une fonction, la valeur d'origine ne sera jamais modifiée. Alors que lorsque vous passez une ArrayList, son contenu va changer. Maintenant, tous les objets ne se comportent pas ainsi, c'est là que viennent les objets immuables. Vous avez dit que les cordes sont immutables, ce qui est très pratique. Ainsi, lorsque vous modifiez une chaîne, elle est copiée et la valeur d'origine ne change pas non plus. Les types comme Integer ou Double sont également immuables. Cela a beaucoup de sens, car lorsque vous incrémentez un nombre entier, vous ne voulez pas que tout le 1 de votre programme devienne 2.

En ce qui concerne votre code, afin d'obtenir la première méthode de travail, vous pouvez faire quelque chose comme:

public int whateverSum(TreeNodeType root, int target) { 
    int sum = traverse(root, target, 0); 
    return sum; 
} 

Où traverse retourne la somme mise à jour.