web-dev-qa-db-ja.com

ダブルvsダブルインjava

重複の可能性:
Java:比較して異なるdoubleとDouble

私のラボの1つのサンプルJavaプログラムでは、Doubleパラメーターとdoubleパラメーターをそれぞれ取得する2つの異なるメソッドがあります。
引数を渡すときに、どのように区別しますか?

11
Mahmoud

まず、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"
23
Tom Cammann

Doubleができない場合、nullパラメータはdoubleにすることができます。

27
Maxim Shoustin

-doubleはプリミティブ型ですが、Doubleラッパーオブジェクトです。

-ラッパーオブジェクトの最も一般的な使用法の1つは、Collectionを使用することです。

例:

List<Double> d = new ArrayList<Double>();

-Java 5Autoboxingと呼ばれるメカニズムが導入されました2つを直接変換します。

例:

double d = 10.41;
Double wrapper = d;
3

Doubleは参照型で、doubleは値型です。

Doubleクラスは、プリミティブ型doubleの値をオブジェクトにラップします。 Double型のオブジェクトには、double型の単一のフィールドが含まれています。 " link

@Fessが述べたように、またDoubleは参照型であるため、nullにすることができます。

必要に応じて、.doubleValue()メソッドを使用してDoubleからdoubleに明示的に変換し、new Double(1.0)を使用してその逆を明示的に変換できます。

また、@ millimooseが言ったように:

X.valueOf()の代わりにnew X()を使用する必要があります。 valueOfメソッドは、メモリ使用量を減らすためにボクシングタイプをキャッシュできます。 (これがDoublesに対して行われるかどうかはわかりませんが、参加するのは良い習慣です。)」

1
Igor
// 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も呼び出されます。これは、dtypedoubleであるためです。 Doubleオブジェクトは箱から出されてdoubleになります。同じように、もしあなたが持っていたら:

Double d = 1.0;

次に、メソッドAが呼び出されます。これは、dのタイプがDoubleになるためです(double- literalはDoubleに自動ボックス化されます)。

1
arshajii

あなたが持っているのは メソッドのオーバーロード の例です。良い点は、コンパイラとJVMが、メソッドを呼び出すときに使用される引数のタイプに基づいて、正しいメソッドを自動的に選択することです。

0
matsev

Doubleはラッパークラスですが、doubleはc/c ++のようなプリミティブ型です。上で指摘したように、Doubleは主にジェネリックスで使用されますが、数値と適切なオブジェクトのカプセル化の両方が必要な場合にも役立ちます。ほとんどの場合、Doubleとdoubleは同じ意味で使用できます。

0
yungtrizzle