1. ホーム
  2. java

"最後の100バイト "インタビューシナリオ

2023-09-28 20:07:20

質問内容

先日、面接でこのような質問をされました。

シナリオ あるネットワーク上で送信されたバイトを監視している Web ページがあります。バイトが送信されるたびに、そのバイトを渡す recordByte() 関数が呼び出され、これは 1 日に何十万回も発生する可能性があります。このページにはボタンがあり、押されるとrecordByte()に渡された最後の100バイトが画面に表示されます(これは、以下のprintメソッドを呼び出すことによって行われます)。

次のコードは、私が与えられ、記入するよう求められたものです。

public class networkTraffic {
    public void recordByte(Byte b){
    }
    public String print() {
    }
}

100バイトを格納するのに最適な方法は何でしょうか?リストですか?どのようにするのがベストか気になります。

どのように解決するのですか?

このようなもの ( 循環バッファ ) :

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]);
   }
}

循環バッファを使用するメリット

  1. 静的に領域を確保することができます。リアルタイム ネットワーク アプリケーション (VoIP、ストリーミングなど) では、送信のすべてのデータを格納する必要はなく、処理する新しいバイトを含むウィンドウのみを格納する必要があるため、これはよく行われることです。
  2. 高速です:O(1)の読み取りと書き込みコストの配列で実装することができます。