7

The Well-Grounded Java Developerの114ページのこのコードサンプルでは、​​最後の行は次のとおりです。

Update[] updates = lu.toArray(new Update[0]);

注が含まれています:ゼロサイズの配列を渡し、割り当てを保存します

List<Update> lu = new ArrayList<Update>();
String text = "";
final Update.Builder ub = new Update.Builder();
final Author a = new Author("Tallulah");

for (int i=0; i<256; i++) {
  text = text + "X";
  long now = System.currentTimeMillis();
  lu.add(ub.author(a).updateText(text).createTime(now).build());
  try {
    Thread.sleep(1);
  } catch (InterruptedException e) {
  }
}

Collections.shuffle(lu);
Update[] updates = lu.toArray(new Update[0]);

この節約は正確にどのような割り当てですか?

List#toArray(T [] a)のjavadocには、次のように記載されています。

リストが指定された配列に収まる場合は、リストが返されます。それ以外の場合は、指定された配列のランタイムタイプとこのリストのサイズで新しい配列が割り当てられます。

これは私が覚えていることです。渡した配列がtoArray(T[] a)リスト内のすべてに収まらない場合は、新しい配列が割り当てられます。明らかに、リストには256個の要素があり、サイズ0の配列には収まらないため、メソッド内に新しい配列を割り当てる必要があります。

それで、そのメモは間違っていますか?それとも他に何か意味がありますか?

4

3 に答える 3

3

明らかに、リストには256個の要素があり、サイズ0の配列には収まらないため、メソッド内に新しい配列を割り当てる必要があります。

はい。


使用できます

 private static final Update NO_UPDATES = { }

 lu.toArray(NO_UPDATES);

ただし、これは、リストの長さが通常0であると予想される場合にのみ役立ちます。

一般的に、私はfgeと同じアプローチをします

 lu.toArray(new Update[lu.size()]);

あなたの特定のケースでは、あなたはあなたがすることができるように事前にサイズを知っています

Update[] updates = new Update[256];
String text = "";
final Update.Builder ub = new Update.Builder();
final Author a = new Author("Tallulah");

long now = System.currentTimeMillis();
for (int i=0; i<updates.length; i++) 
  updates[i] = ub.author(a).updateText(text += 'X').createTime(now++).build();

Collections.shuffle(Arrays.asList(updates));
于 2013-01-11T15:02:10.637 に答える
2

質問に対する@Andreasのコメントから離れて、私はそれタイプミスだと思います、そして言うべきです:

ゼロサイズの配列、安全な割り当てを渡します。

メソッドに何も渡さなかった場合、List#toArray()引数なしのオーバーロード を呼び出すことになります。

Object[]これは(インスタンスのみを含みますが)を返しUpdate、変数のタイプを変更する必要があるupdatesため、最後の行は次のようになります。

Object[] updates = lu.toArray();

そして、その配列内の要素を繰り返し使用するたびに、それらをにキャストする必要がありUpdateます。

配列を指定すると、 List#toArray(T [] a)メソッドが呼び出され、。が返されます<T> T[]。この配列は、Updateインスタンスの配列であることを認識できるように修正されています。

したがって、Updatesの空の配列を指定すると、Object[]ではなくtoArray呼び出しからUpdate[]が返されます。これは、はるかにタイプセーフな割り当てです。 メモの「保存」という単語はタイプミスである必要があります。

...これはあまりにも多くの精神的な努力を消費しました。彼らがそれを修正できるように、本のフォーラムにこれへのリンクを投稿します。

于 2013-01-11T19:03:39.490 に答える
0

またはと比較して、割り当てを節約しtoArray(new Update[255])ますtoArray(new Update[1000])

于 2013-01-11T15:15:01.917 に答える