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.
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.
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.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.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
?Integer
?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.
À 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).
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.
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
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.
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 int
s, tandis qu'un ORM pourrait les convertir silencieusement en Integers
de toute façon. Et Integer vous permettrait de gérer nulls .
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.
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");
}
}
}
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
.
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.