Integer의 int 값을 늘리시겠습니까?


81

Java에서 정수 값을 어떻게 증가합니까? intValue로 값을 얻을 수 있고 new Integer (int i)로 설정할 수 있다는 것을 알고 있습니다.

playerID.intValue()++;

작동하지 않는 것 같습니다.

참고 : PlayerID는 다음으로 생성 된 정수입니다.

Integer playerID = new Integer(1);

7
int 대신 Integer를 사용하는 이유는 무엇입니까?
amara

5
@naiad 저에게는 일반적으로 Java에서 기본 유형을 일반 인수로 사용할 수 없기 때문입니다.
Steve Blackwell 2015

답변:


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/…을
Joel

감사합니다.하지만 어떤 이유에서인지 여전히 증가하지 않습니다. 내 코드의 버그 일 수도 있습니다 ...
William

1
@William : 내가 아는 것처럼 그것을 증가시키는 방법에서만 증가합니다.
Stan Kurilin

13
Integer의 생성자를 사용하지 마십시오.
ColinD

2
@Grodriguez : 아마도 그때에도 나는 제안하고 싶지만 Integer.valueOf(int)... 나는 대답에 나쁜 관행을 사용한다는 생각이 전혀 마음에 들지 않습니다. 나는 또한 영업 이익은 그가와 그가 사용하는 거라고 작업을 사용할 수 있습니다 것을 깨닫게하는 것이 유용하다고 생각 intInteger같은 방식으로.
ColinD

49

Grodriguez가 말했듯이 Integer객체는 불변입니다. 여기서 문제 int는 ID 자체가 아니라 플레이어 ID 의 값 을 증가 시키려고한다는 것입니다. Java 5+에서는 playerID++.

참고로 Integer의 생성자를 절대 호출하지 마십시오 . s와 같이 ints를 Integers에 직접 할당하여 오토 박싱을 활용하십시오 Integer foo = 5. 이것은 Integer.valueOf(int)항상 새로운 객체를 생성 할 필요가 없기 때문에 생성자보다 우수합니다.


13

Java 7 및 8. Increment는 참조를 변경하므로 다른 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

13

AtomicInteger

아마도 이것은 가치가있을 것입니다 AtomicInteger. 라는 Java 클래스가 있습니다.

이 클래스에는 같은 인스턴스의 값을 증가 / 감소시킬 수있는 addAndGet(int delta)또는 incrementAndGet()(및 해당 대응)와 같은 유용한 메서드가 있습니다. 이 클래스는 동시성 컨텍스트에서 사용되도록 설계되었지만 다른 시나리오에서도 매우 유용하며 아마도 귀하의 필요에 맞을 것입니다.

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

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... 쉽게이 일에 난처하게 얻을
vikingsteve

1
당신은 정수 객체에 값을 할당해야하는 이유 이잖아 그래 : 난 = 내가 ++
samsamara

2
i = i++과 같지 않습니다 i++. 기술적으로 ++는 결과를 무언가에 할당하지 않고는 단독으로 사용할 수 없기 때문에 내가 말하고 싶은 정수에는 실제로 작동하지 않습니다.
Simon Forsberg

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

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 boxing되는 값 p가 true, false, byte 또는 char 인 경우 범위 \ u0000에서 \ u007f 또는 -128에서 127 (포함) 사이의 int 또는 짧은 숫자 인 경우 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.