- ベストアンサー
ソースコードの読み方
ArrayList の size() メソッドの処理の仕方について、 いろいろ調べてるのですが、自分の力不足で理解ができません。 add については、 http://www.stackasterisk.jp/tech/java/collection02_02.jsp を参考にしたのですが・・・。 バイトコードでは、この size() メソッドを使うと、どのように処理してるかも知りたい所なのですが・・・。 よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
JVMがどうのような動作をしているのかは、知りません。 ただ、JVMというのは文字通り「仮想マシン」で、 エミュレータみたいなものだったはずです。 バイトコードは、現実マシンの機械語に相当していたと思います。 その辺を知りたければ、仮想マシンの仕様書を調べてください。 言語レベルの話でいいのなら、説明はできます。 >結局は、size() とした時に、内部では要素数を数えて、 その結果を返してくると考えてるのですが、その様子をしりたいです・・ 初めに書いたように、size() では、数えていません。 add()やremove()など要素数に変更が起こるメソッドの実行時に、 内部の変数sizeを更新し、size()ではその値を返しているだけです。 処理の概要としては、 1.インスタンス変数に、 Object[] elementData int size を用意(初期化しておく) 2.追加時は(add()メソッド)、elementData.lengthが size + 1より小さい場合に、1.5倍のサイズに拡張。 変数sizeを1増加。 *拡張処理はensureCapacity()メソッドで行う。 以下ソースより引用 int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if(newCapacity < minCapacity) newCapacity = minCapacity; elementData = new Object[newCapacity]; System.arraycopy(oldData, 0, elementData, 0, size); } } 3.sizeメソッドでは、変数sizeを返す。
その他の回答 (2)
- ngsvx
- ベストアンサー率49% (157/315)
>コンスタントプールで、どのような処理をして、 コンスタントプールって何ですか? 処理の概要を書こうと思ったけど、関係ないのかな?
補足
回答ありがとうございます。 >コンスタントプールって何ですか? 自分でも理解しきれてないのですが、JVM内でのクラスや定数を保持している所と思ってます。 今回の題意とは、少し内容が反れているのですが、ソースコードを追って行ってる間に考えが、JVMに行ってしまいました。 そこで、各メソッドは、このJVM内ではどのような処理をしているのか?と疑問を抱きました。 そして、今回の size() メソッドでは、何をカウントして、要素数を返してくるのか?を疑問に思いました。 結局は、size() とした時に、内部では要素数を数えて、その結果を返してくると考えてるのですが、その様子をしりたいです・・。
- ngsvx
- ベストアンサー率49% (157/315)
バイトコードはどうだか知りませんが、 ArrayList#size()は、内部の変数sizeを返しているだけです。 J2SDKには、ソースコードが付いていますから、それを見れば すぐにわかりますよ。
補足
自分でも解決をと思い、いろいろ調べていると、返信が遅れました・・。 >ArrayList#size()は、内部の変数sizeを返しているだけです。 なのですが、この辺りを深く理解したいと思ってます。 自分がおおよその検討しているのは、コンスタントプールで、どのような処理をして、要素サイズを返しているのか・・?みたいな事を知りたいと思いまして・・。 またの助言がありましたら、よろしくお願いします。
お礼
返事が大変遅れました。 丁寧な回答、何度もありがとうございました。 自分の考えの中で、スゴク勘違いしていた部分が多く、 質問が支離滅裂な部分があったことだと思ってます・・。 回答、ありがとうございました。