どちらを使用するか、intまたはInteger
-
05-07-2019 - |
質問
データベースから取得したレコードを保存するために使用するデータ転送オブジェクトを作成する必要があります。このデータ転送オブジェクトでは、数値フィールドを宣言する必要があります。どちらが良いか- int または整数
フィールドを整数として定義している場合、DBから2000個を超えるレコードを取得しようとすると、「整数」型のためにパフォーマンスに影響がありますか?
事前に感謝します。
解決
null
を処理できるため、 Integer
の方が適切なオプションです。 int
の場合、 resultSet.getInt(..)
が使用された場合、 null
はサイレントに 0
になります。そうしないと、「 null
をプリミティブプロパティに設定できません」などの例外がスローされる可能性があります。
パフォーマンスはここではほとんど関係ありません。
-
int
を選択すると、余分な処理コードが追加されます。そして、それはあなたにあまり利益をもたらさないでしょう。あなたのコードはきれいで単純ではなく、大量の定型コードではなく、パフォーマンスも向上しません。 - データベースの場合、nullはゼロとは異なります。場合によっては、
null
が意図されていた0
を入力することになります。ユーザーがフォームを送信し、int
に値を指定しなかった場合を想像してください。デフォルトでは0
になります。データベースでそのフィールドがnot null
である場合、それは理にかなっています、または実際にそうします。
他のヒント
実際には、パフォーマンスコストではなく、オブジェクトの実行に必要なものに基づいて決定する必要があります。プロファイラーで速度の問題が特定されたら、パフォーマンスに基づいて決定する必要があります-すべての悪とそのすべてのルート。
両方の機能のいくつかを見て、それをあなたの決定に使用してください、例えば
-
Integer
はnull
にすることができますが、int
はできません。 DB のint
はNullable
フィールドですか? -
Integer
クラスメソッドへのアクセスが必要ですか? - 算術をやっていますか
個人的に、私は常にラッパーよりもプリミティブを選択しています。しかし、それは技術的なメリットに基づいているのではなく、単に好みのものです。
私の考えでは、何かをintとして宣言するかIntegerとして宣言するかは、nullが有効な値であるかどうかによって決まります。オートボクシング(およびオートボックス化)は、数値が単に1つのタイプでなければならない変換の問題を処理します。 (指摘されているように)パフォーマンスも、ほとんどすべての場合に顕著になる可能性は低いです。
さらに、intは自然な選択である必要があり、それが問題である場合は最もパフォーマンスが高い可能性があります。 nullを格納できるようにする必要がある場合は、Integerを使用する が必要です(また、nullPointerExceptionが発生するため、単純にintを受け取るメソッドに対してnull参照が自動的にアンボックス化されないようにします) 。
Integer
は理論的には int
よりも遅くなりますが、数値を計算する場合を除き、パフォーマンスへの影響は最小限に抑える必要があります。また、JITの最適化により、パフォーマンスの低下が軽減されます。
プリミティブ型または参照型の観点から、状況により適したものを使用してください。
intは整数より10倍高速です
jetmパフォーマンスライブラリでこのコードをテストします
int n;
EtmPoint point1 = etmMonitor.createPoint("test:objects");
for (n = 0; n < 1000000; n++) {
Integer t = 0;
t = 10;
t = 11;
}
point1.collect();
EtmPoint point = etmMonitor.createPoint("test:primitives");
for (n = 0; n < 1000000; n++) {
int t = 0;
t = 10;
t = 11;
}
point.collect();
etmMonitor.render(new SimpleTextRenderer());
および結果:
test:objects 10.184
test:primitives 1.151
アイデアを得るために、2000 Integerはクエリに約0.5ミリ秒を追加します。このデータをシリアル化する必要がある場合は、さらに多くを追加できます。
ただし、正確性が最初になります。非常に速くても間違っているという意味はありません。 null値とその処理方法を考慮する必要があります。 (列がNOT NULLでない場合)Integer.MIN ___ VALUEを使用するか、intの代わりに long フィールドを使用して、nullにLong.MIN_VALUEを使用できます。 intよりも大きくても、Integerよりも何倍も小さく効率的です。
データベースにアクセスするために使用しているものに依存することは他にもあると思います。プレーンな古いJDBCを使用すると、 int
を使用できますが、ORMはそれらを静かに Integers
に変換できます。また、整数を使用すると、 null を処理できます。
int
は、ほとんどの計算でjavaによって使用されます。 Integer
は、プリミティブ配列を除くすべての形式のコレクションで使用されます。
ガベージコレクターをスラッシュで一時的な整数を大量に使用し、バックグラウンドでプロファイリングできないCPUを使用すると、すべての一般的なスローダウンが発生します。 1秒間に一時的に多くの一時ファイルが破棄されると、CGが「今すぐメモリが必要」という緊急事態に陥りますレイテンシが重要なアプリケーションでストールを引き起こす可能性のあるモード(リアルタイムインタラクティブグラフィックス、物理デバイスコントローラー、通信など)
だから私にとっては、数学を行わないネストされた呼び出しがたくさんありますが、マップのキーを使用するなど、多くのコレクションにアクセスする場合、引数が渡されたときに大量の自動ボクシングを避けるために整数を使用します。
演算が演算集約型であるか、ループカウンターまたはその他の演算指向演算として使用され、コレクション(プリミティブ配列以外)に格納されていない場合、プリミティブを使用します。同じことが、本格的なオブジェクトであるStringを除く他のすべてのプリミティブについても言えます。
toString
または(String)
を使用して int
を String
にキャストすることはできません。
Integer
は、 toString
または(String)
を使用して String
にキャストでき、 nullを処理できます。
。
null
の値を確認する場合は Integer
が最適ですが、整数を比較する場合はintの方が適している場合があります。次の例では、整数c = 1000とd = 1000を使用し、比較してfalseを返しますが、intの場合はtrueを返します。
public class IntegerCompare {
public static void main(String[] args) {
int a = 1000;
int b = 1000;
Integer c = 1000;
Integer d = 1000;
if (a == b) {
System.out.println("int Value Equals");
}
if (c == d) {
System.out.println("Integer value Equals");
} else {
System.out.println("Integer Value Not Equals");
}
}
}
カバーするシナリオの1つは検証です。
次のクラスがあると想像してください:
class Foo{
@Min(value = 10)
int val;
}
リクエストで val
の値をユーザーが指定しない場合、厄介な NumberFormatException
が発生します。
int
を Integer
に置き換えた場合、 @NotNull
を使用して、この問題をより適切に解決できます。