Збільшити значення int цілого числа?


81

Як збільшити ціле число в Java? Я знаю, що можу отримати значення за допомогою intValue, і можу встановити його за допомогою нового Integer (int i).

playerID.intValue()++;

здається, не працює.

Примітка: PlayerID - це ціле число, яке було створено за допомогою:

Integer playerID = new Integer(1);

7
Чому ви використовуєте цілі числа замість ints?
amara

5
@naiad Для мене це зазвичай тому, що ви не можете використовувати примітивні типи як загальні аргументи в Java.
Steve Blackwell

Відповіді:


100

Integerоб'єкти незмінні, тому ви не зможете змінити значення після їх створення. Вам потрібно буде створити новий Integerі замінити існуючий.

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

4
Якщо вам потрібно використовувати не примітивний int, і ви хочете змінити, ви можете спробувати commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
Джоель,

спасибі, але з якихось причин це все одно не збільшується. Можливо, це помилка в моєму коді ...
Вільям

1
@William: Як я знаю, його буде збільшувати лише за методом, який його збільшує.
Stan Kurilin

13
Не використовуйте конструктор Integer.
ColinD

2
@Grodriguez: Можливо, хоча навіть тоді я б запропонував Integer.valueOf(int)... Мені взагалі не подобається ідея використовувати погані практики у відповідях, це може призвести до того, що люди думають, що вони в порядку робити. Я також вважаю, що для ОП корисно усвідомити, що він може використовувати операції, які він використовував би з a intз Integerтаким же чином.
ColinD

49

Як каже Гродрігес, Integerпредмети незмінні. Проблема в тому, що ви намагаєтесь збільшити intзначення ідентифікатора гравця, а не самого ідентифікатора. У Java 5+ ви можете просто писати playerID++.

Як додаткове зауваження, ніколи не викликайте Integerконструктор. Скористайтеся Autoboxing, просто призначаючи intз до Integerз безпосередньо, як Integer foo = 5. Це буде використовувати Integer.valueOf(int)прозоро, що перевершує конструктор, оскільки не завжди потрібно створювати новий об’єкт.


14

AtomicInteger

Можливо, це теж варто чогось: існує клас Java, який називається AtomicInteger.

Цей клас має кілька корисних методів, таких як addAndGet(int delta)або incrementAndGet()(та їх аналоги), які дозволяють збільшувати / зменшувати значення того самого екземпляра. Хоча клас розроблений для використання в контексті одночасності , він також досить корисний в інших сценаріях і, ймовірно, відповідає вашим потребам.

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

13

Java 7 і 8. Інкремент НЕ змінює посилання, тому посилається на інший об’єкт Integer. Подивіться:

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

Ціле число само по собі все ще незмінне.


Це найкраща відповідь IMHO, оскільки вона демонструє ++iфункцію (на змінну i; зверніть увагу, що ви могли б i++також писати) та Integerнезмінність класу (на змінну iOrig). Більшість інших відповідей демонструють лише одне з двох понять.
Julien Kronegg

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)все одно будуть посилатися 12, не 13... легко
спокуситися

1
так ось чому вам доведеться перепризначити значення цілочисельному об’єкту: i = i ++
samsamara

2
i = i++не те саме, що i++. Технічно, ++насправді це не працює на цілі числа, я б сказав, оскільки ви не можете використовувати його самостійно, не присвоївши чомусь результат.
Саймон Форсберг

1
не потрібно перепризначати! погляд: Ціле число foo = 5; Цілочисельний рядок = foo; foo ++; System.out.println ("foo:" + foo + "bar:" + bar); виходи: foo: 6 bar: 5
clemep

4

Можливо, ви можете спробувати:

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


1

Усі примітивні обгорткові об'єкти незмінні.

Можливо, я запізнився з питанням, але я хочу додати та пояснити, що коли ви це робите playerID++, насправді відбувається приблизно таке:

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

Integer.valueOf (int) завжди кешує значення в діапазоні від -128 до 127 включно, і може кешувати інші значення поза цим діапазоном.


1
playerID = Integer.valueOf (playerID.intValue () + 1); Новий об'єкт Integer створюється не завжди. Характеристика автобоксу : docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 Якщо значення p, яке вводиться в поле, є істинним, хибним, байтом або символом у полі діапазон \ u0000 до \ u007f, або int або коротке число між -128 і 127 (включно), то нехай r1 і r2 є результатами будь-яких двох боксерських перетворень p. Завжди буває так, що r1 == r2. Оскільки Java 7, docs.oracle.com/javase/specs/jls/se7/html / ... також відноситься і до ++ оператор
Gary

Зрозумів, відповідь відредаговано. Збільшення об'єкта Integer playerID++призводить до чогось подібного playerID = Integer.valueOf( playerID.intValue() + 1)і відповідно до документів методу: Цей метод завжди кешує значення в діапазоні від -128 до 127 включно.
Хамза Белмеллукі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.