增加整数的int值?


81

如何在Java中增加Integer的值?我知道我可以使用intValue获取值,也可以使用新的Integer(int i)进行设置。

playerID.intValue()++;

似乎不起作用。

注意:PlayerID是使用以下内容创建的整数:

Integer playerID = new Integer(1);

7
为什么要使用整数而不是整数?
amara 2010年

5
@naiad对我来说,通常是因为您不能将原始类型用作Java中的泛型参数。
史蒂夫·布莱克韦尔 Steve Blackwell)

Answers:


100

Integer对象是不可变的,因此一旦创建它们就无法修改该值。您将需要创建一个新的Integer并替换现有的。

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

4
如果您必须使用非原始int且想要可变性,则可以尝试使用Commons MutableIntcommons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…–
Joel

谢谢,但是由于某种原因,它仍然没有增加。也许这是我代码中的错误...
William

1
@William:据我所知,它只会在增加它的方法中增加。
斯坦·库里林

13
不要使用Integer的构造函数。
ColinD

2
@Grodriguez:也许,尽管即使如此,我仍然建议Integer.valueOf(int)……我完全不喜欢在答案中使用不良做法的想法,这可能导致人们认为他们可以做。我还认为,让OP意识到他可以以相同的方式使用与anint一起使用的操作,这很有用Integer
ColinD

49

正如Grodriguez所说,Integer对象是不可变的。这里的问题是您试图增加int玩家ID的值,而不是ID本身。在Java 5+中,您只需编写即可playerID++

附带说明,永远不要调用Integer的构造函数。只需将s直接分配给int即可利用自动装箱的优势。这将透明地使用,这优于构造方法,因为它不必总是创建新对象。IntegerInteger foo = 5Integer.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);
}

整数本身仍然是不可变的。


这是恕我直言的最佳答案,因为它演示了++i功能(在变量上i;请注意,您也可能写过i++)和Integer类的不变性(在变量上iOrig)。大多数其他答案仅说明了两种概念之一。
朱利安·克朗格

13

AtomicInteger

也许这也很有价值:有一个Java类叫做AtomicInteger

此类具有一些有用的方法,例如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,增量运算符'++'适用于Integers。以下是经过测试的示例

    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,2016年

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


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,字节或char中的char范围\ u0000到\ u007f,或者-128到127(包括-128)之间的整数或短数,则令r1和r2为p的任何两次装箱转换的结果。r1 == r2总是这样。由于Java 7,docs.oracle.com/javase/specs/jls/se7/html/...也适用于++运算符
加里

知道了,答案已编辑。根据该方法的文档,增加Integer对象将playerID++产生类似的结果playerID = Integer.valueOf( playerID.intValue() + 1):此方法将始终缓存-128至127(包括)范围内的值。
Hamza Belmellouki
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.