Bir Tamsayının int değeri artırılsın mı?


81

Java'da bir Tamsayı değerini nasıl artırabilirim? Değeri intValue ile alabileceğimi biliyorum ve bunu yeni Tamsayı (int i) ile ayarlayabilirim.

playerID.intValue()++;

işe yaramıyor gibi görünüyor.

Not: PlayerID, aşağıdakilerle oluşturulmuş bir Tamsayıdır:

Integer playerID = new Integer(1);

7
Neden tamsayılar yerine Tamsayılar kullanıyorsunuz?
amara

5
@naiad Benim için bunun nedeni genellikle Java'da genel argümanlar olarak ilkel türleri kullanamaman.
Steve Blackwell

Yanıtlar:


100

Integernesneler değişmezdir, bu nedenle oluşturulduktan sonra değeri değiştiremezsiniz. Yeni bir tane oluşturmanız Integerve mevcut olanı değiştirmeniz gerekecektir .

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

4
İlkel olmayan bir int kullanmanız gerekiyorsa ve değişkenlik istiyorsanız, commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Joel

teşekkürler, ama nedense hala artmıyor. Belki kodumdaki bir hatadır ...
William

1
@William: Bildiğim gibi, sadece onu artıran yöntemle artırılacak.
Stan Kurilin

13
Tamsayının yapıcısını kullanmayın.
ColinD

2
@Grodriguez: Belki o zaman bile öneriyor Integer.valueOf(int)olsam da ... Cevaplarda kötü uygulamaları kullanma fikrinden hiç hoşlanmıyorum, insanların yapabileceklerini düşünmelerine neden olabilir. Ayrıca OP o bir ile o kullanmayı tercih ediyorum işlemleri kullanabilirsiniz fark için daha kullanışlı olduğunu düşünüyorum intbir ile Integeraynı şekilde.
ColinD

49

Grodriguez'in dediği gibi, Integernesneler değişmezdir. Buradaki sorun int, kimliğin kendisinden ziyade oyuncu kimliğinin değerini artırmaya çalışmanızdır . Java 5+ ile yazabilirsiniz playerID++.

Bir yan not olarak, asla kurucuyu çağırmayın Integer. Sadece atayarak Autoboxing yararlanın intiçin s Integergibi doğrudan s Integer foo = 5. Bu Integer.valueOf(int)şeffaf bir şekilde kullanılacaktır , bu da kurucuya göre daha üstündür çünkü her zaman yeni bir nesne oluşturmak zorunda değildir.


14

AtomicInteger

Belki bunun da bir değeri var: adında bir Java sınıfı var AtomicInteger.

Bu sınıf, aynı örneğin değerini artırmanıza / azaltmanıza izin veren addAndGet(int delta)veya incrementAndGet()(ve bunların karşılıkları) gibi bazı yararlı yöntemlere sahiptir . Sınıf eşzamanlılık bağlamında kullanılmak üzere tasarlanmış olsa da, diğer senaryolarda da oldukça kullanışlıdır ve muhtemelen ihtiyacınıza uyar.

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

13

Java 7 ve 8. Artış referansı değiştirir, böylece başka bir Tamsayı nesnesine başvurur. Bak:

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

Tamsayı kendi başına hala değişmezdir.


Bu, ++iişlevi (değişken üzerinde i; yazmış olabileceğinizi unutmayın i++) ve Integersınıfın değişmezliğini (değişken üzerinde iOrig) gösterdiği için IMHO en iyi cevaptır . Diğer cevapların çoğu, iki kavramdan yalnızca birini gösterir.
Julien Kronegg

7

Tamsayı nesneler değişmezdir. Nesnenin kendisi tarafından tutulan tamsayının değerini değiştiremezsiniz, ancak sonucu tutmak için yeni bir Tamsayı nesnesi oluşturabilirsiniz:

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

6

Java 7 için, artırma operatörü '++' Tamsayılar üzerinde çalışır. Aşağıda test edilmiş bir örnek bulunmaktadır

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

2
Ancak, diğer referansların i = new Integer(12)yine de atıfta bulunacağını 12unutmayın 13, bu konuda
takılmak

1
evet, bu yüzden değeri tamsayı nesnesine yeniden atamanız gerekiyor: i = i ++
samsamara

2
i = i++ile aynı değil i++. Teknik olarak, ++sonucu bir şeye atamadan kendi başına kullanamayacağınız için tamsayılar üzerinde gerçekten çalışmaz.
Simon Forsberg

1
yeniden atamanıza gerek yok! görünüm: Tamsayı foo = 5; Tamsayı çubuğu = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); çıkışlar: foo: 6 bar: 5
clemep

4

Belki deneyebilirsin:

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

3

IntHolder'ı Tamsayıya değişken bir alternatif olarak kullanabilirsiniz. Ama buna değer mi?


1

Tüm ilkel sarmalayıcı nesneler değişmezdir.

Belki soruya geç kaldım ama şunu eklemek ve açıklığa kavuşturmak istiyorum, bunu yaptığınızda playerID++, gerçekte olan şey şuna benzer:

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

Integer.valueOf (int) , -128 ile 127 arasındaki değerleri her zaman önbelleğe alır ve bu aralığın dışındaki diğer değerleri önbelleğe alabilir .


1
playerID = Integer.valueOf (playerID.intValue () + 1); Yeni bir tamsayı nesne olduğunu değil , her zaman yarattı. Otomatik kutulama özelliği: docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 Kutulanan p değeri true, false, bir bayt veya aralık \ u0000 ila \ u007f veya -128 ile 127 (dahil) arasında bir tam sayı veya kısa sayı, ardından r1 ve r2, p'nin herhangi iki boks dönüşümünün sonucu olsun. Her zaman r1 == r2 durumudur. Java 7'den beri, docs.oracle.com/javase/specs/jls/se7/html/… ayrıca ++ operatörü için de geçerlidir
gary

Anladım, cevap düzenlendi. Integer nesnesinin artırılması , yöntemin belgelerine playerID++benzer playerID = Integer.valueOf( playerID.intValue() + 1)ve bunlara göre sonuçlanır : Bu yöntem her zaman -128 ile 127 arasındaki değerleri önbelleğe alacaktır.
Hamza Belmellouki
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.