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.