为什么下面提到的代码打印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)
由于参考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的值.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |