2017-08-24 6 views
0

私がソートされていないリンクリストから重複を削除する方法上で探していたし、Javaでの参照について混乱して取得しています:設定値は

public static void deleteDups (LinkedListNode n){ 
    Hashtable table = new Hashtable(); 
    LinkedListNode previous = null; 
    while(n!=null){ 
     if(table.containsKey(n.data)){ 
      previous.next = n.next; 
     } else { 
      table.put(n.data, true); 
      previous = n; 
     } 
     n = n.next; 
    } 
} 

我々はn = n.nextを行うと、なぜのない値previouspreviousnを指しているので、変更されますか?

+0

なぜあなたはセットを使ってみませんか? –

答えて

1

変数nは、実際にはLinkedListNodeのインスタンスを保持しません。

変数nには数字が入ります。たとえば、番号は0x04AF34EDです。

この番号は、のアドレスです。プロセッサがコンピュータのRAM内のアドレスを検索すると、LinkedListNodeに関連付けられたデータが検索されます。

変数previousにも数字が入ります。ソースコードの10行目では、変数nと同じ番号を保持します。つまり、同じオブジェクトを指しています。あなたのソースの11行目で、変数nには、オブジェクト番号n.nextの新しい番号が与えられます。 previousに割り当てられた番号は変更されません。それはまだ古いアドレスのLinkedListNodeを保持しています。 Javaの、あなたが実際にそのオブジェクトへの参照を作成しているList list = new ArrayList()ようにあなたは、新しいオブジェクトを作成するたびに

  • あなたがオブジェクトを格納するためのスペースのためのオペレーティングシステムを尋ねます。
  • オペレーティングシステムはオブジェクトの場所を見つけ、番号(メモリのアドレス)を指定します。
  • その番号が変数に割り当てられます。
  • 変数に与えられたアドレスに格納されたデータにアクセスするには、オブジェクトのフィールドを読み込みます。