0

Pool古いオブジェクトを再度使用する場合に備えて、古いオブジェクトを予約するオブジェクトを作成しようとしています (新しいオブジェクトのインスタンス化を避けるため)。私はそれをグーグルで検索しArrayBlockingQueue、それを使用して作成する人もいますPool。しかし、私が知らない質問が 1 つあります。それは、オブジェクトが挿入されたときに新しいインスタンスを再作成するかどうかです。

例えば:ArrayBlockingQueue<Integer> pool = new ArrayBlockingQueue<Integer>(3);

しばらくして:pool = (3,4,5);

pool.take(5); ==> pool = (3,4);
pool.put(6);  ==>pool = (6,3,4);

では、古い Integer オブジェクト (値は 5) に 6 が割り当てられているのだろうか、それとも Java が新しいものを作成してその値を 6 として割り当てているのでしょうか?

ありがとう :)

4

4 に答える 4

1

ArrayBlockingQueue、パラメーター タイプの配列によってサポートされます。したがって、内部的には次のようになります。

E[] items;

あなたの場合は次のようにインスタンス化されます

Integer[] items;

のソース コードによると、ArrayBlockingQueueこのputメソッドは実際に次のメソッドを呼び出しますinsert

private void insert(E x) {
    items[putIndex] = x;
    putIndex = inc(putIndex);
    ++count;
    notEmpty.signal();
}

したがって、呼び出すと何が起こるかとpool.put(6)いうと、int6 がオブジェクトにボックス化されInteger、メソッドに渡されます ( Eis now であるためInteger)。したがって、実際に の新しいインスタンスを作成すると言っても過言ではありませんInteger

于 2012-02-09T15:49:57.517 に答える
1

基になる実装について心配する必要はありません。これは、「カプセル化」によってJavaで意図されていることです。Oracleのドキュメントによると、「プット」は実際には要素を末尾に「挿入」します。したがって、「古いオブジェクト」に代わるものはないと思います。

于 2012-02-09T14:58:56.720 に答える
0

ここに新しいオブジェクトが作成されました。

pool.put(6);

オートボクシングがそれを次のように変換していると考えると、より明白になります。

pool.put(new Integer(6));

キューはこれらのオブジェクトを作成したり再利用したりせず、指定したものを保存します。

于 2012-02-09T15:16:11.597 に答える
0

この場合、値の置き換えが実際に行われるかどうかは真剣に疑問です。さらに、コードが膨大な数のオブジェクトを生成して破棄しない限り、そのようなオブジェクト プールのカスタム実装が役立つかどうかはわかりません。

さらに興味深いのは、質問でスレッドセーフやマルチスレッドについて何も言及していないことですが、これらのタグを使用しています。そのようなプールで達成したいことは正確には何ですか? ArrayBlockingQueue1 つ (または多数) のスレッドがオブジェクトをダンプし、1 つ (または多数) のスレッドがオブジェクトを削除する、スレッドセーフなコレクションとして意図されています。オブジェクトがキューから必要であるがキューにない場合、またはオブジェクトが追加されたがキューに容量がない場合に、さまざまな動作を提供するメソッドが多数あります。javadocを調べて、それが本当にArrayBlockingQueue必要かどうかを確認してください。

于 2012-02-09T15:13:22.977 に答える