Увеличить целое значение int?

81

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

playerID.intValue()++;

похоже не работает.

Примечание. PlayerID - это целое число, которое было создано с помощью:

Integer playerID = new Integer(1);
Уильям
источник
7
Почему вы используете целые числа вместо целых?
Amara
5
@naiad Для меня это обычно потому, что вы не можете использовать примитивные типы в качестве общих аргументов в Java.
Стив Блэквелл

Ответы:

100

Integerобъекты неизменяемы, поэтому вы не можете изменять значение после их создания. Вам нужно будет создать новый Integerи заменить существующий.

playerID = new Integer(playerID.intValue() + 1);
Гродригес
источник
4
Если вам необходимо использовать непримитивный тип
Джоэл,
спасибо, но по какой-то причине он все еще не увеличивается. Может быть, это ошибка в моем коде ...
Уильям
1
@William: Как я знаю, он будет увеличиваться только в методе, который его увеличивает.
Стэн Курилин
13
Не используйте конструктор Integer.
ColinD
2
@Grodriguez: Возможно, хотя даже тогда я бы предложил Integer.valueOf(int)... Мне вообще не нравится идея использовать плохие методы в ответах, это может привести к тому, что люди будут думать, что с ними можно поступать. Я также думаю, что OP полезно понять, что он может использовать операции, которые он использовал бы intс an Integerтаким же образом.
ColinD
49

Как говорит Гродригес, Integerобъекты неизменны. Проблема здесь в том, что вы пытаетесь увеличить intзначение идентификатора игрока, а не самого идентификатора. В Java 5+ вы можете просто написать playerID++.

Кстати, никогда не вызывайте Integerконструктор. Воспользуйтесь Autoboxing, просто назначая intс до Integerс непосредственно, как Integer foo = 5. Это будет использоваться Integer.valueOf(int)прозрачно, что превосходит конструктор, потому что не всегда нужно создавать новый объект.

ColinD
источник
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);
}

Целое число само по себе остается неизменным.

Vitvlkv
источник
Это ИМХО лучший ответ, поскольку он демонстрирует ++iфункцию (для переменной i; обратите внимание, что вы тоже могли написать i++) и Integerнеизменность класса (для переменной iOrig). Большинство других ответов демонстрируют только одно из двух понятий.
Жюльен Кронегг 01
7

Целочисленные объекты неизменяемы. Вы не можете изменить значение целого числа, содержащегося в самом объекте, но вы можете просто создать новый объект Integer для хранения результата:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;
RHSeeger
источник
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; Целочисленный bar = 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();
fantouch
источник
3

Вы можете использовать IntHolder как изменяемую альтернативу Integer. Но стоит ли?

Стэн Курилин
источник
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 равно true, false, байт или символ в range \ u0000 to \ 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 включительно.
Hamza Belmellouki