5

私はまだJavaの初心者であり、パラメーターを渡す効率的な方法について質問があります。メソッドでオブジェクトを渡す場合、オブジェクトの一部を渡す方が効率的ですか、それともまったく問題ではありませんか?たとえば、いくつかの属性(名前、高さ、性別、場所、hairColorなど)を持つPersonオブジェクトがあり、これらの属性の2つを処理する必要があるメソッドがあるとします。情報をメソッドに渡すとき、必要な情報(名前や場所など)のみを渡すためにメモリや処理時間などを節約できますか、それとも単に人物オブジェクト全体を渡すのと同じですか?

は:

public void getNamePlace(String name, String location){
\\\\work here
}

効率的には次のものとは異なります。

public void getNamePlace(Person person){
\\\\work here and get the name location in the method
}

助けてくれてありがとう。ばかげた質問で申し訳ありませんが、これに取り組むための最善の考え方を見つけようとしています。ありがとうございました。

psメソッド呼び出し自体についてもっと考えています。それはどのように機能しますか。単独で、は:

public void getNamePlace(String name、String Location)->より多くのビットが渡され、メモリが使用されます-> public void getNamePlace(Person person)

4

8 に答える 8

10

参照値を渡しています。渡す値が多いほど、より多くの作業が行われます。

それは測定可能な違いですか?技術的にはそうですが、極端な場合はごくわずかです(たとえば、別のパラメータは別のバイトコードであり、それだけです。パフォーマンスとクラスサイズの違いはほとんどありません)。

それはかなりの違いですか?いいえ。

ここでの考え方は、特にこのレベルでの時期尚早な最適化は対処するものではないということです。

他の人は、より重要な読みやすさとデータの問題があると指摘しています。

于 2012-08-16T18:23:56.173 に答える
4

それは「まったく問題ではありません」。Javaでは、オブジェクトの参照(値として)のみを関数に渡します。これは非常に小さなデータ型であり、オブジェクトがメモリ内のどこにあるかをVMに通知します。

Javaは「参照渡し」または「値渡し」ですか?を見てください。非常に良い答えのために;)

于 2012-08-16T18:23:18.723 に答える
4

これを使用する場合:

public void getNamePlace(Person person){
   \\\\work here and get the name location in the method
}

タイプの実際のオブジェクトへの参照(大まかな意味での「ポインタ」)を除いて、実際には何もメソッドに渡されませんPerson。代わりに、「このメモリ位置で必要なものをすべて見つけることができる」というメソッドを指示しているため、メンバーのコピーは行われません。

したがって、技術的に限られた数のフィールドをからperson渡すことは、実際には「人全体」を渡すよりも悪いです(とにかく違いは目立ちませんが)。:)

于 2012-08-16T18:23:38.700 に答える
3

Javaのオブジェクトは参照によって渡されます。簡単な答えは、オブジェクトを渡すことです。

長い答えは、Javaのインストールに応じて、オブジェクト参照は32ビットまたは64ビットのいずれかであるということです。64ビットの量は、JVMの一般的なパディングサイズの2倍です(状況によっては、64ビットシステムでも32ビットになることがよくあります)。参照の逆参照に関連するオーバーヘッドはわずかですが、JITコンパイラーは通常、繰り返しヒットするのではなく、一定量に最適化します。さらに、関数の内部または外部のいずれかで、いつかそれを逆参照する必要があります。スタックスペースを節約して、参照によってオブジェクトを渡すこともできます。

于 2012-08-16T18:25:14.953 に答える
2

getNamePlace(String,String)の代わりにを使用して追加のアドレスを渡しますgetNamePlace(Person)

Javaは、Personオブジェクトを渡すときにオブジェクトのコピーを作成しません。参照を渡します。

同様に、Javaは文字列を渡すときに文字列のコピーを作成しません。参照を渡します。

パフォーマンスに大きな違いがありますか?いいえ。

于 2012-08-16T18:26:20.163 に答える
2

時間と効率を考えると、それはまったく問題ではありません。

しかし、読みやすいコードを書きたいかどうかは重要です。-論理的に接続されたアイテムを、それらが表すオブジェクトとしてグループ化することは常に素晴らしいことです

例えば:

writeLetterTo(person);

それよりもはるかに優れています:

writeLetterTo(name, surname, address, city, country);

これらすべてのパラメータのみを何らかの方法で人物オブジェクトから取得できる場合。

もう一つの例:

addTwoPionts(x1, x2, y1, y2); // ugly
addTwoPoints(point1, point2); // far better 
于 2012-08-16T18:26:55.377 に答える
2

メソッドパラメータとは別に、微調整する必要のあることがいくつかあります。

public void getNamePlace(Person person){
    \\\\work here and get the name location in the method
}

習慣を正しくするために

  • getNamePlace何も返さない場合のメソッド名は、規則に準拠していません。getXXXX値を返す必要があります。
  • getNamePlaceが動作するのでPerson、クラス自体で定義する必要があり、パラメータを渡す必要はありません。
  • 最後にあなたの質問に答えるために、あなたはそのようなマイクロ最適化についてあまり気にするべきではないので、最初は言語学習グラフで...それはほとんど違いがありません。
于 2012-08-16T18:28:26.730 に答える
1

個人的にはあまり気になりません。パフォーマンスに本当に関心がある場合は、おそらく低水準言語の使用を検討する必要があります。他の人が言っているように、特に変数を渡すことに関しては、2つの間に実際にはパフォーマンスの違いはありません。

本当にパフォーマンスの問題が発生している場合は、パラメーターを渡す代わりに、コード内に速度が低下している場所が他にもたくさんあると思います。

于 2012-08-16T18:26:49.977 に答える