Int-Wert einer Ganzzahl erhöhen?


81

Wie erhöhe ich den Wert einer Ganzzahl in Java? Ich weiß, dass ich den Wert mit intValue abrufen und mit new Integer (int i) festlegen kann.

playerID.intValue()++;

scheint nicht zu funktionieren.

Hinweis: PlayerID ist eine Ganzzahl, die erstellt wurde mit:

Integer playerID = new Integer(1);

7
Warum verwenden Sie Ganzzahlen anstelle von Ints?
Amara

5
@naiad Für mich liegt das normalerweise daran, dass Sie in Java keine primitiven Typen als generische Argumente verwenden können.
Steve Blackwell

Antworten:


99

IntegerObjekte sind unveränderlich, daher können Sie den Wert nach ihrer Erstellung nicht mehr ändern. Sie müssen eine neue erstellen Integerund die vorhandene ersetzen.

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

4
Wenn Sie ein nicht-primitives int verwenden müssen und Veränderbarkeit wünschen, können Sie commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Joel

Danke, aber aus irgendeinem Grund wird es immer noch nicht erhöht. Vielleicht ist es ein Fehler in meinem Code ...
William

1
@ William: Wie ich weiß, wird es nur in der Methode erhöht, die es erhöht.
Stan Kurilin

13
Verwenden Sie nicht den Integer-Konstruktor.
ColinD

2
@Grodriguez: Vielleicht, obwohl ich selbst dann vorschlagen würde Integer.valueOf(int)... Ich mag die Idee, schlechte Praktiken überhaupt in Antworten zu verwenden, nicht, was dazu führen kann, dass die Leute denken, dass sie in Ordnung sind. Ich denke auch, dass es für das OP nützlich ist, zu erkennen, dass er Operationen, die er mit einem intmit verwenden würde, Integerauf die gleiche Weise verwenden kann.
ColinD

49

Wie Grodriguez sagt, sind IntegerObjekte unveränderlich. Das Problem hierbei ist, dass Sie versuchen, den intWert der Spieler-ID und nicht die ID selbst zu erhöhen. In Java 5+ können Sie einfach schreiben playerID++.

Rufen Sie niemals den IntegerKonstruktor auf. Nutzen Sie den Vorteil von Autoboxing nur durch die Zuweisung ints Integers direkt, wie Integer foo = 5. Dies wird Integer.valueOf(int)transparent verwendet, was dem Konstruktor überlegen ist, da nicht immer ein neues Objekt erstellt werden muss.


13

AtomicInteger

Vielleicht ist das auch etwas wert: Es gibt eine Java-Klasse namens AtomicInteger.

Diese Klasse verfügt über einige nützliche Methoden wie addAndGet(int delta)oder incrementAndGet()(und ihre Gegenstücke), mit denen Sie den Wert derselben Instanz erhöhen / verringern können. Obwohl die Klasse für die Verwendung im Kontext der Parallelität konzipiert ist , ist sie auch in anderen Szenarien sehr nützlich und entspricht wahrscheinlich Ihren Anforderungen.

final AtomicInteger count = new AtomicInteger( 0 ) ;

count.incrementAndGet();  // Ignoring the return value. 

12

Java 7 und 8. Inkrement Ändert die Referenz, sodass auf ein anderes Integer-Objekt verwiesen wird. Aussehen:

@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);
}

Ganzzahl an sich ist immer noch unveränderlich.


Dies ist meiner Meinung nach die beste Antwort, da sie die ++iFunktion (auf Variable i; beachten Sie, dass Sie auch geschrieben haben könnten i++) und die IntegerKlassenveränderlichkeit (auf Variable iOrig) demonstriert . Die meisten anderen Antworten zeigen nur einen der beiden Begriffe.
Julien Kronegg

7

Ganzzahlige Objekte sind unveränderlich. Sie können den Wert der vom Objekt selbst gehaltenen Ganzzahl nicht ändern, aber Sie können einfach ein neues Ganzzahlobjekt erstellen, um das Ergebnis zu speichern:

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

6

Für Java 7 funktioniert der Inkrementoperator '++' für Ganzzahlen. Unten finden Sie ein getestetes Beispiel

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13

2
Aber seien Sie sich bewusst, dass andere Verweise auf i = new Integer(12)immer noch verweisen 12, nicht 13... leicht zu stolpern
vikingsteve

1
Ja, deshalb müssen Sie den Wert dem ganzzahligen Objekt neu
zuweisen

2
i = i++ist nicht dasselbe wie i++. Technisch gesehen ++funktioniert das bei Ganzzahlen nicht wirklich, würde ich sagen, da Sie es nicht alleine verwenden können, ohne das Ergebnis etwas zuzuweisen.
Simon Forsberg

1
Sie müssen nicht neu zuweisen! Look: Integer foo = 5; Ganzzahliger Balken = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); Ausgänge: foo: 6 bar: 5
clemep

4

Vielleicht können Sie versuchen:

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

3

Sie können IntHolder als veränderbare Alternative zu Integer verwenden. Aber lohnt es sich?


1

Alle primitiven Wrapper-Objekte sind unveränderlich.

Ich bin vielleicht zu spät bei der Frage, aber ich möchte hinzufügen und klarstellen, dass, wenn Sie dies tun playerID++, wirklich so etwas passiert:

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

Integer.valueOf (int) speichert immer Werte im Bereich von -128 bis einschließlich 127 zwischen und kann andere Werte außerhalb dieses Bereichs zwischenspeichern.


1
playerID = Integer.valueOf (playerID.intValue () + 1); Ein neues Integer-Objekt wird nicht immer erstellt. Die Autoboxing-Spezifikation: docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 Wenn der Wert p, der eingerahmt wird, wahr, falsch, ein Byte oder ein Zeichen in der ist Bereich \ u0000 bis \ u007f oder eine int oder kurze Zahl zwischen -128 und 127 (einschließlich), dann seien r1 und r2 die Ergebnisse von zwei beliebigen Boxumrechnungen von p. Es ist immer so, dass r1 == r2. Seit Java 7 gilt docs.oracle.com/javase/specs/jls/se7/html/… auch für den ++
gary

Verstanden, Antwort bearbeitet. Das Inkrementieren des Integer-Objekts playerID++führt zu etwas ähnlichem playerID = Integer.valueOf( playerID.intValue() + 1)und gemäß den Dokumenten der Methode: Diese Methode speichert immer Werte im Bereich von -128 bis einschließlich 127 zwischen.
Hamza Belmellouki
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.