次のコードにおいて、少しわからないところがあります。
Stackの非常に簡単な実装です。
Java
1public class Queue { 2 Node first, last; 3 4 void enqueue(Object item) { 5 if(first == null) { 6 last = new Node(item); 7 first = last; 8 } else { 9 last.next = new Node(item); 10 last = last.next; 11 } 12 } 13 14 Node dequeue() { 15 if(first != null) { 16 Object item = first.data; 17 first = first.next; 18 return item; 19 } 20 return null; 21 } 22} 23 24class Node { 25 Node next = null; 26 int data; 27 28 public Node(int d) { 29 this.data = d; 30 }
Stackをインスタンス化し、enqueuメソッドによって要素を挿入していくとします。
今要素を4つ挿入するとして、それを参照型の変数がどのように変化していくかに着目しながら追っていきます。
まず、はじめに要素が挿入されますと、(aとします)このインスタンスaはfirstとlastによって参照されています。
次に要素bを挿入しますと、bはenqueueメソッドが最後まで実行された時、lastとfirst.next及びlast.nextによって、参照されています。
3つ目(cとします)を挿入した時、aはfirst、bはfirst.next、cはlast.nextとlastによって参照されていると思います。
4つ目(dとします)を挿入した時は、aはfirst、bはfirst.next、cはどの変数にも参照されておらず、dはlastとlast.nextによって参照されていると思います。
一つ目の質問は、どの参照変数にも参照されていないcはGCにより、削除されてしまわないのでしょうか?
二つ目の質問はdequeuした時の挙動についてです。
dequeueメソッドを呼び出すと、今はfirstはnullではありませんので、firstのdataがitemに代入されて、firstはfirst.nextに置き換えられます。
今提示した例では初めインスタンスaを参照していたfirstの値がbを参照していたfirst.nextの値に置き換えられたわけです。
そして、first.nextは次にインスタんスcを指すわけですが、これはなぜなのでしょうか?
というのもインスタンスbのフィールドnextはnullのままではないのでしょうか?
従って、firstがbを指すようになっても、その参照しているインスタンスのnextはnullを指しているのですから、first.nextもnullを指しているのではないかと考えてしまいます。
これらの私の考えは正しくないと思うのですが、一体どこで間違いを犯しているのでしょうか?
お分かりの方、ぜひ教えてください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/08/29 11:27