Quelle est la différence entre Integer et int en Java?

248

Par exemple, pourquoi pouvez-vous faire:

int n = 9;

Mais non:

Integer n = 9;

Et vous pouvez faire:

Integer.parseInt("1");

Mais non:

int.parseInt("1");
mino
la source
35
entier est une classe, int est un type primitif
Anycorn
24
Vous pouvez le faire en Integer n = 9;raison de l'autoboxing (à moins que vous n'utilisiez une très ancienne version de java)
Alderath

Réponses:

320

intest un type primitif. Les variables de type intstockent la valeur binaire réelle de l'entier que vous souhaitez représenter. int.parseInt("1")n'a pas de sens car intn'est pas une classe et n'a donc aucune méthode.

Integerest une classe, pas différente des autres dans le langage Java. Les variables de type Integerstockent les références aux Integerobjets, comme avec tout autre type de référence (objet). Integer.parseInt("1")est un appel à la méthode statique parseIntde la classe Integer(notez que cette méthode retourne en fait un intet non un Integer).

Pour être plus précis, Integerc'est une classe avec un seul champ de type int. Cette classe est utilisée là où vous avez besoin d'un intpour être traité comme n'importe quel autre objet, comme dans les types génériques ou les situations où vous avez besoin de nullabilité.

Notez que chaque type primitif en Java a une classe wrapper équivalente :

  • byte a Byte
  • short a Short
  • int a Integer
  • long a Long
  • boolean a Boolean
  • char a Character
  • float a Float
  • double a Double

Les classes wrapper héritent de la classe Object et les primitives non. Il peut donc être utilisé dans des collections avec référence Object ou avec des génériques.

Depuis java 5, nous avons une autoboxing, et la conversion entre la classe primitive et la classe wrapper se fait automatiquement. Attention cependant car cela peut introduire des bugs subtils et des problèmes de performances; être explicite sur les conversions ne fait jamais de mal.

Darkhogg
la source
6
Dans C#tous les types de données ont des "alias" et ont du int.Parse()sens (même si ce n'est vraiment pas le cas)
Vahid Amiri
22
@ VSG24 ... mais c'était une question Java, et c'est une réponse Java. C#est complètement hors de propos ici.
Darkhogg
3
Un bon exemple pourrait être: Erreur de compilation: Liste <int> Valide: Liste <Integer>
hagai
Des connaissances supplémentaires bénéficient toujours
sumit sharma
1
J'aime apprendre de nouvelles choses, surtout lorsque les connaissances sont liées au sujet actuel. Merci Vahid.
Paul Oliver
30

Integer est une classe et int est un type primitif.

Lisez ces liens:

Matjaz Muhic
la source
1
Je tiens à souligner, je pense que c'est la réponse parfaite pour deux raisons: 1- Concis et précis, en gardant le public / demandeur à l'esprit 2- Fournit des directives pour des détails supplémentaires plutôt que de tout mettre dans le texte de la réponse Pas tous il est possible de répondre aux questions avec précision et concision (certaines nécessitent beaucoup plus de détails et de nuances pour être exactes et complètes), mais je pense que toutes les réponses devraient essayer d'être aussi simples et directes.
DRich
11
Hé, je pense que c'est en fait le contraire. "int est un type primitif" ne vous dit rien, si vous ne savez pas ce qu'est un type primitif. (Et si vous le faites, vous connaissez déjà très probablement la différence entre int et Integer). Et l'envoi du lecteur à deux liens étiquetés "Lien 1" et "Lien 2" est assez inutile, surtout par rapport à la simple citation des sections pertinentes.
Steve Bennett
7

Un entier est à peu près juste un wrapper pour le type primitif int. Il vous permet d'utiliser toutes les fonctions de la classe Integer pour vous faciliter la vie un peu.

Si vous débutez avec Java, vous devez apprendre à apprécier la documentation Java. Par exemple, tout ce que vous voulez savoir sur la classe entière est documenté en détail.

Ceci est directement issu de la documentation de la classe Integer:

La classe Integer encapsule une valeur de type primitif int dans un objet. Un objet de type Integer contient un seul champ dont le type est int.

Nadir Muzaffar
la source
7
Cela manque un peu le sujet. Par exemple, comme Integerc'est une classe, elle peut être stockée dans des conteneurs (contrairement aux types primitifs).
Oliver Charlesworth
6

Une variable int contient une valeur entière signée 32 bits. Un Integer (avec un I majuscule) contient une référence à un objet de type (class) Integer, ou à null.

Java jette automatiquement entre les deux; de Integer à int chaque fois que l'objet Integer apparaît comme argument d'un opérateur int ou est affecté à une variable int, ou qu'une valeur int est affectée à une variable Integer. Ce casting est appelé boxe / unboxing.

Si une variable Integer faisant référence à null n'est pas mise en boîte, explicitement ou implicitement, une NullPointerException est levée.

(Dans le texte ci-dessus, le terme "variable" signifie variable locale, champ ou paramètre)

Bartłomiej Semańczyk
la source
5

Integer fait référence au type de wrapper en Java alors que int s'agit d'un type primitif. Tout sauf les types de données primitifs en Java est implémenté comme des objets qui impliquent que Java est un langage de programmation orienté objet pur et hautement qualifié. Si vous en avez besoin, tous les types de primitives sont également disponibles en tant que types d'encapsuleur en Java. Vous pouvez avoir des avantages en termes de performances avec les types primitifs, et les types d'encapsuleur ne doivent donc être utilisés que lorsque cela est nécessaire.

Dans votre exemple comme ci-dessous.

Integer n = 9;

la constante 9est mise en boîte automatique ( auto-boxinget unboxingse produit automatiquement à java 5partir de) Integeret vous pouvez donc utiliser l'instruction ainsi et aussi Integer n = new Integer(9). Ceci est effectivement réalisé grâce à la déclarationInteger.valueOf(9).intValue();

Lion
la source
3

int est un type primitif et non un objet. Cela signifie qu'aucune méthode n'y est associée. Entier est un objet avec des méthodes (comme parseInt).

Avec le java plus récent, il existe des fonctionnalités de boxe automatique (et de déballage). Cela signifie que le compilateur insérera Integer.valueOf (int) ou integer.intValue () si nécessaire. Cela signifie qu'il est en fait possible d'écrire

Integer n = 9;

qui est interprété comme

Integer n = Integer.valueOf(9);
Roger Lindsjö
la source
3

Integer est une classe / objet wrapper et int est de type primitif. Cette différence joue un rôle énorme lorsque vous souhaitez stocker des valeurs int dans une collection, car elles acceptent uniquement les objets en tant que valeurs (jusqu'à jdk1.4). JDK5 à partir de l'autoboxing, c'est une toute autre histoire.

kosa
la source
5
JDK5 + accepte également uniquement les objets; c'est juste que l'autoboxing permet au compilateur d'appeler automatiquement Integer.valueOf(i)ou Integer.intValue()pour vous. Collection<int>ne fonctionnera toujours pas. Ce n'est donc pas une histoire complètement différente - c'est la même histoire, avec juste un peu de sténographie.
yshavit
D'accord. Désolé, ma formulation pourrait ne pas refléter cela.
kosa
3

En Java, int est un type de données primitif tandis que Integer est une classe d'assistance, il est utilisé pour convertir un type de données en un autre.

Par exemple:

         double doubleValue = 156.5d;
         Double doubleObject  = new Double(doubleValue);
         Byte myByteValue = doubleObject.byteValue ();
         String myStringValue = doubleObject.toString();

Les types de données primitifs stockent la mémoire disponible la plus rapide où la classe Helper est complexe et sont stockés dans la mémoire de tas.

référence de "David Gassner" Java Essential Training.

Aqeel Haider
la source
2

intest un type primitif qui représente un entier. alors que Integerest un objet qui enveloppe int. L' Integerobjet vous donne plus de fonctionnalités, telles que la conversion en hexadécimal, chaîne, etc.

Vous pouvez également utiliser les concepts de POO avec Integer. Par exemple, vous pouvez utiliser Integer pour les génériques (ie ).Collection<Integer>

SP
la source
2

Ceci est tiré de Java: The Complete Reference, Ninth Edition

Java utilise des types primitifs (également appelés types simples), tels que int ou double , pour contenir les types de données de base pris en charge par le langage. Des types primitifs , plutôt que des objets, sont utilisés pour ces quantités dans un souci de performance . L'utilisation d'objets pour ces valeurs ajouterait une surcharge inacceptable aux calculs les plus simples. Ainsi, les types primitifs ne font pas partie de la hiérarchie des objets et ils n'héritent pas d'Object .

Malgré l'avantage de performance offert par les types primitifs, il y a des moments où vous aurez besoin d'une représentation d'objet. Par exemple, vous ne pouvez pas passer un type primitif par référence à une méthode . De plus, de nombreuses structures de données standard implémentées par Java fonctionnent sur des objets, ce qui signifie que vous ne pouvez pas utiliser ces structures de données (spécifiques à un objet) pour stocker des types primitifs . Pour gérer ces situations (et d'autres), Java fournit des wrappers de type, qui sont des classes qui encapsulent un type primitif dans un objet.

Les classes Wrapper sont directement liées à la fonction de mise en boîte automatique de Java . Les wrappers de type sont Double, Float, Long, Integer, Short, Byte, Character et Boolean . Ces classes offrent un large éventail de méthodes qui vous permettent d'intégrer pleinement les types primitifs dans la hiérarchie d'objets Java.

Teoman shipahi
la source
1

Pour optimiser l'exécution du code Java, int des types primitifs ont été ajoutés, y compris float, booletc., mais ils sont accompagnés de classes wrapper afin que, si nécessaire, vous pouvez les convertir et les utiliser comme objet Java standard avec de nombreux utilitaires fournis en tant que membre. fonctions (telles que Integer.parseInt("1")).

anand
la source
1

intest un type de données primitif alors qu'il Integers'agit d'un type de référence ou d'encapsuleur (classe) en Java.

après java 1.5qui introduisent le concept de autoboxing et unboxing vous pouvez initialiser les deux intou Integercomme celui - ci.

int a= 9
Integer a = 9 // both valid After Java 1.5.

pourquoi Integer.parseInt("1");mais pas int.parseInt("1");??

Integerest une classe définie dans la jdkbibliothèque et parseInt()est une méthode statique appartient à la Integerclasse

Donc, Integer.parseInt("1");c'est possible en Java. mais intest de type primitif (supposez comme un mot-clé) en java. Vous ne pouvez donc pas appeler parseInt()avec int.

Vikrant Kashyap
la source