データベースから取得したレコードを保存するために使用するデータ転送オブジェクトを作成する必要があります。このデータ転送オブジェクトでは、数値フィールドを宣言する必要があります。どちらが良いか-intまたはInteger
フィールドを整数として定義している場合、DBから2000を超えるレコードを取得しようとすると、「整数」型のためにパフォーマンスに影響があります!?
前もって感謝します。
Integer
は、null
を処理できるため、より良いオプションです。 int
の場合、resultSet.getInt(..)
を使用すると、null
は0
になります。そうしないと、「null
をプリミティブプロパティに設定できません」などの例外がスローされる場合があります。
ここではパフォーマンスはほとんど重要ではありません。
int
を選択すると、余分な処理コードが追加されます。そして、それはあなたに多くの利益をもたらさないでしょう。あなたのコードはきれいで単純ではなく、大量の定型コードではなく、パフォーマンスも向上しません。null
が意図されていた0
と入力することになります。ユーザーがフォームを送信し、int
に値を指定しなかった場合を想像してください。デフォルトでは0
になります。データベースでそのフィールドがnot null
であるとき、それは理にかなっています、または本当にそうします。パフォーマンスコストではなく、オブジェクトの実行に必要なものに基づいて、実際に決定する必要があります。プロファイラーで速度の問題が特定されたら、パフォーマンスに基づいて決定する必要があります-すべての悪とそのすべての根源です。
両方の機能のいくつかを見て、それをあなたの決定に使用してください。
Integer
にはnull
を使用できますが、int
には使用できません。 [〜#〜] db [〜#〜] a int
フィールドのNullable
も同様ですか?Integer
クラスメソッドにアクセスする必要がありますか?個人的には、ラッパーよりも常にプリミティブを選択しています。しかし、それは技術的なメリットに基づいているのではなく、単に好みのものです。
私の考えでは、何かをintとして宣言するかIntegerとして宣言するかの選択は、nullが有効な値であるかどうかによって決まります。オートボクシング(およびオートアンボクシング)は、数値が単に1つのタイプでなければならない変換の問題を処理します。 (指摘されているように)パフォーマンスも、ほとんどすべての場合に気付かれることはほとんどありません。
その上、intは自然な選択であるべきであり、それがとにかく問題であるならば、最もパフォーマンスが高い可能性が高いです。 nullを保存できるようにする必要がある場合は、haveを使用して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を使用できます。整数よりも大きい場合でも、整数よりも何倍も小さく効率的です。
データベースにアクセスするために何を使用しているかによります。プレーンな古いJDBCを使用すると、int
sを使用できますが、ORMはとにかくそれらをIntegers
にサイレントに変換できます。また、Integerを使用するとnullsを処理できます。
int
は、ほとんどの計算でJavaによって使用されます。Integer
は、プリミティブ配列を除くすべての形式のコレクションで使用されます。
多くの一時整数をガベージコレクターにスラッシングして使用し、バックグラウンドでプロファイリング不可能なCPUを使用すると、すべての一般的なスローダウンが発生します。一時的に多くの一時ファイルがトラッシュされると、CGが緊急の「I need memory now」モードに入り、レイテンシが重要なアプリケーション(つまり、リアルタイムのインタラクティブグラフィックス、物理デバイスコントローラー、または通信)でストールを引き起こす可能性があります
したがって、数学ではなくネストされた呼び出しが多数あり、マップのキーを使用するなどの多くのコレクションにアクセスする場合、整数を使用して、引数が渡されるときに大量の自動ボクシングを回避します。
演算が演算集中型であるか、ループカウンターまたはその他の演算指向の演算として使用され、コレクション(プリミティブ配列以外)に格納されていない場合、プリミティブを使用します。同じことが、本格的なオブジェクトであるStringを除く他のすべてのプリミティブについても言えます。
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");
}
}
}
int
は、String
または(String)
を使用してtoString
にキャストできません。
Integer
は、String
または(String)
を使用してtoString
にキャストでき、null
を処理できます。
カバーする1つのシナリオは検証です。
次のクラスがあると想像してください:
class Foo{
@Min(value = 10)
int val;
}
ユーザーがリクエストでval
の値を提供しない場合、厄介なNumberFormatException
が返されます。
int
をInteger
に置き換えた場合、@NotNull
およびこの問題をより適切に解決します。