1

を使ってjavax.mail.Message#setRecipeintsいると、初めて気づき、もっと知りたいと思いました。

これは私のコードです:

List<InternetAddress> ccRecipients = new ArrayList<InternetAddress>();
// have a valid and working 
// method that fills the list with the data (InternetAddress objects)
message.setRecipients(
         RecipientType.CC, ccRecipients.toArray(new InternetAddress[0]));

ここでは、なぜ新しい配列を作成し、メソッドInternetAddressの0番目のインデックスに要素を渡す必要があるのか​​わかりません。toArray

なぜこれを行う必要があるのか​​誰かが説明できますか?

toArrayこの特別な方法と関係があると思います。

APIドキュメントから以下を読みましたが、最後の部分(太字)を取得できませんでした:

toArray()メソッドと同様に、このメソッドは配列ベースのAPIとコレクションベースのAPIの間のブリッジとして機能します。さらに、このメソッドを使用すると、出力配列のランタイムタイプを正確に制御でき、特定の状況下では、割り当てコストを節約するために使用できます

割り当てコストをどのように節約しますか?

4

4 に答える 4

2

toArray()パラメーターなしの場合、 の型が返されますが、 の型ObjecttoArray(T[] a)返されますT[]。これは List のジェネリック メソッドです。

于 2013-02-12T13:17:35.337 に答える
0

使用しているメソッドのソースは次のとおりです。ArrayList.toArray()

public <T> T[] toArray(T[] a) {
  if (a.length < size)
    // Make a new array of a's runtime type, but my contents:
    return (T[]) Arrays.copyOf(elementData, size, a.getClass());
  System.arraycopy(elementData, 0, a, 0, size);
  if (a.length > size)
    a[size] = null;
  return a;
}

最初に、インデックス 0 への参照を渡すのではなく、長さ 0 の新しい配列を渡します。リストが空ではないと仮定すると、新しい長さ 0 の配列は小さすぎて保持できません。正しいタイプが作成されます:Arrays.copyOf(elementData, size, a.getClass());

リスト全体を保持するのに十分な大きさの配列を渡すことができ、そのリストは指定した配列にコピーされます。System.arraycopy(elementData, 0, a, 0, size);これにより割り当てコストが節約されるかどうかは、なんとも言えません。System.arraycopy()ネイティブなメソッドです。つまり、プラットフォームに依存します。使用するコードを見なくても、ネイティブ実装は一般的により効率的であるという事実に依存し、JVM ライターが何をしているかを知っていることを信頼する必要があります。

于 2013-02-12T13:19:00.630 に答える
0

メソッドへの引数は、コレクションの内容が十分に大きい場合、コレクションの内容を受け取ることができる配列です。コレクションを保持するのに十分な大きさの配列が既に割り当てられている場合は、新しい配列を割り当てる代わりに同じ配列を使用できると思います。

コードが長さ 0 の配列を渡していることに注意してください。その配列は、コレクションが空の場合にのみ返されます。リストに項目がある場合、新しい配列が割り当てられて返されます。

于 2013-02-12T13:19:09.070 に答える
0

これを使用して割り当てコストを節約するには、配列引数を少なくともリストと同じ長さにする必要があります。その場合、データは引数によって参照される配列にコピーされます。List が常に同じサイズであり、常に同じ要素タイプである必要があり、一度に 1 つの配列のみが必要であるとします。toArray が呼び出されるたびに新しい配列を作成するのではなく、同じ配列を再利用できます。

実際には、毎回新しい配列を作成する方が一般的ですが、0 ではなくリスト サイズを使用すると toArray が使用できるようになります。

于 2013-02-12T13:22:25.627 に答える