web-dev-qa-db-ja.com

どちらを使用するか、intまたはInteger

データベースから取得したレコードを保存するために使用するデータ転送オブジェクトを作成する必要があります。このデータ転送オブジェクトでは、数値フィールドを宣言する必要があります。どちらが良いか-intまたはInteger

フィールドを整数として定義している場合、DBから2000を超えるレコードを取得しようとすると、「整数」型のためにパフォーマンスに影響があります!?

前もって感謝します。

56
Veera

Integerは、nullを処理できるため、より良いオプションです。 intの場合、resultSet.getInt(..)を使用すると、null0になります。そうしないと、「nullをプリミティブプロパティに設定できません」などの例外がスローされる場合があります。

ここではパフォーマンスはほとんど重要ではありません。

  • intを選択すると、余分な処理コードが追加されます。そして、それはあなたに多くの利益をもたらさないでしょう。あなたのコードはきれいで単純ではなく、大量の定型コードではなく、パフォーマンスも向上しません。
  • データベースの場合、nullはゼロと同じではありません。場合によっては、nullが意図されていた0と入力することになります。ユーザーがフォームを送信し、intに値を指定しなかった場合を想像してください。デフォルトでは0になります。データベースでそのフィールドがnot nullであるとき、それは理にかなっています、または本当にそうします。
113
Adeel Ansari

パフォーマンスコストではなく、オブジェクトの実行に必要なものに基づいて、実際に決定する必要があります。プロファイラーで速度の問題が特定されたら、パフォーマンスに基づいて決定する必要があります-すべての悪とそのすべての根源です。

両方の機能のいくつかを見て、それをあなたの決定に使用してください。

  • Integerにはnullを使用できますが、intには使用できません。 [〜#〜] db [〜#〜] a intフィールドのNullableも同様ですか?
  • Integerクラスメソッドにアクセスする必要がありますか?
  • 算術をしていますか?

個人的には、ラッパーよりも常にプリミティブを選択しています。しかし、それは技術的なメリットに基づいているのではなく、単に好みのものです。

18
tddmonkey

私の考えでは、何かをintとして宣言するかIntegerとして宣言するかの選択は、nullが有効な値であるかどうかによって決まります。オートボクシング(およびオートアンボクシング)は、数値が単に1つのタイプでなければならない変換の問題を処理します。 (指摘されているように)パフォーマンスも、ほとんどすべての場合に気付かれることはほとんどありません。

その上、intは自然な選択であるべきであり、それがとにかく問題であるならば、最もパフォーマンスが高い可能性が高いです。 nullを保存できるようにする必要がある場合は、haveを使用してIntegerを使用します(また、これはNullPointerExceptionが発生するため、単純にintを取るメソッドに対してnull参照が自動的にアンボックス化されないようにします) 。

10
Andrzej Doyle

Integerは理論的にはintよりも遅くなりますが、数値を計算しない限り、パフォーマンスへの影響は最小限に抑える必要があります。また、JITの最適化により、パフォーマンスの損失が削減されます。

プリミティブ型または参照型の観点から、状況に合ったものを使用してください。

5
Mehrdad Afshari

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

4
Amine

アイデアを得るために、2000 Integerはクエリに約0.5ミリ秒を追加します。このデータをシリアル化する必要がある場合は、さらに多くを追加できます。

ただし、正確性が最初に来るはずです。非常に高速であるが間違っているという意味はありません。 null値とその処理方法を考慮する必要があります。 (列がNOT NULLでない場合)Integer.MIN ___ VALUEを使用するか、intの代わりにlongフィールドを使用して、nullにLong.MIN_VALUEを使用できます。整数よりも大きい場合でも、整数よりも何倍も小さく効率的です。

2
Peter Lawrey

データベースにアクセスするために何を使用しているかによります。プレーンな古いJDBCを使用すると、intsを使用できますが、ORMはとにかくそれらをIntegersにサイレントに変換できます。また、Integerを使用するとnullsを処理できます。

1
agnul

intは、ほとんどの計算でJavaによって使用されます。Integerは、プリミティブ配列を除くすべての形式のコレクションで使用されます。

多くの一時整数をガベージコレクターにスラッシングして使用し、バックグラウンドでプロファイリング不可能なCPUを使用すると、すべての一般的なスローダウンが発生します。一時的に多くの一時ファイルがトラッシュされると、CGが緊急の「I need memory now」モードに入り、レイテンシが重要なアプリケーション(つまり、リアルタイムのインタラクティブグラフィックス、物理デバイスコントローラー、または通信)でストールを引き起こす可能性があります

したがって、数学ではなくネストされた呼び出しが多数あり、マップのキーを使用するなどの多くのコレクションにアクセスする場合、整数を使用して、引数が渡されるときに大量の自動ボクシングを回避します。

演算が演算集中型であるか、ループカウンターまたはその他の演算指向の演算として使用され、コレクション(プリミティブ配列以外)に格納されていない場合、プリミティブを使用します。同じことが、本格的なオブジェクトであるStringを除く他のすべてのプリミティブについても言えます。

1
peterk

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");
        }
    }
}
0
Pankaj Singla

intは、Stringまたは(String)を使用してtoStringにキャストできません。

Integerは、Stringまたは(String)を使用してtoStringにキャストでき、nullを処理できます。

0
Deepak

カバーする1つのシナリオは検証です。

次のクラスがあると想像してください:

class Foo{
    @Min(value = 10)
    int val;
}

ユーザーがリクエストでvalの値を提供しない場合、厄介なNumberFormatExceptionが返されます。

intIntegerに置き換えた場合、@NotNullおよびこの問題をより適切に解決します。

0
Ramanlfc