0

私は静的メソッドと参照による配列の受け渡しについてこのセクションを読んでいます。だから私の質問は:配列引数をvoidではなく配列として返すのに良い時期はいつですか?

前もって感謝します!

4

3 に答える 3

4

参照による呼び出しによって配列を渡す静的メソッドについてのこのセクションを読んでいます。

これがJavaの記事、サイト、ブログ、本などである場合は、おそらくより良いものを見つける必要があります。Javaは、どのパラメーターにも「参照による呼び出し」を使用しません。Javaを理解していない、または「参照による呼び出し」の意味を理解していないと言う人。

Javaはすべての引数を値で渡します。限目。

混乱のポイントは、Javaのオブジェクトと配列が常に参照であることを理解していない人がいることです。したがって、(たとえば)配列を引数として渡す場合、値によって配列への参照を渡します。ただし、これは問題ではありません。値による参照の受け渡しは、真の「値による呼び出し」とは意味的に非常に異なります。

実際の見積もりについて:

「これらの例はすべて、Javaで配列を渡すメカニズムが、配列の内容に関する参照メカニズムによる呼び出しであるという基本的な事実を強調しています」(Sedgewick)。

「配列の内容に関して」という資格を与えられれば、彼が言っていることを私は理解しています。しかし、これを「参照による呼び出し」と呼ぶのは誤解を招きます。(そして明らかに、あなたはそれによってある程度誤解されました!)

また、技術的に間違っていると主張します。「値による呼び出し」、「参照による呼び出し」、「名前による呼び出し」などの用語は、パラメーターの受け渡し/返送に関するものです。この場合、パラメーターは配列全体であり、配列の内容ではありません。そして、そのレベルでは、セマンティクスは明らかに参照による呼び出しではありません。(メソッドでパラメーター名に新しい配列参照を割り当てても、呼び出し元の配列変数は更新されません。)配列の内容に関して参照による呼び出しと動作を区別できないという事実は、それを呼び出しません-参照による。


今あなたの質問の肉に...

voidではなく配列として配列引数を返すのが良い時期はいつですか?

あなたが何を意味するのかは完全には明らかではありませんが、私はあなたがこれらの2つの選択肢について話していると思います:

    public void method(String arg, String[] result) ...

    public String[] method(String arg) ...

理解しやすく使いやすいので、通常は2番目の形式の方が望ましいと思います。さらに、2番目の形式では、メソッドで結果の配列のサイズを選択できます。(最初の形式では、配列が小さすぎるか大きすぎる場合、再割り当てされた配列への参照を返す方法はありません。)

最初の形式を使用する必要があるのは次の場合のみです。

  • メソッドの機能要件が、既存のアレイを更新することに依存している場合、または
  • 割り当てられるオブジェクトの数を最小限に抑えるための包括的な必要性がある場合。たとえば、GCの一時停止を最小限に抑えるため。

最初のケースは、配列が他のデータ構造ですでに参照されている場合に発生する可能性があり、それらの参照を検索/更新することは困難です。配列が大きい場合にも発生する可能性があり、コピーを作成するコストが、メソッドによって実行される実際の作業のコストを支配します。

于 2012-05-03T02:40:20.553 に答える
0

Javaのメソッドに渡されるすべてのパラメーターは、プリミティブ型を期待する参照であるため、メソッドの内部または外部で1つのオブジェクトストレージをメモリに保持するだけで、静的メソッドはここでは特別なケースとして扱われません。この配列またはvoid型を返す場合、違いはありません。

この配列を返す場合、戻り値は、このメソッドに渡したばかりの値です。

于 2012-05-03T02:50:41.570 に答える
-2

まあ、最終的には...値で配列を渡すのは遅いです。メモリのブロックを取得して、アレイをコピーする必要があります。配列のサイズが数バイトしかない場合は、大したことではありません。ただし、メモリのチャンクが大きい場合、これは低速のIO操作になります。特に、これがタイトなループで発生している場合は、パフォーマンスが低下します。

参照渡しにより、事前にバッファを作成して再利用できます。

于 2012-05-03T02:19:31.413 に答える