先日のインタビューでこの質問を受けたのですが、ベストな答えをいくつか知りたいです(あまりうまく答えられませんでした、笑)。
シナリオ: あるネットワーク上で送信されるバイトを監視する Web ページがあります。バイトが送信されるたびに、recordByte() 関数がそのバイトを渡して呼び出されます。これは 1 日に数十万回発生する可能性があります。このページにはボタンがあり、これを押すと、recordByte() に渡された最後の 100 バイトが画面に表示されます (これは、以下の print メソッドを呼び出すことによって行われます)。
私が提供され、記入するように求められたのは次のコードです。
public class networkTraffic {
public void recordByte(Byte b){
}
public String print() {
}
}
100 バイトを保存する最適な方法は何ですか? リストですか? 最適な方法を知りたいです。
ベストアンサー1
このようなもの (循環バッファ) :
byte[] buffer = new byte[100];
int index = 0;
public void recordByte(Byte b) {
index = (index + 1) % 100;
buffer[index] = b;
}
public void print() {
for(int i = index; i < index + 100; i++) {
System.out.print(buffer[i % 100]);
}
}
循環バッファを使用する利点:
- スペースを静的に予約できます。リアルタイム ネットワーク アプリケーション (VoIP、ストリーミングなど) では、送信のすべてのデータを保存する必要はなく、処理する新しいバイトを含むウィンドウのみを保存すればよいため、この方法がよく使用されます。
- 高速です: 読み取りと書き込みのコストが O(1) の配列で実装できます。