2016-04-03 5 views
1

のは、私はそうのように私のリストを初期化しましょう:範囲外のメソッドのリストを返さずにリストを変更できるのはなぜですか?

public static void main(String[] args) { 
    ArrayList<String> a = new ArrayList<String>(); 
    a.add("one"); 
    a.add("two"); 
    a.add("three"); 
    a.add("four"); 
    modifyList(a); 
} 
modifyListは、単純にすべての値を変更する

に「1」そうのような:

private static void modifyList(ArrayList<String> a) { 
    for (int i = 0; i < a.size(); i++) { 
     a.set(i, "one"); 
    } 
} 

私は、このメソッドを呼び出す前と後に、私はリストを印刷する場合同じオリジナルのリストが2回出現すると思います。しかし何らかの理由でmodifyListで変更されたArrayListは、mainのArrayListと同じです。

リストの代わりにintsとStringsを使って同じ実験を試みると、ではなくが変更されます。

誰でも理由を説明できますか?

答えて

4

Javaでは、パラメータは値によって渡されます。

ただし、ArrayListへの参照をメソッドに渡しました(参照自体が値渡しされる)ため、メソッドは元のリストを変更しました。

これが起こらないようにするには、不変のリストをパラメータとして渡す必要があります。

+0

私は整数と文字列を使用しているとき、値の代わりにメソッドにInteger/Stringオブジェクトの参照を渡していません(値ではなくArrayListの参照を渡すのと同じ方法です) ? –

+0

期待どおりに動作しない実験のコードを表示する必要があります。整数と整数の間には違いがあります(実際には整数と整数)。それはあなたがあなたの説明から確信しているかどうかはわかりません。 – arcy

+0

Javaプリミティブ(int、float、byte、charなど)とJavaオブジェクト(プリミティブとして扱われるオブジェクトであるStringは例外です)には違いがあります。プリミティブは値によって渡され、不変です。ですから、プリミティブを変更しようとすると、オリジナルのものの代わりに新しい値が作成されます。ただし、オブジェクトは元のobjへの参照によって渡されます。したがって、変更は元の値に影響します。 – mmaarouf

関連する問題