1

JavaにIntegerのスタックがあり、最初にポップせずに「最後にプッシュされたアイテム」を1つインクリメントする他の方法があることを知りたいです。

私の現在の解決策は

Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);   // Increment 2 to 3
Integer last = stack.pop();
stack.push(last+1);

次のことを試しましたが、機能しません

Integer last = stack.peek();
last+=1;

lastはスタック内の最後の要素への参照であり、インクリメントされたため、機能すると思いました。

4

3 に答える 3

8

Javaでは、Integerクラスは不変です。つまり、Integerオブジェクトを変更することはできません。これ:

last += 1;

本当にこれの省略形です:

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

つまり、実際には、前のインスタンスの値よ​​り1つ大きい値を持つ別の インスタンスを作成(または取得)します。IntegerInteger

スタックの最上位にあるオブジェクトを変更できるようにする場合は、可変オブジェクトをスタックに配置する必要があります。IntWrapperそのために独自のまたはIntHolderまたはMutableIntegerクラスを作成できます。(ただし、これは特にお勧めしません。)

于 2013-02-12T23:30:22.623 に答える
2

last+=1;別のオブジェクトを割り当てますlast。したがって、スタックは操作されません。

于 2013-02-12T23:29:05.027 に答える
1

org.apache.commons.lang3.mutable.MutableLongそのためには、またはなどの可変の長いオブジェクトが必要ですjava.util.concurrent.atomic.AtomicLong。その後、それを変更することができます

stack.peek().increment();
于 2013-02-12T23:43:12.400 に答える