重複の可能性:
Java:比較して異なるdoubleとDouble
私のラボの1つのサンプルJavaプログラムでは、Doubleパラメーターとdoubleパラメーターをそれぞれ取得する2つの異なるメソッドがあります。
引数を渡すときに、どのように区別しますか?
まず、2つのタイプの違いを理解する必要があります。 double
はプリミティブ型ですが、Double
はオブジェクトです。
以下のコードは、オーバーロードされたメソッドを示しています。これは、ラボのコードに似ていると思います。
void doStuff(Double d){ System.out.println("Object call"); }
void doStuff(double d){ System.out.println("Primitive call"); }
これらのメソッドを呼び出す方法はいくつかあります。
doStuff(100);
doStuff(200d);
doStuff(new Double(100));
これらの呼び出しは次のようになります。
"Primitive call"
"Primitive call"
"Object call"
Double
ができない場合、null
パラメータはdouble
にすることができます。
-double
はプリミティブ型ですが、Double
はラッパーオブジェクトです。
-ラッパーオブジェクトの最も一般的な使用法の1つは、Collection
を使用することです。
例:
List<Double> d = new ArrayList<Double>();
-Java 5Autoboxing
と呼ばれるメカニズムが導入されました2つを直接変換します。
例:
double d = 10.41;
Double wrapper = d;
Double
は参照型で、double
は値型です。
Double
クラスは、プリミティブ型doubleの値をオブジェクトにラップします。 Double型のオブジェクトには、double型の単一のフィールドが含まれています。 " link
@Fessが述べたように、またDouble
は参照型であるため、null
にすることができます。
必要に応じて、.doubleValue()
メソッドを使用してDouble
からdouble
に明示的に変換し、new Double(1.0)
を使用してその逆を明示的に変換できます。
また、@ millimooseが言ったように:
X.valueOf()
の代わりにnew X()
を使用する必要があります。valueOf
メソッドは、メモリ使用量を減らすためにボクシングタイプをキャッシュできます。 (これがDouble
sに対して行われるかどうかはわかりませんが、参加するのは良い習慣です。)」
// Method A
public static void foo(Double d) {...}
// Method B
public static void foo(double d) {...}
明らかに、Double
オブジェクトを渡すと、メソッドAが呼び出されます。つまり、次のようなものがある場合:
Double d = new Double(1.0);
さらに、doubleリテラルを渡すと、メソッドBが呼び出されます。面白いのは、
double d = new Double(1.0);
この場合、メソッドBも呼び出されます。これは、d
のtypeがdouble
であるためです。 Double
オブジェクトは箱から出されてdouble
になります。同じように、もしあなたが持っていたら:
Double d = 1.0;
次に、メソッドAが呼び出されます。これは、d
のタイプがDouble
になるためです(double
- literalはDouble
に自動ボックス化されます)。
あなたが持っているのは メソッドのオーバーロード の例です。良い点は、コンパイラとJVMが、メソッドを呼び出すときに使用される引数のタイプに基づいて、正しいメソッドを自動的に選択することです。
Doubleはラッパークラスですが、doubleはc/c ++のようなプリミティブ型です。上で指摘したように、Doubleは主にジェネリックスで使用されますが、数値と適切なオブジェクトのカプセル化の両方が必要な場合にも役立ちます。ほとんどの場合、Doubleとdoubleは同じ意味で使用できます。