web-dev-qa-db-fra.com

Lequel utiliser, int ou Integer

Je dois créer un objet de transfert de données que je vais utiliser pour stocker les enregistrements extraits de la base de données. Dans cet objet de transfert de données, je dois déclarer un champ numérique. Pour ce que l'on est mieux - int ou Integer

Si je définis le champ comme Integer, cela aura-t-il un impact sur les performances en raison du type "Integer" si je vais extraire plus de 2000 enregistrements de DB!

Merci d'avance.

51
Veera

Integer est une meilleure option, car il peut gérer null; pour int, null deviendrait 0, silencieusement, si resultSet.getInt(..) est utilisé. Sinon, il pourrait générer une exception, par exemple "Impossible de définir null sur une propriété primitive".

La performance est peu préoccupante ici.

  • si vous choisissez int, vous ajouterez un code de traitement supplémentaire; et cela ne vous profiterait pas beaucoup. Votre code ne sera pas propre et simple, beaucoup de code de plaque chauffante, et vous ne gagneriez même pas de performance.
  • laissez-moi préciser, pour les bases de données, null n’est pas égal à zéro. Parfois, vous finissez par entrer 0, où null était voulu. Imaginons le cas où l'utilisateur a soumis un formulaire et ne fournit aucune valeur pour int. Vous finirez par obtenir 0 par défaut. Cela a du sens, ou le fait vraiment, quand ce champ est not null dans la base de données.
108
Adeel Ansari

Vous devriez vraiment prendre votre décision en fonction de ce que vous avez besoin que votre objet fasse, plutôt que des coûts de performance. Décider en fonction des performances doit être fait, une fois qu'un problème de vitesse a été identifié avec un profileur - la racine de tout le mal et de tout ça.

Examinez certaines des caractéristiques des deux et utilisez-les pour prendre votre décision, par exemple.

  • Integer peut être null, int ne peut pas. Alors, la int est-elle dans le champDBa Nullable?
  • Avez-vous besoin d'accéder aux méthodes de classe Integer?
  • Faites-vous de l'arithmétique?

Personnellement, j'opte toujours pour la primitive par rapport à l'emballage. Mais c'est juste une question de préférence, plutôt que basée sur un mérite technique.

18
tddmonkey

À mon avis, le choix entre déclarer quelque chose comme int ou Integer revient simplement à déterminer si null est une valeur valide pour cela ou non. La sélection automatique (et la boîte automatique) prennent en charge tous les problèmes de conversion dont le nombre doit simplement être d'un type ou d'un autre. Il est également peu probable que la performance (comme il a été souligné) soit perceptible dans presque tous les cas.

En outre, int devrait être le choix naturel, et sera probablement le plus performant si cela devait être un problème de toute façon. Si vous avez besoin de pouvoir stocker des valeurs null, vous devez utiliser Integer (et vous assurer également qu'aucune référence à une valeur null n'est automatiquement décompactée pour une méthode prenant simplement des entiers, car cela entraînerait une exception NullPointerException).

10
Andrzej Doyle

Integer est théoriquement plus lent que int; toutefois, l'impact sur les performances doit être minimal, sauf si vous calculez des chiffres De plus, les optimisations JIT réduiront la perte de performance.

Utilisez celui qui convient le mieux à votre situation en termes de type primitif ou de type référence.

5
Mehrdad Afshari

int est 10 fois plus rapide qu'un entier

nous testons ce code avec la bibliothèque de performances de 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());

et les résultats:
test: objets 10.184
test: primitives 1.151

4
Amine

Pour vous donner une idée, 2000 Integer ajouterait environ 0,5 ms à votre requête. Si vous devez sérialiser ces données, cela pourrait en ajouter un peu plus.

Cependant, la correction devrait venir en premier. Il ne sert à rien d'être très rapide mais faux. Vous devez tenir compte des valeurs nulles et de la façon dont vous les gérez. (Sauf si la colonne n'est PAS NULL) Vous pouvez utiliser Integer.MIN ___VALEUR ou un champ long au lieu de int et utiliser Long.MIN_VALUE pour null. Même s'il est plus grand que int, il serait quand même beaucoup plus petit et plus efficace qu'Integer.

2
Peter Lawrey

Je suppose que cela dépend entre autres de ce que vous utilisez pour accéder à la base de données. Avec un vieux JDBC simple, vous pourriez utiliser ints, tandis qu'un ORM pourrait les convertir silencieusement en Integers de toute façon. Et Integer vous permettrait de gérer nulls .

1
agnul

int est utilisé par Java pour la plupart des calculs. Integer est utilisé dans toutes les formes de collections, à l'exception des tableaux primitifs. 

en utilisant un grand nombre d'entiers temporaires avec thrash le ramasse-miettes et utilisez un processeur non-remplaçable en arrière-plan, ce qui provoquera des ralentissements généraux dans tous les domaines. Trop de temporaries supprimés à la seconde amèneront le CG à entrer en mode d'urgence "J'ai besoin de mémoire maintenant", ce qui peut provoquer des blocages dans les applications critiques en temps de latence (par exemple: graphiques interactifs en temps réel, contrôleurs de périphériques physiques ou communications)

Donc, pour moi, si j'ai beaucoup d'appels imbriqués qui ne font pas de calcul, mais accèdent à beaucoup de collections, telles que l'utilisation de clés pour les cartes, j'utilise Integer afin d'éviter des tonnes de boxing automatique lorsque des arguments sont passés.

Si les opérations nécessitent beaucoup de maths ou sont utilisées comme compteurs de boucles ou autres opérations à caractère mathématique et non stockées dans des collections (autres que des tableaux de primitives), j'utilise la primitive. Il en va de même pour toutes les autres primitives, à l'exception de String, qui est un objet à part entière.

1
peterk

Si vous voulez rechercher une valeur null, alors Integer est préférable, mais si vous souhaitez comparer l'entier, int peut être meilleur. Dans l'exemple suivant, j'utilise les entiers c = 1000 et d = 1000 et le compare avec false, mais dans le cas de int, ils renvoient 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 ne peut pas être converti en String avec toString ou (String).

Integer peut transformer en String avec toString ou (String) et il peut gérer null.

0
Deepak

Un scénario à couvrir serait la validation.

Imaginons que nous ayons la classe suivante:

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

Si l'utilisateur ne fournit pas de valeur pour val dans la demande, nous aurons une méchante NumberFormatException.

Si int est remplacé par Integer, nous pouvons utiliser @NotNull et résoudre ce problème plus gracieusement.

0
Ramanlfc