estaba leyendo Más Joel sobre software cuando me encontré con Joel Spolsky diciendo algo sobre un tipo particular de programador que sabía la diferencia entre anint
yInteger
en Java / C # (Lenguajes de programación orientados a objetos).
¿Entonces cuál es la diferencia?
Respuestas:
En Java, el tipo 'int' es primitivo, mientras que el tipo 'Integer' es un objeto.
En C #, el tipo 'int' es el mismo
System.Int32
y es un tipo de valor (es decir, más parecido al 'int' de java). Un entero (como cualquier otro tipo de valor) se puede encuadrar ("envolver") en un objeto.Las diferencias entre objetos y primitivas están algo más allá del alcance de esta pregunta, pero para resumir:
Los objetos proporcionan facilidades para el polimorfismo, se pasan por referencia (o más exactamente tienen referencias pasadas por valor) y se asignan desde el montón . Por el contrario, las primitivas son tipos inmutables que se pasan por valor y a menudo se asignan desde la pila .
fuente
Bueno, en Java un int es un primitivo, mientras que un entero es un objeto. Es decir, si hiciste un nuevo entero:
Podría llamar a algún método en i:
Mientras que con un int:
No puede invocar ningún método en él, porque es simplemente un primitivo. Entonces:
produciría un error, porque int no es un objeto.
int es una de las pocas primitivas en Java (junto con char y algunos otros). No estoy 100% seguro, pero estoy pensando que el objeto Integer más o menos solo tiene una propiedad int y un montón de métodos para interactuar con esa propiedad (como el método toString (), por ejemplo). Entonces Integer es una forma elegante de trabajar con un int (tal como String es una forma elegante de trabajar con un grupo de caracteres).
Sé que Java no es C, pero como nunca he programado en C, esto es lo más cerca que pude llegar a la respuesta. ¡Espero que esto ayude!
Objeto entero javadoc
Entero Ojbect versus comparación primitiva int
fuente
Agregaré a las excelentes respuestas dadas anteriormente, y hablaré sobre boxeo y unboxing, y cómo esto se aplica a Java (aunque C # también lo tiene). Usaré solo la terminología de Java porque estoy más au fait con eso.
Como se mencionó en las respuestas,
int
es solo un número (llamado tipo sin caja ), mientras queInteger
es un objeto (que contiene el número, por lo tanto, un tipo en caja ). En términos de Java, que los medios (aparte de no ser capaz de llamar a métodos enint
), no se puede almacenarint
o de otro tipo no-objeto en colecciones (List
,Map
, etc.). Para almacenarlos, primero debe encuadrarlos en su tipo encuadrado correspondiente.Java 5 en adelante tiene algo llamado auto-boxing y auto-unboxing que permite que el boxing / unboxing se realice detrás de escena. Comparar y contrastar: versión Java 5:
Java 1.4 o anterior (tampoco genéricos):
Cabe señalar que a pesar de la brevedad en la versión Java 5, ambas versiones generan un código de bytes idéntico. Por lo tanto, aunque la auto-boxeo y el auto-unboxing son muy convenientes porque se escribe menos código, estas operaciones hacen que sucede detrás de las escenas, con los mismos costes de tiempo de ejecución, por lo que aún tiene que estar al tanto de su existencia.
¡Espero que esto ayude!
fuente
Solo publicaré aquí, ya que algunas de las otras publicaciones son ligeramente inexactas en relación con C #.
Correcto:
int
es un alias paraSystem.Int32
.Incorrecto:
float
no es un alias paraSystem.Float
, sino paraSystem.Single
Básicamente, int es una palabra clave reservada en el lenguaje de programación C #, y es un alias para el
System.Int32
tipo de valor.Sin embargo, float y Float no son lo mismo, ya que el tipo de sistema correcto para ''
float
'' es System.Single. Hay algunos tipos como este que tienen palabras clave reservadas que no parecen coincidir directamente con los nombres de los tipos.En C # no hay diferencia entre ''
int
'' y ''System.Int32
'', o cualquiera de los otros pares o palabras clave / tipos de sistema, excepto cuando se definen enumeraciones. Con las enumeraciones, puede especificar el tamaño de almacenamiento a utilizar y, en este caso, solo puede usar la palabra clave reservada, y no el nombre del tipo de tiempo de ejecución del sistema.Ya sea que el valor en int se almacene en la pila, en la memoria o como un objeto de pila referenciado, depende del contexto y de cómo lo use.
Esta declaración en un método:
define una variable
i
de tipoSystem.Int32
, que vive en un registro o en la pila, según las optimizaciones. La misma declaración en un tipo (estructura o clase) define un campo miembro. La misma declaración en una lista de argumentos del método define un parámetro, con las mismas opciones de almacenamiento que para una variable local. (tenga en cuenta que este párrafo no es válido si comienza a introducir métodos iteradores en la mezcla, estas son bestias completamente diferentes)Para obtener un objeto de montón, puede usar el boxeo:
esto creará una copia en caja de los contenidos de
i
en el montón. En IL, puede acceder a los métodos en el objeto de almacenamiento dinámico directamente, pero en C # debe volver a convertirlo en un int, lo que creará otra copia. Por lo tanto, el objeto en el montón no se puede cambiar fácilmente en C # sin crear una nueva copia en caja de un nuevo valor int. (Uf, este párrafo no se lee tan fácilmente).fuente
Con respecto a Java 1.5 y el autoboxing, hay una "peculiaridad" importante que se juega cuando se comparan objetos Integer.
En Java, los objetos enteros con los valores -128 a 127 son inmutables (es decir, para un valor entero particular, digamos 23, todos los objetos enteros instanciados a través de su programa con el valor 23 apuntan exactamente al mismo objeto).
Ejemplo, esto devuelve verdadero:
Si bien esto devuelve falso:
El == se compara por referencia (las variables apuntan al mismo objeto).
Este resultado puede o no diferir según la JVM que esté utilizando. La especificación de autoboxing para Java 1.5 requiere que los enteros (-128 a 127) siempre encajen en el mismo objeto contenedor.
¿Una solución? =) Uno siempre debe usar el método Integer.equals () al comparar objetos Integer.
Más información en java.net Ejemplo en bexhuff.com
fuente
127
se obtiene desun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
En Java hay dos tipos básicos en la JVM . 1) Tipos primitivos y 2) Tipos de referencia. int es un tipo primitivo y Integer es un tipo de clase (que es un tipo de tipo de referencia).
Los valores primitivos no comparten estado con otros valores primitivos. Una variable cuyo tipo es un tipo primitivo siempre tiene un valor primitivo de ese tipo.
Un objeto es una instancia de clase creada dinámicamente o una matriz. Los valores de referencia (a menudo solo referencias) son punteros a estos objetos y una referencia nula especial, que no se refiere a ningún objeto. Puede haber muchas referencias al mismo objeto.
También en Java todo se pasa por valor. Con los objetos, el valor que se pasa es la referencia al objeto. Entonces, otra diferencia entre int e Integer en java es cómo se pasan en llamadas a métodos. Por ejemplo en
La variable dos se pasa como el entero primitivo tipo 2. Mientras que en
La variable dos se pasa como referencia a un objeto que contiene el valor entero 2.
@WolfmanDragon: Pasar por referencia funcionaría así:
Cuando se llama incremento, pasa una referencia (puntero) a la variable a . Y la función de incremento modifica directamente la variable a .
Y para los tipos de objetos funcionaría de la siguiente manera:
¿Ves la diferencia ahora?
fuente
En C #, int es solo un alias para
System.Int32
, cadena paraSystem.String
, doble paraSystem.Double
etc.Personalmente prefiero int, string, double, etc. porque no requieren una
using System;
declaración :) Una razón tonta, lo sé ...fuente
Hay muchas razones para usar clases de contenedor:
fuente
Esto ya ha sido respondido para Java, aquí está la respuesta de C #:
"Entero" no es un nombre de tipo válido en C # y "int" es solo un alias para System.Int32. Además, a diferencia de Java (o C ++) no hay ningún tipo primitivo especial en C #, cada instancia de un tipo en C # (incluido int) es un objeto. Aquí hay un código demostrativo:
fuente
int se usa para declarar la variable primitiva
Integer se usa para crear una variable de referencia de la clase Integer
fuente
En plataformas como Java, los
int
s son primitivos, mientras queInteger
es un objeto que contiene un campo entero. La distinción importante es que las primitivas siempre se transmiten por valor y, por definición, son inmutables.Cualquier operación que implique una variable primitiva siempre devuelve un nuevo valor. Por otro lado, los objetos se pasan por referencia. Se podría argumentar que el punto al objeto (también conocido como la referencia) también se pasa por valor, pero los contenidos no.
fuente
Una cosa más que no veo en las respuestas anteriores: en Java, se supone que las clases de envoltorios primitivos como Integer, Double, Float, Boolean ... y String son invariantes, de modo que cuando pasa una instancia de esas clases, se invoca El método no podría alterar sus datos de ninguna manera, en oposición con la mayoría de las otras clases, cuyos datos internos podrían ser alterados por sus métodos públicos. Para que esta clase solo tenga métodos 'getter', no 'setters', además del constructor.
En un programa de Java, los literales de cadena se almacenan en una porción separada de la memoria de almacenamiento dinámico, solo una instancia para el literal, para ahorrar memoria reutilizando esas instancias
fuente
¿alguna vez has programado antes? (int) es uno de los tipos primitivos que puedes configurar para tus variables (como char, float, ...).
pero Integer es una clase de contenedor que puede usar para realizar algunas funciones en una variable int (por ejemplo, convertirla en cadena o viceversa, ...), pero tenga en cuenta que los métodos en las clases de contenedor son estáticos para que pueda usarlos en cualquier momento sin crear una instancia de la clase Integer. como resumen:
x e y son variables de tipo int, pero y está envuelto por una clase Integer y tiene varios métodos que puede usar, pero en caso de que necesite llamar a algunas funciones de la clase contenedora Integer, puede hacerlo simplemente.
pero tenga en cuenta que tanto x como y son correctos, pero si desea usarlos solo como un tipo primitivo, use la forma simple (utilizada para definir x).
fuente
Java:
int
,double
,long
,byte
,float
,double
,short
,boolean
,char
- primitivas. Se utiliza para mantener los tipos de datos básicos admitidos por el idioma. Los tipos primitivos no forman parte de la jerarquía de objetos y no heredan Object. No se puede pasar por referencia a un método.Double
,Float
,Long
,Integer
,Short
,Byte
,Character
, YBoolean
, son de tipo envolturas, envasados enjava.lang
. Todos los envoltorios de tipo numérico definen constructores que permiten construir un objeto a partir de un valor dado, o una representación de cadena de ese valor. El uso de objetos puede agregar una sobrecarga incluso al más simple de los cálculos.A partir de JDK 5, Java ha incluido dos características muy útiles: autoboxing y autounboxing. Autoboxing / unboxing simplifica enormemente y optimiza el código que debe convertir los tipos primitivos en objetos, y viceversa.
Ejemplo de constructores:
Ejemplo de boxeo / unboxing:
Ejemplo de autoboxing / autounboxing:
El libro del PS Herbert Schildt fue tomado como referencia.
fuente
Una variable int contiene un valor entero con signo de 32 bits. Un número entero (con mayúscula I) contiene una referencia a un objeto de tipo entero (clase) o nulo.
Java lanza automáticamente entre los dos; de Integer a int cada vez que el objeto Integer ocurre como argumento para un operador int o se asigna a una variable int, o se asigna un valor int a una variable Integer. Este casting se llama boxeo / unboxing.
Si una variable entera que hace referencia a un valor nulo no está en caja, explícita o implícitamente, se genera una excepción NullPointerException.
fuente
Un int e Integer en Java y C # son dos términos diferentes que se usan para representar cosas diferentes. Es uno de los tipos de datos primitivos que se pueden asignar a una variable que puede almacenar exactamente. Un valor de su tipo declarado a la vez.
Por ejemplo:
¿Dónde
int
está el tipo de datos asignado al número de variable que contiene el valor siete? Entonces, anint
es simplemente un primitivo, no un objeto.Mientras que an
Integer
es una clase de contenedor para un tipo de datos primitivo que tiene métodos estáticos. Eso se puede usar como argumento de un método que requiere un objeto, mientras que int se puede usar como argumento de un método que requiere un valor entero, que se puede usar para la expresión aritmética.Por ejemplo:
fuente
En ambos lenguajes (Java y C #)
int
hay un entero con signo de 4 bytes.A diferencia de Java, C # proporciona valores enteros con y sin signo. Como Java y C # están orientados a objetos, algunas operaciones en estos lenguajes no se asignan directamente a las instrucciones proporcionadas por el tiempo de ejecución y, por lo tanto, deben definirse como parte de un objeto de algún tipo.
C # proporciona
System.Int32
cuál es un tipo de valor que utiliza una parte de la memoria que pertenece al tipo de referencia en el montón.Java proporciona
java.lang.Integer
cuál es un tipo de referencia que funcionaint
. Los métodos enInteger
lata no compilarse directamente para ejecutar tiempo instructions.So nos cuadro de un valor int para convertirlo en una instancia de Entero y utilizar los métodos que espera ejemplo de algún tipo (comotoString()
,parseInt()
,valueOf()
etc).En C #, la variable int se refiere al
System.Int32.Any
valor de 4 bytes en la memoria que se puede interpretar como un int primitivo, que se puede manipular mediante la instancia de System.Int32.So int es un alias paraSystem.Int32.When
usar métodos relacionados con enteros comoint.Parse()
,int.ToString()
etc. la LCFSystem.Int32
struct llamando a los métodos respectivos comoInt32.Parse()
,Int32.ToString()
.fuente
En Java, el
int
tipo es un tipo de datos primitivo, donde elInteger
tipo es un objeto.En C #, el
int
tipo también es un tipo de datos igual queSystem.Int32
. Uninteger
(como cualquier otro tipo de valor) se puede encuadrar ("envolver") en un objeto.fuente
En Java, int es un tipo de datos primitivo, mientras que Integer es una clase Helper, se usa para convertir un tipo de datos a otro.
Por ejemplo:
Los tipos de datos primitivos almacenan la memoria más rápida disponible donde la clase Helper es compleja y se almacena en la memoria heep.
referencia de "David Gassner" Java Essential Training.
fuente
"int" es un tipo de datos primitivo e "Integer" en Wrapper Class en Java. "Entero" puede usarse como argumento para un método que requiere un objeto, mientras que "int" puede usarse como argumento para un método que requiere un valor entero, que puede usarse para la expresión aritmética.
fuente
01. El entero puede ser nulo. Pero int no puede ser nulo.
02. Solo se pueden pasar valores de tipo Wrapper Classes a cualquier clase de colección.
(Clases de envoltura: booleana, carácter, byte, corto, entero, largo, flotante, doble)
¿Pero normalmente agregamos valores primitivos a la clase de colección? ¿Es correcto el punto 02?
Sí 02 es correcto, porque
autoboxing.
Luego 5 convertir como valor entero mediante autoboxing.
fuente
int
está predefinido en la función de biblioteca c # pero en java podemos crear objetos deInteger
fuente
(Versión Java) En palabras simples, int es primitivo e Integer es un objeto contenedor para int.
Un ejemplo de dónde usar Integer vs int, cuando desee comparar y la variable int nuevamente sea nula, arrojará un error.
fuente
En Java, según mi conocimiento, si usted aprende entonces, cuando escribe int a; entonces en java generic compilará código como
Integer a = new Integer()
. Entonces, según los genéricos,Integer
no se usa, peroint
se usa. así que hay tanta diferencia allí.fuente
int es un tipo de datos primitivo. Integer es una clase de contenedor. Puede almacenar datos int como objetos.
fuente
int es un tipo de datos primitivo, mientras que Integer es un objeto. Crear un objeto con Integer le dará acceso a todos los métodos disponibles en la clase Integer. Pero, si crea un tipo de datos primitivo con int, no podrá usar esos métodos incorporados y tendrá que definirlos usted mismo. Pero, si no desea ningún otro método y desea hacer que el programa sea más eficiente en la memoria, puede usar un tipo de datos primitivo porque crear un objeto aumentará el consumo de memoria.
fuente