web-dev-qa-db-ja.com

Javaのlong、double、byte、charの目的は何ですか?

だから私はJavaを学んでおり、質問があります。タイプintboolean、およびstringは、おそらくfloatを除いて、変数に関して必要なものすべてに適しているようです。数値に小数が必要な場合に使用できます。

私の質問は、longdoublebytecharなどの他のタイプは通常の日常的なプログラミングで使用されていますか?これらを使用できる実用的なものは何ですか?それらは何のために存在しますか?

46
Click Upvote

「ショート」の例外を除いて、これはおそらくスペースの浪費の少しですが、時には文字通り、彼らはすべてコースの馬です:

  • 小数を必要とせず、他に何かを使用する理由がない場合は、intを使用します。ほとんどのプロセッサ/ OS構成では、これはマシンが最も効率的に処理できる数のサイズです。
  • 小数が必要で、他に何かを使用する理由がない場合は、doubleを使用します。
  • charを使用して、文字(または2バイトの符号なし算術が必要なまれなケース)を表現したい場合。
  • signedバイトを操作する必要がある場合(まれ!)、または移動する必要がある場合は、byteを使用します。 ブロックバイト数;
  • 単純な「yes/no」フラグが必要な場合は、booleanを使用します。
  • longを使用します。整数が必要であるが、大きさが20億を超える可能性がある場合(ファイルサイズ、ミリ秒/ナノ秒単位の時間測定、いくつかのデータを単一の数値に圧縮する高度な用途);
  • floatを使用するのは、(a)のいずれかが巨大な数字を保存し、メモリの節約がまたは(b)大量の計算を実行しており、精度が低下する可能性があります。ほとんどのアプリケーションでは、「float」の精度は非常に劣りますが、操作は2倍高速になる可能性があります。ただし、実際にそうなっていることを確認するには、プロセッサでテストする価値があります。 [*]
  • 2バイトの符号付き算術演算が本当に必要な場合は、shortを使用します。そんなに多くはありません...

[*]たとえば、Pentiumアーキテクチャのホットスポットでは、f loatとdoubleの操作は通常、正確に同じ時間を要します (除算を除く)。

本当に理解しない限り、これらの型のメモリ使用量に行き詰まってはいけません。例えば:

  • すべてのオブジェクトサイズはホットスポットで16バイトに丸められます。したがって、1バイトフィールドを持つオブジェクトは、1バイトオブジェクトを持つ1つのオブジェクトとまったく同じスペースを占有します。ロングフィールドまたはダブルフィールド。
  • メソッドにパラメーターを渡す場合、すべてのタイプがスタック上で4または8バイトを占有します:メソッドパラメーターを変更しても何も保存されません。たとえば、intへのint! (人々がこれを行うのを見てきました...)

明らかに、特定のAPI呼び出し(たとえば、何らかの理由で浮動小数点数を使用するCPU集約型ではないタスクのさまざまな呼び出し)があり、要求する型を渡すだけです...!

Stringはプリミティブ型ではないため、実際にはこのリストに属していません。

114
Neil Coffey

A Java intは32ビット、longは64ビットであるため、2 ^ 31より大きい整数を表現する必要がある場合、longは友達です。longの典型的な使用例、System.currentTimeMillis()を参照

バイトは8ビットであり、最新のハードウェアで最も小さいアドレス可能なエンティティであるため、ファイルからバイナリデータを読み取るときに必要です。

Doubleにはfloatの2倍のサイズがあるため、サイズや速度に制限がなく、floatに十分な容量がある場合を除き、通常はfloatではなくdoubleを使用します。

ショートは2バイト、16ビットです。私の意見では、これは最も必要なデータ型ではなく、実際のコードでは実際には見ていませんが、バイナリファイル形式の読み取りや低レベルのネットワークプロトコルの実行に役立つ可能性があります。たとえば、IPポート番号は16ビットです。

Charは単一の文字、つまり16ビットを表します。これはshortと同じサイズですが、shortは符号付き(-32768〜32767)で、charは符号なし(0〜65535)です。 (これは、IPポート番号がおそらくショートよりも文字としてより正確に表されることを意味しますが、これは文字の意図された範囲外にあるようです...)

これらの詳細に関する本当に信頼できるソースについては、 Java言語仕様 を参照してください。

18
Rolf Rander

Javaのプリミティブ型について here を見ることができます。

これらのタイプ間の主な関心事は、メモリ使用量です。たとえば、intは32ビットを使用し、byteは8ビットのみを使用します。

大きな構造(配列、行列など)で作業している場合、メモリ使用量を削減するために、使用している型をより適切に処理することを想像してください。

3
Romain Linsolas

そのようなタイプにはいくつかの目的があると思います。

1)格納できる変数のサイズ(および符号)に制限を課します。

2)コードを少し明確にすることができます(たとえば、charを使用する場合、コードを読んでいる人は、コードに何を保存するかを知っています)。

3)メモリを節約できます。すべてが符号なしで256未満の大きな数の配列がある場合、intの配列を宣言した場合と比較して、バイトの配列として宣言して、メモリを節約できます。

4)格納する必要がある数値が2 ^ 32よりも大きく、非常に大きな浮動小数点数の場合はdoubleである場合、長い時間が必要です。

3
Ben

整数は、一般的に数値に使用する必要があります。
Doublesは、小数を表すために使用される基本的なデータ型です。
Stringsは基本的にどのデータ型も保持できますが、intを使用する方が簡単で、テキスト以外の文字列を使用すると混乱します。
Charsは、1つの文字のみを保持する場合に使用されますが、本質的には明確にするためだけです。
ショート、ロング、フロートは必要ないかもしれませんが、たとえば、サイズ1,00000の配列を作成する場合1,000未満の数字を保持するだけでよい場合は、スペースを節約するために、ショートパンツを使用します。

0
Ben Bowles

プリミティブデータ型は、すべての複雑なコレクションの基礎であるため必要です。

long、double、byteなどは、小さな整数(または何でも)が必要な場合に使用され、ヒープスペースを無駄にしません。

私たちの時代には十分なRAMがありますが、無駄にしないでください。

データベースとストリームの操作には「小さなもの」が必要です。

0
guerda