Java内存引用问题

Ani*_*rma 2 java

为什么下面提到的代码打印4,3,2,1,0,为什么不打印4,4,4,4,4.由于引用sb是相同的,所以为什么不指向最后更新的值,为什么不将所有值更新为4

package iteration;

import java.util.Stack;

public class test {

    public static void main(String[] args) {
        Stack stack = new Stack();
        StringBuilder sb;
        for (int i = 0; i < 5; i++) {
             sb = new StringBuilder();
            sb.append(i);
            stack.add(sb);
        }

        for (int i = 0; i < 5; i++) {
            System.out.println(stack.pop());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 7

由于参考sb是相同的

不是.你每次都在使用sb 变量,但是每次调用stack.add(sb)它时都会添加"当前值sb",由于这一行,每次迭代都会有不同的变化:

sb = new StringBuilder();
Run Code Online (Sandbox Code Playgroud)

理解"变量"和"变量当前持有的值"之间的区别非常重要.

执行时stack.add(sb);,它会计算当前值sb(它将是对StringBuilder实例的引用),然后将该引用传递给Stack.add.当您稍后更改值时sb,不会更改堆栈上的值.

现在,将其与此代码进行比较:

StringBuilder sb = new StringBulder();
for (int i = 0; i < 5; i++) {
    sb.append(i);
    stack.add(sb);
}
Run Code Online (Sandbox Code Playgroud)

此时,您StringBuilder对堆栈中的同一对象有5个引用,并且您将打印出"01234"五次.这次你要修改现有对象的内容,而不是改变它sb的值.