Увеличаване на int стойността на Integer?

Как да увелича стойността на Integer в Java? Знам, че мога да получа стойността с intValue и мога да я задам с new Integer(int i).

playerID.intValue()++;

изглежда не работи.

Забележка: PlayerID е цяло число, което е създадено с:

Integer playerID = new Integer(1);

person William    schedule 28.09.2010    source източник
comment
Защо използвате Integers вместо ints?   -  person amara    schedule 28.09.2010
comment
@naiad За мен обикновено е, защото не можете да използвате примитивни типове като общи аргументи в Java.   -  person Steve Blackwell    schedule 01.12.2015


Отговори (9)


Integer обектите са неизменни, така че не можете да промените стойността, след като са били създадени. Ще трябва да създадете нов Integer и да замените съществуващия.

playerID = new Integer(playerID.intValue() + 1);
person Grodriguez    schedule 28.09.2010
comment
Ако трябва да използвате непримитивен int и искате променливост, можете да опитате commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/ - person Joel; 28.09.2010
comment
благодаря, но по някаква причина все още не се увеличава. Може би е грешка в моя код... - person William; 28.09.2010
comment
@William: Както знам, той ще бъде увеличен само в метод, който го увеличава. - person Stan Kurilin; 28.09.2010
comment
Не използвайте конструктора на Integer. - person ColinD; 28.09.2010
comment
@ColinD: Вярвам, че изписването по този начин улеснява разбирането какво всъщност се случва. - person Grodriguez; 28.09.2010
comment
@Grodriguez: Може би, въпреки че дори тогава бих предложил Integer.valueOf(int)... Изобщо не ми харесва идеята за използване на лоши практики в отговорите, това може да накара хората да си помислят, че е добре да се правят. Също така мисля, че е полезно за OP да осъзнае, че може да използва операции, които би използвал с int с Integer по същия начин. - person ColinD; 28.09.2010
comment
@ColinD: може ли да накара хората да си помислят, че е добре да го правят? Съжалявам, но е добре да използвате конструктора, въпреки че Integer.valueOf(int) е по-добър. Фактът, че има по-добри алтернативи (когато са налични -- имайте предвид, че някои хора все още са заседнали в среди преди 1.5 по различни причини) не означава, че използването на конструктора е лоша практика. И все още вярвам, че отговорът ми беше по-ясен, както го написах. - person Grodriguez; 29.09.2010

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

Като странична бележка, никога не извиквайте конструктора на Integer. Възползвайте се от автоматичното поставяне в кутия, като просто присвоите ints на Integers директно, като Integer foo = 5. Това ще използва Integer.valueOf(int) прозрачно, което е по-добро от конструктора, защото не винаги трябва да създава нов обект.

person ColinD    schedule 28.09.2010

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

Самото цяло число все още е неизменно.

person vitvlkv    schedule 29.01.2018
comment
Това е IMHO най-добрият отговор, тъй като демонстрира функцията ++i (върху променлива i; имайте предвид, че бихте могли да напишете и i++) и неизменността на класа Integer (върху променлива iOrig). Повечето други отговори показват само едно от двете понятия. - person Julien Kronegg; 01.04.2018

AtomicInteger

Може би това също има някаква стойност: има Java клас, наречен AtomicInteger.

Този клас има някои полезни методи като addAndGet(int delta) или incrementAndGet() (и техните двойници), които ви позволяват да увеличавате/намалявате стойността на същия екземпляр. Въпреки че класът е проектиран да се използва в контекста на конкурентност, той също е доста полезен в други сценарии и вероятно отговаря на вашите нужди.

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

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

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;
person RHSeeger    schedule 28.09.2010

За Java 7 операторът за нарастване '++' работи с цели числа. По-долу е тестван пример

    Integer i = new Integer( 12 );
    System.out.println(i); //12
    i = i++;
    System.out.println(i); //13
person samsamara    schedule 16.03.2015
comment
Но имайте предвид, че други препратки към i = new Integer(12) пак ще се отнасят до 12, а не до 13... лесно можете да се спънете в тази - person vikingsteve; 15.01.2016
comment
да, затова трябва да присвоите отново стойността на целочисления обект: i = i++ - person samsamara; 15.01.2016
comment
i = i++ не е същото като i++. Технически, ++ наистина не работи с цели числа, бих казал, тъй като не можете да го използвате самостоятелно, без да присвоите резултата на нещо. - person Simon Forsberg; 14.05.2017
comment
не е нужно да преназначавате! погледнете: Цяло число foo = 5; Цяла лента = foo; foo++; System.out.println(foo: + foo + bar: + bar); изходи: foo: 6 бара: 5 - person clemep; 12.02.2018

Може би можете да опитате:

final AtomicInteger i = new AtomicInteger(0);
i.set(1);
i.get();
person fantouch    schedule 11.07.2017

Можете да използвате IntHolder като променлива алтернатива на Integer. Но струва ли си?

person Stan Kurilin    schedule 28.09.2010

Всички примитивни обвиващи обекти са неизменни.

Може би съм закъснял с въпроса, но искам да добавя и поясня, че когато направите playerID++, това, което наистина се случва, е нещо подобно:

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

Integer.valueOf(int) винаги ще кешира стойности в диапазона от -128 до 127 включително и може да кешира други стойности извън този диапазон.

person Hamza Belmellouki    schedule 19.08.2019
comment
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, байт или знак в диапазона \ u0000 до , или int или кратко число между -128 и 127 (включително), тогава нека r1 и r2 са резултатите от всеки две боксови преобразувания на p. Винаги е така, че r1 == r2. От Java 7, документи. oracle.com/javase/specs/jls/se7/html/ се отнася и за оператора ++ - person gary; 14.11.2019
comment
Разбрах, отговорът е редактиран. Увеличаването на обекта Integer playerID++ води до нещо като playerID = Integer.valueOf( playerID.intValue() + 1) и според документите на метода: Този метод винаги ще кешира стойности в диапазона от -128 до 127 включително. - person Hamza Belmellouki; 15.11.2019