¿Incrementar el valor int de un entero?

81

¿Cómo incremento el valor de un entero en Java? Sé que puedo obtener el valor con intValue, y puedo configurarlo con new Integer (int i).

playerID.intValue()++;

no parece funcionar.

Nota: PlayerID es un número entero que se ha creado con:

Integer playerID = new Integer(1);
Guillermo
fuente
7
¿Por qué estás usando Integers en lugar de ints?
amara
5
@naiad Para mí, generalmente es porque no puede usar tipos primitivos como argumentos genéricos en Java.
Steve Blackwell

Respuestas:

100

Integerlos objetos son inmutables, por lo que no puede modificar el valor una vez que se han creado. Deberá crear uno nuevo Integery reemplazar el existente.

playerID = new Integer(playerID.intValue() + 1);
Grodriguez
fuente
4
Si debe usar un int no primitivo y desea mutabilidad, puede probar commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Joel
gracias, pero por alguna razón todavía no se incrementa. Tal vez sea un error en mi código ...
William
1
@William: Como sé, se incrementará solo en el método que lo incremente.
Stan Kurilin
13
No use el constructor de Integer.
ColinD
2
@Grodriguez: Quizás, aunque aún así sugeriría Integer.valueOf(int)... No me gusta la idea de usar malas prácticas en las respuestas en absoluto, puede llevar a la gente a pensar que está bien hacerlo. También creo que es útil para el OP darse cuenta de que puede usar las operaciones que usaría con un intwith Integery de la misma manera.
ColinD
49

Como dice Grodriguez, los Integerobjetos son inmutables. El problema aquí es que estás intentando incrementar el intvalor de la ID del jugador en lugar de la ID en sí. En Java 5+, puedes simplemente escribir playerID++.

Como nota al margen, nunca llame Integeral constructor. Aproveche el autoboxing simplemente asignando ints a Integers directamente, como Integer foo = 5. Esto se usará de forma Integer.valueOf(int)transparente, que es superior al constructor porque no siempre tiene que crear un nuevo objeto.

ColinD
fuente
13

Java 7 y 8. Increment SÍ cambia la referencia, por lo que hace referencia a otro objeto Integer. Mira:

@Test
public void incInteger()
{
    Integer i = 5;
    Integer iOrig = i;
    ++i; // Same as i = i + 1;
    Assert.assertEquals(6, i.intValue());
    Assert.assertNotEquals(iOrig, i);
}

El entero por sí solo sigue siendo inmutable.

vitvlkv
fuente
Esta es en mi humilde opinión la mejor respuesta, ya que demuestra la ++ifunción (en la variable i; tenga en cuenta que también podría haber escrito i++) y la Integerinmutabilidad de la clase (en la variable iOrig). La mayoría de las otras respuestas demuestran solo una de las dos nociones.
Julien Kronegg
13

AtomicInteger

Quizás esto también tenga algún valor: hay una clase Java llamada AtomicInteger.

Esta clase tiene algunos métodos útiles como addAndGet(int delta)o incrementAndGet()(y sus contrapartes) que le permiten incrementar / disminuir el valor de la misma instancia. Aunque la clase está diseñada para usarse en el contexto de concurrencia , también es bastante útil en otros escenarios y probablemente se ajuste a sus necesidades.

final AtomicInteger count = new AtomicInteger( 0 ) ;
…
count.incrementAndGet();  // Ignoring the return value. 
Vivit
fuente
7

Los objetos enteros son inmutables. No puede cambiar el valor del entero que tiene el objeto en sí, pero puede crear un nuevo objeto Integer para contener el resultado:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;
RHSeeger
fuente
6

Para Java 7, el operador de incremento '++' funciona en Integers. A continuación se muestra un ejemplo probado

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13
samsamara
fuente
2
Pero tenga en cuenta que otras referencias a i = new Integer(12)todavía se referirán a 12, no 13... es fácil tropezarse con esta
vikingsteve
1
sí, es por eso que tienes que reasignar el valor al objeto entero: i = i ++
samsamara
2
i = i++no es lo mismo que i++. Técnicamente, ++yo diría que no funciona en números enteros, ya que no se puede usar por sí solo sin asignar el resultado a algo.
Simon Forsberg
1
¡no tienes que reasignar! mirar: Integer foo = 5; Barra de enteros = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); salidas: foo: 6 bar: 5
clemep
4

Quizás puedas intentar:

final AtomicInteger i = new AtomicInteger(0);
i.set(1);
i.get();
fantouch
fuente
3

Puede usar IntHolder como alternativa mutable a Integer. ¿Pero vale la pena?

Stan Kurilin
fuente
1

Todos los objetos envoltorios primitivos son inmutables.

Quizás llegué tarde a la pregunta, pero quiero agregar y aclarar que cuando lo hace playerID++, lo que realmente sucede es algo como esto:

playerID = Integer.valueOf( playerID.intValue() + 1);

Integer.valueOf (int) siempre almacenará en caché los valores en el rango de -128 a 127, inclusive, y puede almacenar en caché otros valores fuera de este rango.

Hamza Belmellouki
fuente
1
playerID = Integer.valueOf (playerID.intValue () + 1); No siempre se crea un nuevo objeto Integer . La especificación de autoboxing: docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 Si el valor p que se encuadra es verdadero, falso, un byte o un carácter en el rango \ u0000 a \ u007f, o un número int o corto entre -128 y 127 (inclusive), entonces deje que r1 y r2 sean los resultados de dos conversiones de boxeo cualesquiera de p. Siempre es el caso de que r1 == r2. Desde Java 7, docs.oracle.com/javase/specs/jls/se7/html/… también se aplica al operador ++
gary
Entendido, respuesta editada. Incrementar el objeto Integer playerID++da como resultado algo similar playerID = Integer.valueOf( playerID.intValue() + 1)y de acuerdo con los documentos del método: este método siempre almacenará en caché los valores en el rango de -128 a 127, inclusive.
Hamza Belmellouki