Lequel utiliser, int ou Integer
-
05-07-2019 - |
Question
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 meilleur - int ou entier
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.
La solution
Entier
est une meilleure option, car elle peut gérer null
; pour int
, null
deviendrait 0
, silencieusement, si resultSet.getInt (..)
est utilisé. Sinon, une exception, telle que "Il est impossible de définir null
sur une propriété primitive", est générée.
La performance n’est guère préoccupante ici.
- si vous choisissez
int
, vous finirez par ajouter un code de traitement supplémentaire; et cela ne vous profiterait pas beaucoup. Votre code ne sera pas clair et net, beaucoup de code de plaque signalétique, 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 prévu. Imaginons le cas où l'utilisateur a soumis un formulaire et ne fournit aucune valeur pourint
. Vous finirez par obtenir0
par défaut. Cela a du sens, ou le fait vraiment, quand ce champ estpas null
dans la base de données.
Autres conseils
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 liés aux performances. Décider en fonction des performances devrait ê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 quelques-unes de leurs caractéristiques et utilisez-les pour prendre votre décision, par exemple
.-
Entier
peut êtrenull
,int
ne peut pas. Leint
dans la DB est-il un champNullable
? - Avez-vous besoin d'accéder aux méthodes de la classe
Integer
? - Faites-vous de l'arithmétique?
Personnellement, j'opte toujours pour la primitive sur le wrapper. Mais c’est juste une question de préférence, plutôt que de s’appuyer 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 être simplement d'un type ou d'un autre. Il est également peu probable que les performances (comme cela a été souligné) soient visibles 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 devez pouvoir stocker des valeurs NULL, vous devez utiliser Integer (et vous devez également vous assurer qu'aucune référence NULL n'est auto-décompactée pour une méthode prenant simplement des entiers, ce qui entraînera une exception NullPointerException). .
Entier
est théoriquement plus lent que int
, toutefois, l'impact sur les performances devrait être minime, sauf si vous calculez des chiffres. Les optimisations JIT réduiront également la perte de performances.
Utilisez celui qui convient le mieux à votre situation en termes de type primitif ou de type de 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 NULL 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 plusieurs fois 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 le faire avec des int
, alors qu'un ORM pourrait les convertir en silence en Entiers
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.
Utilisation de nombreux entiers temporaires avec thrash le ramasse-miettes et utilisation en arrière-plan d’un processeur non falsifiable qui entraînera des ralentissements généraux dans tous les domaines. Trop de temps temporaires détruits à la seconde feront que le CG entrera en urgence "J'ai besoin de mémoire maintenant". Mode pouvant 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 orientées mathématiques et ne sont pas 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.
int
ne peut pas être converti en String
avec toString
ou (String)
.
Entier
peut être converti en Chaîne
avec toString
ou (Chaîne)
et peut gérer null
.
Si vous souhaitez rechercher une valeur null
, alors Entier
est préférable, mais si vous souhaitez comparer l'entier, int peut être meilleur. Dans l'exemple suivant, j'utilise les nombres entiers c = 1000 et d = 1000 et le compare retourne false, mais dans le cas de int, ils retournent 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");
}
}
}
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 obtiendrons une vilaine NumberFormatException
.
Si int
est remplacé par Integer
, nous pouvons utiliser @NotNull
et résoudre ce problème plus gracieusement.