【问题标题】:Increment a Integer's int value?增加一个整数的 int 值?
【发布时间】:2011-04-18 10:16:30
【问题描述】:

如何在 Java 中增加整数的值?我知道我可以用 intValue 获取值,我可以用 new Integer(int i) 设置它。

playerID.intValue()++;

似乎不起作用。

注意:PlayerID 是一个整数,创建时使用:

Integer playerID = new Integer(1);

【问题讨论】:

  • 你为什么使用整数而不是整数?
  • @naiad 对我来说,这通常是因为您不能将原始类型用作 Java 中的泛型参数。

标签: java class integer int


【解决方案1】:

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

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

【讨论】:

  • 如果你必须使用非原始int,并且你想要可变性,你可以试试commons MutableInt commons.apache.org/lang/api-2.4/org/apache/commons/lang/mutable/…
  • 谢谢,但由于某种原因,它仍然没有增加。也许这是我的代码中的一个错误......
  • @William :据我所知,它只会在增加它的方法中增加。
  • 不要使用 Integer 的构造函数。
  • @Grodriguez:也许,虽然即使那样我还是建议Integer.valueOf(int)...我根本不喜欢在答案中使用不良做法的想法,这可能会导致人们认为他们'可以做。我还认为,对于 OP 来说,意识到他可以以同样的方式使用他在 intInteger 上使用的操作是很有用的。
【解决方案2】:

整数对象是不可变的。您无法更改对象本身持有的整数的值,但您可以创建一个新的 Integer 对象来保存结果:

Integer start = new Integer(5);
Integer end = start + 5; // end == 10;

【讨论】:

    【解决方案3】:

    您可以使用 IntHolder 作为 Integer 的可变替代品。但值得吗?

    【讨论】:

      【解决方案4】:

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

      附带说明,永远不要调用Integer 的构造函数。通过直接将ints 分配给Integers 来利用自动装箱,例如Integer foo = 5。这将透明地使用Integer.valueOf(int),这优于构造函数,因为它并不总是必须创建新对象。

      【讨论】:

        【解决方案5】:

        对于 Java 7,增量运算符 '++' 适用于整数。下面是一个经过测试的例子

            Integer i = new Integer( 12 );
            System.out.println(i); //12
            i = i++;
            System.out.println(i); //13
        

        【讨论】:

        • 但请注意,其他对i = new Integer(12) 的引用仍将引用12,而不是13...很容易被这个绊倒
        • 是的,这就是为什么您必须将值重新分配给整数对象:i = i++
        • i = i++i++ 不同。从技术上讲,++ 并不能真正适用于整数,因为如果不将结果分配给某些东西,您就无法单独使用它。
        • 您不必重新分配!看:整数 foo = 5;整数 bar = foo;富++; System.out.println("foo: " + foo + " bar: " + bar);输出:foo:6 bar:5
        【解决方案6】:

        AtomicInteger

        也许这也有一些价值:有一个名为 AtomicInteger 的 Java 类。

        这个类有一些有用的方法,如addAndGet(int delta)incrementAndGet()(以及它们的对应物),它们允许您增加/减少同一实例的值。尽管该类旨在用于concurrency 的上下文中,但它在其他场景中也非常有用,并且可能符合您的需求。

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

        【讨论】:

        • 这就是我想要的!这对于通过引用调用整数非常有用。
        【解决方案7】:

        也许你可以试试:

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

        【讨论】:

          【解决方案8】:

          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)。大多数其他答案只证明了这两个概念之一。
          【解决方案9】:

          所有原始包装对象都是不可变的。

          我可能迟到了这个问题,但我想补充并澄清,当你这样做 playerID++ 时,真正发生的事情是这样的:

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

          Integer.valueOf(int) 将始终缓存 -128 到 127(含)范围内的值,并且可能缓存此范围之外的其他值。

          【讨论】:

          • 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 范围内的字符,或者 -128 和 127(含)之间的 int 或短数字,则让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 范围内的值(含)。
          猜你喜欢
          • 2016-07-02
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2011-03-07
          • 1970-01-01
          • 2016-05-24
          • 1970-01-01
          • 2012-04-21
          相关资源
          最近更新 更多