2016-10-08 8 views
-4

グローバル変数のデータを代入してローカル変数のデータを変更しようとしていますが、ローカル変数の構造を変更すると、グローバル変数も変更されます。私は理解していないJava:ローカル変数がグローバル変数のオリジナルコピーに影響するのはなぜですか?

private void remove(Message M) { 
     int   p = list.lastIndexOf(M); 
     List<Message> x = list; 
     list.remove(p); 
     indexedMessages.remove(M.getMessageid()); 
     notifyItemRemoved(p); 
     notifyItemRangeChanged(p, list.size()); 

// Removing the following items from "x" also causes the elements to be removed from recycleView. 
     x.remove(0); 
     x.remove(x.size() - 1); 
} 

2つのこと:

  1. なぜ "×" 影響 "リスト"
  2. そして、なぜある "notifyItemRemoved" は再度トリガ。とにかく

、オリジナルの「リスト」(民間の一覧リスト)で、最初&最後の項目は単なるプレースホルダです。このリストから項目が削除されると、そのリストの新しいコピーをプレースホルダなしで保存したいと考えています。

アダプタが作成されるたびにプレースホルダが追加されます。ローカル変数xが行われる前に

+5

両方の変数が同じオブジェクトを参照します。それらは単にメモリ位置へのポインタです。 –

+1

変数は参照です。両方の変数が同じオブジェクトを指しています。 –

+0

@ JeroenVannevel "x"を変更すると "list"のメモリ位置でデータが変更されないように、新しい場所に "x"を置く方法を教えてください。 – Relm

答えて

3

、ローカル変数xが行われた後

あなたはxから要素を取り除いた後、

xという変数は、listと呼ばれるタイプList<Message>のオブジェクトへのポインタ/参照であるためです。したがって、xへの変更は、両方とも同じオブジェクトを指しているため、listに同時に適用されます。

グローバル変数に影響を与えずにxに変更を加えたい場合は、xを新しいオブジェクトに指定し、グローバル変数のすべての内容をxにコピーする必要があります。これは冗長性があることに注意してください。たとえば、これは動作します、理由から

List<Message> x = new ArrayList<Message>(); 
//modify x here 

はコメントで指摘した方法が

  • List<Message> x = ArrayList<Message>()List<Message> x = ArrayList<>()ように書き換えることができる終了後

    • ローカル変数が失われているため、これは冗長ですオブジェクトタイプはList<Message>から推測できるので、それを再記述する必要はありません。

    Alsもし私たちが持っていれば:

    List<String> a = new ArrayList<String>(); 
    a.add("a"); 
    a.add("b"); 
    a.add("c"); 
    

    "a"の内容を "b"に次のようにコピーすることができます。

    List<String> b = new ArrayList<>(a); 
    
  • +0

    'List x = new List ()'は抽象的なものであり、ここでインスタンス化することはできませんし、以前は 'List x = new ArrayList ()'を試しました。 – Relm

    +0

    @Relmあなたは 'List x = new ArrayList ()'を試しましたか? –

    +0

    はい、私の前のコメントに誤字がありました。 'new ArrayList ()'は冗長になりました。 – Relm

    関連する問題