整数のint値をインクリメントしますか?


81

Javaで整数の値をインクリメントするにはどうすればよいですか?intValueで値を取得でき、new Integer(int i)で設定できることはわかっています。

playerID.intValue()++;

動作しないようです。

注:PlayerIDは、次のもので作成された整数です。

Integer playerID = new Integer(1);

7
なぜintの代わりに整数を使用しているのですか?
amara 2010

5
@naiad私にとっては、通常、Javaでプリミティブ型をジェネリック引数として使用できないためです。
スティーブブラックウェル2015

回答:


100

Integerオブジェクトは不変であるため、一度作成した値を変更することはできません。新しいものを作成しInteger、既存のものを置き換える必要があります。

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

4
非プリミティブintを使用する必要があり、可変
Joel

ありがとう、しかし何らかの理由でそれはまだ増加していません。多分それは...私のコードのバグだ
ウィリアム・

1
@William:私が知っているように、それはそれをインクリメントするメソッドでのみインクリメントされます。
スタンクリリン2010

13
Integerのコンストラクターは使用しないでください。
ColinD 2010

2
@Grodriguez:たぶん、それでも私は提案したいのInteger.valueOf(int)ですが...答えに悪い習慣を使うという考えはまったく好きではありませんが、それは人々が彼らが大丈夫だと思うことにつながる可能性があります。私はまた、OPは、彼が彼が使用したい操作を使用することができることを実現することが有用だと思うintInteger同じように。
ColinD 2010

49

Grodriguezが言うように、Integerオブジェクトは不変です。ここでの問題はint、ID自体ではなくプレーヤーIDの値をインクリメントしようとしていることです。Java 5以降では、と書くだけplayerID++です。

補足として、Integerのコンストラクターを呼び出さないでください。のように、intsをIntegersに直接割り当てるだけで、オートボクシングを活用できInteger foo = 5ます。これはInteger.valueOf(int)透過的に使用されます。これは、常に新しいオブジェクトを作成する必要がないため、コンストラクターよりも優れています。


13

Java 7および8。インクリメントは参照を変更するため、別の整数オブジェクトを参照します。見てください:

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

整数自体は依然として不変です。


これは、++i関数(変数上ii++同様に記述できることに注意してください)とIntegerクラスの不変性(変数上iOrig)を示しているため、IMHOのベストアンサーです。他のほとんどの回答は、2つの概念のうちの1つだけを示しています。
Julien Kronegg 2018

13

AtomicInteger

多分これも価値があります:と呼ばれるJavaクラスがありますAtomicInteger

このクラスには、addAndGet(int delta)or incrementAndGet()(およびその対応物)のような便利なメソッドがいくつかあり、同じインスタンスの値をインクリメント/デクリメントできます。このクラスは並行性のコンテキストで使用するように設計されていますが、他のシナリオでも非常に役立ち、おそらくニーズに適合します。

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

7

整数オブジェクトは不変です。オブジェクト自体が保持する整数の値を変更することはできませんが、結果を保持する新しいIntegerオブジェクトを作成することはできます。

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

6

Java 7の場合、インクリメント演算子「++」は整数で機能します。以下はテストされた例です

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

2
しかし、他の参照i = new Integer(12)はまだ参照していることに注意してください...これに1213
つまずくのは

1
そういうわけで、値を整数オブジェクトに再割り当てする必要があります。i= i ++
samsamara 2016年

2
i = i++と同じではありませんi++。技術的には++、結果を何かに割り当てずに単独で使用することはできないため、整数では実際には機能しません。
Simon Forsberg 2017年

1
再割り当てする必要はありません!見てください:整数foo = 5; 整数バー= foo; foo ++; System.out.println( "foo:" + foo + "bar:" + bar); 出力:foo:6 bar:5
clemep 2018

4

多分あなたは試すことができます:

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

3

整数の変更可能な代替手段としてIntHolderを使用できます。しかし、それは価値がありますか?


1

すべてのプリミティブラッパーオブジェクトは不変です。

私はおそらく質問に遅れていますがplayerID++、あなたがそうするとき、実際に起こることは次のようなものであることを追加して明確にしたいです:

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

Integer.valueOf(INT)は、範囲内で常にキャッシュ値-128〜127意志含め、そしてよいこの範囲外の他の値をキャッシュします。


1
playerID = Integer.valueOf(playerID.intValue()+ 1); 新しい整数オブジェクトが常に作成されると限りません。オートボクシングの仕様:docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 ボックス化される値pがtrue、false、byte、またはcharの場合\ u0000から\ u007fの範囲、または-128から127(両端を含む)の整数または短い数値の場合、r1とr2をpの任意の2つのボクシング変換の結果とします。r1 == r2の場合は常にそうです。Javaの7以来、docs.oracle.com/javase/specs/jls/se7/html/...も++演算子に適用される
ゲイリー・

了解しました。回答を編集しました。Integerオブジェクトをインクリメントすると、メソッドのドキュメントのplayerID++ようにplayerID = Integer.valueOf( playerID.intValue() + 1)なります。このメソッドは、常に-128から127までの範囲の値をキャッシュします。
HamzaBelmellouki19年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.