tutorial que interfaz grafica español ejemplos componentes java integer wrapper

java - que - ¿Cuántos objetos se crean utilizando la clase de contenedor Integer?



java swing tutorial pdf español (5)

El compilador desempaqueta los objetos Integer en int s para hacer aritmética con ellos llamando a intValue() en ellos, y llama a Integer.valueOf para Integer.valueOf los resultados int cuando se asignan a variables Integer , por lo que su ejemplo es equivalente a:

Integer i = Integer.valueOf(3); i = Integer.valueOf(i.intValue() + 1); Integer j = i; j = Integer.valueOf(i.intValue() + j.intValue());

La asignación j = i; es una asignación de referencia de objeto completamente normal que no crea objetos nuevos. No hace boxeo ni unboxing, y no es necesario ya que los objetos Integer son inmutables.

El método valueOf puede almacenar objetos en caché y devolver la misma instancia cada vez para un número en particular. Se requiere almacenar en caché las entradas −128 a +127. Para su número inicial de i = 3 , todos los números son pequeños y se garantiza su almacenamiento en caché, por lo que el número de objetos que deben crearse es 0 . Estrictamente hablando, valueOf puede almacenar en caché instancias perezosamente en lugar de tenerlas pregeneradas, por lo que el ejemplo aún podría crear objetos la primera vez, pero si el código se ejecuta repetidamente durante un programa, el número de objetos creados cada vez se aproxima en promedio 0.

¿Qué sucede si comienza con un número mayor cuyas instancias no se almacenarán en caché (por ejemplo, i = 300 )? Luego, cada llamada valueOf debe crear un nuevo objeto Integer , y el número total de objetos creados cada vez es 3 .

( O , tal vez todavía sea cero, o tal vez sean millones. Recuerde que los compiladores y las máquinas virtuales pueden reescribir el código por razones de rendimiento o implementación, siempre que su comportamiento no cambie de otra manera. Por lo tanto, podría eliminar el código anterior por completo si usted no use el resultado, o si intenta imprimir j , podría darse cuenta de que j siempre terminará con el mismo valor constante después del fragmento anterior y, por lo tanto, hará toda la aritmética en tiempo de compilación e imprimirá un valor constante. La cantidad real de trabajo realizado detrás de escena para ejecutar su código siempre es un detalle de implementación).

Integer i = 3; i = i + 1; Integer j = i; j = i + j;

¿Cuántos objetos se crean como resultado de las declaraciones en el código de muestra anterior y por qué? ¿Hay algún IDE en el que podamos ver cuántos objetos se crean (tal vez en un modo de depuración)?


En primer lugar: la respuesta que busca es 0 , como ya han mencionado otros.

Pero vamos un poco más profundo. Como Stephen mencionó, depende del tiempo que lo ejecutes. Debido a que el caché es realmente perezoso inicializado.

Si mira la documentación de java.lang.Integer.IntegerCache:

El caché se inicializa en el primer uso.

Esto significa que si es la primera vez que llamas a un número entero que realmente creas:

  • 256 objetos enteros (o más: ver más abajo)
  • 1 objeto para la matriz para almacenar los enteros
  • Ignoremos los objetos necesarios para almacenar la clase (y métodos / campos). De todos modos se almacenan en el metaespacio.

Desde la segunda vez que los llamas, creas 0 objetos.

Las cosas se ponen más divertidas una vez que haces que los números sean un poco más altos. Por ejemplo, con el siguiente ejemplo:

Integer i = 1500;

Las opciones válidas aquí son: 0, 1 o cualquier número entre 1629 y 2147483776 (esta vez solo contando los valores enteros creados. ¿Por qué? La respuesta se da en la siguiente oración de la definición de caché de enteros:

El tamaño del caché puede ser controlado por la opción -XX: AutoBoxCacheMax =.

Por lo tanto, en realidad puede variar el tamaño de la memoria caché que se implementa.

Lo que significa que puede alcanzar la línea anterior:

  • 1: nuevo objeto si su caché es menor que 1500
  • 0: nuevos objetos si su caché se ha inicializado antes y contiene 1500
  • 1629: nuevo (entero): objetos si su caché está configurada exactamente en 1500 y aún no se ha inicializado. Luego se crearán valores enteros de -128 a 1500.
  • Como en la oración anterior, alcanza cualquier cantidad de objetos enteros hasta: Integer.MAX_VALUE + 129, que es el mencionado: 2147483776.

Tenga en cuenta: esto solo está garantizado en Oracle / Open JDK (verifiqué las versiones 7 y 8)

Como puede ver, la respuesta completamente correcta no es tan fácil de obtener. Pero solo decir 0 hará felices a las personas.

PD: el uso del parámetro menthoned puede hacer que la siguiente declaración sea verdadera: Integer.valueOf(1500) == 1500


La respuesta estrictamente correcta es que el número de objetos Integer creados es indeterminado . Podría estar entre 0 y 3, o 256 1 o incluso más 2 , dependiendo de

  • la plataforma Java 3 ,
  • si esta es la primera vez que se ejecuta este código, y
  • (potencialmente) si otro código que se basa en el boxeo de valores int se ejecuta antes que 4 .

Los valores Integer para -128 a 127 no son estrictamente necesarios para ser precalculados . De hecho, JLS 5.1.7 que especificó la conversión de Boxeo dice esto:

Si el valor p encuadrado es un literal entero de tipo int entre -128 y 127 inclusive (§3.10.1) ... entonces deje que ayb sean los resultados de dos conversiones de p. Siempre es el caso que a == b.

Dos cosas a tener en cuenta:

  • El JLS solo requiere esto para >> literales <<.
  • El JLS no exige el almacenamiento en caché de los valores. El almacenamiento en caché diferido también satisface los requisitos de comportamiento de JLS.

Incluso el javadoc para Integer.valueof(int) no especifica que los resultados se almacenan en caché con entusiasmo.

Si examinamos el código fuente de Java SE para java.lang.Integer de Java 6 a 8, está claro que la estrategia actual de implementación de Java SE es calcular previamente los valores. Sin embargo, por varias razones (ver arriba), eso todavía no es suficiente para permitirnos dar una respuesta definitiva a la pregunta "cuántos objetos".

1 - Podría ser 256 si la ejecución del código anterior desencadena la inicialización de clase para Integer en una versión de Java donde el caché se inicializa ansiosamente durante la inicialización de clase.

2 - Podría ser aún más, si el caché es más grande de lo que requiere la especificación JVM. El tamaño de la memoria caché se puede aumentar mediante una opción JVM en algunas versiones de Java.

3 - Además del enfoque general de la plataforma para implementar el boxeo, un compilador podría detectar que parte o la totalidad del cálculo podría realizarse en tiempo de compilación o optimizarse por completo.

4 - Dicho código podría desencadenar una inicialización lenta o ansiosa de la memoria caché de enteros.


La respuesta, sorprendentemente, es cero.

Todos los números Integer de -128 a +127 son calculados previamente por la JVM.

Su código crea referencias a estos objetos existentes .


Puede depurar el método Integer.valueOf (int i) para descubrirlo usted mismo. El compilador llama a este método mediante el proceso de autoboxing.