我是Java的新手。我编写了以下程序并得到了下面的输出。
输出:
1
a out =
x = 0 1测试..
x = 1 1拿到..
如果字符串是不可变的,为什么我显然可以将“thisCycle”的值从“0”更改为“1”并打印出新的字符串值? 为什么我在“for”循环中获得2行输出? 为什么第一个字符串附加了2个句点?
由于
import java.util.ArrayList;
public class Main {
/**
* @param args
*/
private static final ArrayList<String> ListContents=new ArrayList<String>();
public static void main(String[] args) {
// TODO Auto-generated method stub
String thisCycle="Cycle";
thisCycle="0";
// advance to next cycle
if (thisCycle.equals("0")) thisCycle="1";
System.out.println(thisCycle);
//
String a1="test";
String a2="gotcha";
ListContents.add(a1);
ListContents.add(a2);
StringBuilder a_out=new StringBuilder("");
System.out.println("a out="+a_out);
for(int x=0;ListContents.size()>x;x++) {
a_out.delete(0, a_out.length()+1);
if (thisCycle.equals("0")) a_out.append(ListContents.get(x)).append(". ");
if (thisCycle.equals("1")) a_out.append(ListContents.get(x)).append(".. ");
System.out.println("x="+x+" "+thisCycle+" "+a_out);
}
}
}
答案 0 :(得分:1)
字符串本身是不可变的,但是您要更改变量的String值,而不是String本身。这是一个重要的区别 - Java中的所有内容都是通过引用完成的。
你有两行输出,因为循环执行两次,因为你在ListContents中有两个元素。
答案 1 :(得分:0)
字符串是不可变的。你正在改变参考。
String thisCycle="Cycle";
thisCycle="0"; // <-- changes the thisCycle reference.
为防止这种情况,请将String
标记为最终。
final String thisCycle="Cycle";
thisCycle="0"; // <-- compiler error. Can't change a final reference.
你得到两行输出,因为你的ListContents
包含两个字符串。最后,你得到了两个句号因为这个
if (thisCycle.equals("0")) thisCycle="1"; // <-- changes "0" to "1"
答案 2 :(得分:0)
是的,这需要一点点思考来解决问题。
这样想。变量名有点像标签,可以放在盒子上;变量的内容是框中的任何内容。一个不可变的对象意味着一旦你拿到了盒子并放入了一些东西,那么盒子就会被密封:你可以查看它内部,但是你无法改变内容。
您在代码中执行的操作正在改变String
变量所指向的内容;换句话说,不是改变盒子的内容,而是获得一个新盒子,将修改后的内容放在那里,然后将标签移动到新盒子上。旧盒子包含它一直以来所做的一切(它是不可变的);但标签现在位于新框中,任何访问该变量的尝试都将导致查看新框。