269 votes

Quelle est la différence entre un int et un entier en Java et c# ?

J'étais simplement assis à mon local Frontières en sirotant un café et en lisant Plus de Joel sur le Logiciel (gratuit) quand je suis tombé sur Joel Spolsky de dire quelque chose sur un type particulier de programmeur de connaître la différence entre un int et un Entier en Java/C# (Langages de Programmation Orientés Objet).

Après un rapide " cerveau vérifier,' j'ai constaté à mon grand désarroi, que je ne connaissais pas la réponse.

251voto

Matt Points 2336

En Java, le " int " est de type primitif , alors que les 'Integer' type est un objet.

En C#, le " int "est le même que System.Int32 et est un type de valeur (c'est à dire plus comme la java "int"). Un entier (comme tous les autres types de valeur) peut être encadré ("enveloppé") dans un objet.


Les différences entre les objets et les primitives sont un peu au-delà de la portée de cette question, mais pour résumer:

Les objets de fournir des installations pour le polymorphisme, sont passés par référence (ou, plus exactement, ont des références passées par valeur), et sont allouées à partir du tas. A l'inverse, les primitives sont immuables types qui sont passés par valeur et sont souvent affectés de la pile.

153voto

cmcculloh Points 11040

Eh bien, en Java, un int est une primitive tandis qu'un nombre Entier est un Objet. Ce qui signifie, si vous faites un nouveau Entier:

Integer i = new Integer(6);

Vous pourriez l'appeler une méthode sur les i:

String s = i.toString();//sets s the string representation of i

Alors qu'avec un int:

int i = 6;

Vous ne pouvez pas appeler une méthode sur elle, parce que c'est simplement une primitive. Donc:

String s = i.toString();//will not work!!!

produirait une erreur, car l'int n'est pas un objet.

int est l'un des rares primitifs en Java (avec char et quelques autres). Je ne suis pas sûr à 100%, mais je pense que l'Entier de l'objet plus ou moins juste a un int de la propriété et de tout un tas de méthodes pour interagir avec cette propriété (comme la méthode toString() par exemple). Donc Entier est une façon élégante de travailler avec un int (tout comme peut-être la Chaîne de caractères est une façon élégante de travailler avec un groupe de caractères).

Je sais que Java n'est pas C, mais depuis je n'ai jamais programmé en C, c'est le plus proche que je pouvais venir à la réponse. Espérons que cette aide!

Objet Integer javadoc

Entier Ojbect vs int primitive de comparaison

40voto

Chris Jester-Young Points 102876

Je vais ajouter à l'excellent réponses données ci-dessus, et de parler de boxing et unboxing, et comment cela s'applique à la Java (bien que C# a trop). Je vais utiliser Java terminologie, parce que je suis plus au fait et avec qui.

Comme les réponses mentionnées, int n'est qu'un numéro (appelé le "unboxed" type), alors que l' Integer est un objet (qui contient le nombre, par conséquent, une boîte de type). En Java, que les moyens (à part de ne pas être capable d'appeler des méthodes sur int), vous ne pouvez pas stocker int ou à d'autres types d'objets dans les collections (List, Map, etc.). Afin de les stocker, vous devez d'abord cocher dans ses correspondants boxed de type.

De Java à partir de 5 avez quelque chose qui s'appelle l'auto-boxing et auto-unboxing qui permettent le boxing/unboxing être fait en coulisses. Comparer et de contraste: version de Java 5:

Deque<Integer> queue;

Java 1.4 ou plus tôt (pas de génériques):


Il doit être noté que, malgré la brièveté dans la version de Java 5, les deux versions générer identiques bytecode. Ainsi, bien que l'auto-boxing et de l'auto-unboxing est très pratique car vous écrire moins de code, ces opérations ne se passera derrière les coulisses, avec le même runtime coûts, de sorte que vous devez toujours être conscient de leur existence.

Espérons que cette aide!

29voto

Lasse V. Karlsen Points 148037

Je vais juste poster ici étant donné que certains des messages d'autres sont légèrement erroné par rapport à C#.

Correct: int est un alias pour le Système.Int32.
Faux: float n'est pas un alias pour le Système.Flotter, mais pour le Système.Unique

Fondamentalement, int est un mot clé réservé dans le langage de programmation C#, et est un alias pour le Système.Int32 type de valeur.

le flotteur et le Flotteur n'est pas le même cependant, comme le système de droit de type "float" est Système.Unique. Il y a des types comme ce qui a réservé des mots-clés qui ne semble pas correspondre au type de noms directement.

En C#, il n'y a pas de différence entre "int" et "le Système de.Int32", ou l'un des autres paires ou de mots clés/types de système, sauf lors de la définition des enums. Avec les énumérations, vous pouvez spécifier la taille de stockage à utiliser et, dans ce cas, vous ne pouvez utiliser le mot clé réservé, et non pas le système d'exécution de nom de type.

Si la valeur de l'int seront stockées sur la pile, dans la mémoire, ou comme un référencés tas d'objet dépend du contexte et de la façon dont vous l'utiliser.

Cette déclaration dans une méthode:

int i;

définit une variable i de type System.Int32, vivant dans un registre ou sur la pile, en fonction des optimisations. La même déclaration dans un type (struct ou class) définit un champ de membre. La même déclaration en argument d'une méthode de liste définit un paramètre, avec les mêmes options de stockage comme pour une variable locale. (notez que cet alinéa n'est pas valable si vous commencez à tirer itérateur méthodes dans le mélange, ce sont différents des bêtes au total)

Pour obtenir un tas d'objet, vous pouvez utiliser la boxe:

object o = i;

cela va créer un coffret copie du contenu de je sur le tas. IL vous pouvez accéder à des méthodes sur l'objet tas directement, mais en C# vous avez besoin de jeter en arrière pour un int, ce qui permettra de créer une autre copie. Ainsi, l'objet sur le tas ne peut être facilement changé en C# sans la création d'un nouveau coffret d'une nouvelle valeur int. (Oh, ce paragraphe n'a pas lu tout ce qu'facilement.)

21voto

andnil Points 8179

Concernant Java 1.5 et l'autoboxing , il est un important "caprice" qui vient de jouer lorsque l'on compare Entier des objets.

En Java, Entier des objets avec les valeurs de -128 à 127 sont immuables (qui est, pour un entier de valeur, dire 23, tout Entier objets instanciés par le biais de votre programme avec la valeur de 23 points à l' exact même objet).

Exemple, cela renvoie true:

Integer i1 = new Integer(127);

Tout ceci renvoie false:


L' == compare par référence (les variables pointent vers le même objet).

Ce résultat peut différer selon JVM vous utilisez. La spécification de l'autoboxing pour Java 1.5 exige que les entiers (-128 à 127) toujours à cocher pour le même objet wrapper.

Une solution? =) Il faut toujours utiliser un Entier.méthode equals() lorsque l'on compare Entier des objets.

Integer i2 = new Integer(127);

Plus d'infos au java.net Exemple à bexhuff.com

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X