2017-08-23 5 views
0

私はMyApplicationClassを持っています。私はMainActivityに変数ArrayListを作成し、それにMyApplciationClassの変数を割り当てます。最後に、ローカル変数にremoveを呼び出して値を削除しますが、値はMyApplicationClass localvariableとそれが可能なのは、MyApplicationClassからリストを取得するだけなので、何もしませんでしたか?ここで なぜ "ArrayList.remove"はローカル変数とmyApplicationClassの両方を削除しますか?

は私のコードです:

MyApplicationClass:

private ArrayList<String> text = new ArrayList<>(); 


public ArrayList<String> getText() { 
    return text; 
} 

public void addTest(String input) { 
    text.add(input); 
} 

MainActivity:

//When click on a button: 

final MyApplicationClass myApplicationClass = (MyApplicationClass) getApplicationContext(); 

//I add some example values 
myApplicationClass.addTest("1"); 
myApplicationClass.addTest("2"); 

//Here I retrieve the variable in MyApplicationClass to put in into a local variable: 

ArrayList<String> testlocal = myApplicationClass.getText(); 

//And here I remove a value from the localvariable testlocal: 
test.remove(1); 

しかし、私はデバッグし、変数を見たとき、私は値が正しくtestlocalで削除されていることがわかりますでも文中にMyApplicationClassがありますのテキストローカルから値を削除してください。

ありがとうございます。

答えて

4

2つの変数は、同じArrayListオブジェクトを参照しています。この割り当てはtestlocalを作る

MyApplicationClassインスタンスのArrayListオブジェクトを参照:

ArrayList<String> testlocal = new ArrayList<>(myApplicationClass.getText()); 

ArrayList<String> testlocal = myApplicationClass.getText(); 

新しいArrayListを作成するには、new演算子を使用して、新しいオブジェクトを作成する必要があります

これらの2つのオブジェクトのいずれかで1つの要素を削除する(または追加する)ことは、他のオブジェクトに決して反映されません。ArrayListオブジェクトです。

新しいArrayList(Collection c)は、コピーされた要素のディープコピーを作成しません。
したがって、一方のオブジェクトまたは他のオブジェクトの状態を変更することは、他方のオブジェクトに反映されます。
実際には、Listのストアには実際には変更できない値のStringしかないため、問題はありません。

+0

なお、A(この場合) StringはJavaでは不変なので、ディープコピーは必要ありません。 –

+0

@Tobias Weimer私は要素のタイプを見ていないと告白します。フィードバックいただきありがとうございます。私は更新しました。 – davidxxx

1

元のリストのコピーを作成する必要があります。また、ArrayListクラスではなく、Listインターフェイスに依存する方が一般的です。

getText()メソッドでコピーを作成できます。コードを1か所だけ変更する必要があるため、これは簡単です。あなたがそれを取得するたび

public List<String> getText() { 
    return new ArrayList<>(text); 
} 

また、ローカルコピーを作成することができます:一方、ない外部クラスはMyApplicationClassあなたの変更ができなくなります

List<String> testlocal = new ArrayList<>(myApplicationClass.getText()); 
関連する問題